summaryrefslogtreecommitdiff
path: root/boost
diff options
context:
space:
mode:
Diffstat (limited to 'boost')
-rw-r--r--boost/align.hpp2
-rw-r--r--boost/align/align.hpp2
-rw-r--r--boost/align/aligned_alloc.hpp2
-rw-r--r--boost/align/aligned_allocator.hpp24
-rw-r--r--boost/align/aligned_allocator_adaptor.hpp12
-rw-r--r--boost/align/aligned_allocator_adaptor_forward.hpp6
-rw-r--r--boost/align/aligned_allocator_forward.hpp6
-rw-r--r--boost/align/aligned_delete.hpp8
-rw-r--r--boost/align/aligned_delete_forward.hpp6
-rw-r--r--boost/align/alignment_of.hpp6
-rw-r--r--boost/align/alignment_of_forward.hpp6
-rw-r--r--boost/align/assume_aligned.hpp4
-rw-r--r--boost/align/detail/address.hpp12
-rw-r--r--boost/align/detail/addressof.hpp8
-rw-r--r--boost/align/detail/align.hpp8
-rw-r--r--boost/align/detail/align_cxx11.hpp6
-rw-r--r--boost/align/detail/aligned_alloc.hpp6
-rw-r--r--boost/align/detail/aligned_alloc_android.hpp6
-rw-r--r--boost/align/detail/aligned_alloc_macos.hpp8
-rw-r--r--boost/align/detail/aligned_alloc_msvc.hpp6
-rw-r--r--boost/align/detail/aligned_alloc_posix.hpp6
-rw-r--r--boost/align/detail/aligned_alloc_sunos.hpp6
-rw-r--r--boost/align/detail/alignment_of.hpp19
-rw-r--r--boost/align/detail/alignment_of_clang.hpp8
-rw-r--r--boost/align/detail/alignment_of_codegear.hpp8
-rw-r--r--boost/align/detail/alignment_of_cxx11.hpp8
-rw-r--r--boost/align/detail/alignment_of_gcc.hpp8
-rw-r--r--boost/align/detail/alignment_of_msvc.hpp21
-rw-r--r--boost/align/detail/assume_aligned.hpp2
-rw-r--r--boost/align/detail/assume_aligned_clang.hpp8
-rw-r--r--boost/align/detail/assume_aligned_gcc.hpp2
-rw-r--r--boost/align/detail/assume_aligned_intel.hpp2
-rw-r--r--boost/align/detail/assume_aligned_msvc.hpp2
-rw-r--r--boost/align/detail/integral_constant.hpp22
-rw-r--r--boost/align/detail/is_aligned.hpp8
-rw-r--r--boost/align/detail/is_alignment.hpp8
-rw-r--r--boost/align/detail/is_alignment_constant.hpp8
-rw-r--r--boost/align/detail/max_align.hpp17
-rw-r--r--boost/align/detail/max_objects.hpp (renamed from boost/align/detail/max_count_of.hpp)14
-rw-r--r--boost/align/detail/max_size.hpp28
-rw-r--r--boost/align/detail/min_size.hpp8
-rw-r--r--boost/align/detail/offset_object.hpp26
-rw-r--r--boost/align/detail/remove_traits.hpp8
-rw-r--r--boost/align/is_aligned.hpp2
-rw-r--r--boost/aligned_storage.hpp127
-rw-r--r--boost/archive/archive_exception.hpp1
-rw-r--r--boost/archive/basic_binary_oprimitive.hpp8
-rw-r--r--boost/archive/detail/basic_iarchive.hpp6
-rw-r--r--boost/archive/detail/basic_iserializer.hpp6
-rw-r--r--boost/archive/detail/basic_oarchive.hpp10
-rw-r--r--boost/archive/detail/basic_oserializer.hpp6
-rw-r--r--boost/archive/detail/basic_pointer_iserializer.hpp6
-rw-r--r--boost/archive/detail/basic_pointer_oserializer.hpp6
-rw-r--r--boost/archive/detail/interface_oarchive.hpp4
-rw-r--r--boost/archive/detail/iserializer.hpp41
-rw-r--r--boost/archive/detail/polymorphic_iarchive_route.hpp4
-rw-r--r--boost/archive/detail/polymorphic_oarchive_route.hpp4
-rw-r--r--boost/archive/impl/xml_iarchive_impl.ipp52
-rw-r--r--boost/archive/iterators/head_iterator.hpp80
-rw-r--r--boost/archive/iterators/mb_from_wchar.hpp14
-rw-r--r--boost/archive/iterators/wchar_from_mb.hpp32
-rw-r--r--boost/archive/polymorphic_iarchive.hpp4
-rw-r--r--boost/archive/polymorphic_oarchive.hpp4
-rw-r--r--boost/archive/xml_archive_exception.hpp2
-rw-r--r--boost/asio/basic_serial_port.hpp2
-rw-r--r--boost/asio/detail/config.hpp39
-rw-r--r--boost/asio/detail/handler_type_requirements.hpp14
-rw-r--r--boost/asio/detail/impl/socket_ops.ipp12
-rw-r--r--boost/asio/detail/impl/win_event.ipp12
-rw-r--r--boost/asio/detail/impl/win_iocp_handle_service.ipp2
-rw-r--r--boost/asio/detail/impl/win_mutex.ipp5
-rw-r--r--boost/asio/detail/impl/win_static_mutex.ipp18
-rw-r--r--boost/asio/detail/impl/win_thread.ipp12
-rw-r--r--boost/asio/detail/local_free_on_block_exit.hpp2
-rw-r--r--boost/asio/detail/socket_types.hpp8
-rw-r--r--boost/asio/detail/thread.hpp8
-rw-r--r--boost/asio/detail/win_event.hpp4
-rw-r--r--boost/asio/detail/win_thread.hpp8
-rw-r--r--boost/asio/detail/winapi_thread.hpp124
-rw-r--r--boost/asio/ssl/impl/context.ipp16
-rw-r--r--boost/asio/ssl/old/detail/openssl_context_service.hpp8
-rw-r--r--boost/asio/version.hpp2
-rw-r--r--boost/assert.hpp9
-rw-r--r--boost/atomic/detail/atomic_flag.hpp6
-rw-r--r--boost/atomic/detail/atomic_template.hpp128
-rw-r--r--boost/atomic/detail/bitwise_cast.hpp (renamed from boost/atomic/detail/casts.hpp)31
-rw-r--r--boost/atomic/detail/caps_gcc_ppc.hpp2
-rw-r--r--boost/atomic/detail/config.hpp36
-rw-r--r--boost/atomic/detail/int_sizes.hpp4
-rw-r--r--boost/atomic/detail/operations_fwd.hpp3
-rw-r--r--boost/atomic/detail/ops_cas_based.hpp40
-rw-r--r--boost/atomic/detail/ops_emulated.hpp16
-rw-r--r--boost/atomic/detail/ops_extending_cas_based.hpp9
-rw-r--r--boost/atomic/detail/ops_gcc_alpha.hpp2
-rw-r--r--boost/atomic/detail/ops_gcc_arm.hpp2
-rw-r--r--boost/atomic/detail/ops_gcc_atomic.hpp15
-rw-r--r--boost/atomic/detail/ops_gcc_ppc.hpp379
-rw-r--r--boost/atomic/detail/ops_gcc_sparc.hpp27
-rw-r--r--boost/atomic/detail/ops_gcc_sync.hpp33
-rw-r--r--boost/atomic/detail/ops_gcc_x86.hpp4
-rw-r--r--boost/atomic/detail/ops_gcc_x86_dcas.hpp306
-rw-r--r--boost/atomic/detail/ops_linux_arm.hpp7
-rw-r--r--boost/atomic/detail/ops_msvc_arm.hpp4
-rw-r--r--boost/atomic/detail/ops_msvc_x86.hpp57
-rw-r--r--boost/atomic/detail/ops_windows.hpp1
-rw-r--r--boost/atomic/detail/platform.hpp8
-rw-r--r--boost/atomic/detail/storage_type.hpp138
-rw-r--r--boost/bind.hpp19
-rw-r--r--boost/bind/arg.hpp6
-rw-r--r--boost/bind/bind.hpp483
-rw-r--r--boost/bind/placeholders.hpp65
-rw-r--r--boost/chrono/detail/inlined/mac/chrono.hpp54
-rw-r--r--boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp2
-rw-r--r--boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp2
-rw-r--r--boost/chrono/duration.hpp3
-rw-r--r--boost/chrono/io/time_point_units.hpp15
-rw-r--r--boost/concept_check.hpp17
-rw-r--r--boost/config/compiler/clang.hpp22
-rw-r--r--boost/config/compiler/gcc.hpp20
-rw-r--r--boost/config/compiler/intel.hpp6
-rw-r--r--boost/config/compiler/sunpro_cc.hpp10
-rw-r--r--boost/config/compiler/visualc.hpp1
-rw-r--r--boost/config/platform/cloudabi.hpp18
-rw-r--r--boost/config/platform/macos.hpp2
-rw-r--r--boost/config/platform/win32.hpp8
-rw-r--r--boost/config/select_platform_config.hpp4
-rw-r--r--boost/config/stdlib/dinkumware.hpp11
-rw-r--r--boost/config/stdlib/libstdcpp3.hpp4
-rw-r--r--boost/config/suffix.hpp20
-rw-r--r--boost/container/adaptive_pool.hpp34
-rw-r--r--boost/container/allocator.hpp43
-rw-r--r--boost/container/allocator_traits.hpp2
-rw-r--r--boost/container/container_fwd.hpp40
-rw-r--r--boost/container/deque.hpp91
-rw-r--r--boost/container/detail/adaptive_node_pool.hpp1
-rw-r--r--boost/container/detail/alloc_lib.h122
-rw-r--r--boost/container/detail/alloc_lib_auto_link.hpp24
-rw-r--r--boost/container/detail/auto_link.hpp11
-rw-r--r--boost/container/detail/block_list.hpp139
-rw-r--r--boost/container/detail/block_slist.hpp157
-rw-r--r--boost/container/detail/config_begin.hpp1
-rw-r--r--boost/container/detail/copy_move_algo.hpp8
-rw-r--r--boost/container/detail/dispatch_uses_allocator.hpp293
-rw-r--r--boost/container/detail/dlmalloc.hpp103
-rw-r--r--boost/container/detail/flat_tree.hpp30
-rw-r--r--boost/container/detail/mutex.hpp4
-rw-r--r--boost/container/detail/pair.hpp72
-rw-r--r--boost/container/detail/pool_common_alloc.hpp12
-rw-r--r--boost/container/detail/pool_resource.hpp191
-rw-r--r--boost/container/detail/std_fwd.hpp30
-rw-r--r--boost/container/detail/tree.hpp37
-rw-r--r--boost/container/detail/type_traits.hpp2
-rw-r--r--boost/container/detail/variadic_templates_tools.hpp2
-rw-r--r--boost/container/detail/workaround.hpp21
-rw-r--r--boost/container/flat_map.hpp21
-rw-r--r--boost/container/flat_set.hpp6
-rw-r--r--boost/container/list.hpp111
-rw-r--r--boost/container/map.hpp6
-rw-r--r--boost/container/new_allocator.hpp4
-rw-r--r--boost/container/node_allocator.hpp24
-rw-r--r--boost/container/pmr/deque.hpp43
-rw-r--r--boost/container/pmr/flat_map.hpp63
-rw-r--r--boost/container/pmr/flat_set.hpp59
-rw-r--r--boost/container/pmr/global_resource.hpp66
-rw-r--r--boost/container/pmr/list.hpp43
-rw-r--r--boost/container/pmr/map.hpp63
-rw-r--r--boost/container/pmr/memory_resource.hpp101
-rw-r--r--boost/container/pmr/monotonic_buffer_resource.hpp180
-rw-r--r--boost/container/pmr/polymorphic_allocator.hpp166
-rw-r--r--boost/container/pmr/pool_options.hpp52
-rw-r--r--boost/container/pmr/resource_adaptor.hpp193
-rw-r--r--boost/container/pmr/set.hpp59
-rw-r--r--boost/container/pmr/slist.hpp43
-rw-r--r--boost/container/pmr/small_vector.hpp43
-rw-r--r--boost/container/pmr/stable_vector.hpp43
-rw-r--r--boost/container/pmr/string.hpp48
-rw-r--r--boost/container/pmr/synchronized_pool_resource.hpp138
-rw-r--r--boost/container/pmr/unsynchronized_pool_resource.hpp194
-rw-r--r--boost/container/pmr/vector.hpp43
-rw-r--r--boost/container/scoped_allocator.hpp452
-rw-r--r--boost/container/scoped_allocator_fwd.hpp31
-rw-r--r--boost/container/set.hpp9
-rw-r--r--boost/container/slist.hpp49
-rw-r--r--boost/container/small_vector.hpp17
-rw-r--r--boost/container/stable_vector.hpp86
-rw-r--r--boost/container/static_vector.hpp8
-rw-r--r--boost/container/string.hpp176
-rw-r--r--boost/container/uses_allocator.hpp169
-rw-r--r--boost/container/uses_allocator_fwd.hpp73
-rw-r--r--boost/container/vector.hpp284
-rw-r--r--boost/context/detail/config.hpp13
-rw-r--r--boost/context/detail/invoke.hpp56
-rw-r--r--boost/context/execution_context.ipp470
-rw-r--r--boost/context/execution_context_winfib.ipp407
-rw-r--r--boost/context/fixedsize_stack.hpp5
-rw-r--r--boost/context/posix/protected_fixedsize_stack.hpp2
-rw-r--r--boost/context/posix/segmented_stack.hpp3
-rw-r--r--boost/context/stack_context.hpp8
-rw-r--r--boost/context/windows/protected_fixedsize_stack.hpp4
-rw-r--r--boost/convert/base.hpp47
-rw-r--r--boost/convert/detail/forward.hpp1
-rw-r--r--boost/convert/detail/range.hpp29
-rw-r--r--boost/convert/spirit.hpp4
-rw-r--r--boost/convert/stream.hpp2
-rw-r--r--boost/convert/strtol.hpp21
-rw-r--r--boost/core/demangle.hpp11
-rw-r--r--boost/core/enable_if.hpp9
-rw-r--r--boost/coroutine/asymmetric_coroutine.hpp288
-rw-r--r--boost/coroutine/detail/symmetric_coroutine_call.hpp144
-rw-r--r--boost/coroutine/posix/protected_stack_allocator.hpp2
-rw-r--r--boost/coroutine/windows/protected_stack_allocator.hpp2
-rw-r--r--boost/coroutine2/detail/config.hpp12
-rw-r--r--boost/coroutine2/detail/pull_control_block.hpp33
-rw-r--r--boost/coroutine2/detail/pull_control_block.ipp221
-rw-r--r--boost/coroutine2/detail/pull_coroutine.hpp12
-rw-r--r--boost/coroutine2/detail/pull_coroutine.ipp15
-rw-r--r--boost/coroutine2/detail/push_control_block.hpp17
-rw-r--r--boost/coroutine2/detail/push_control_block.ipp212
-rw-r--r--boost/coroutine2/detail/push_coroutine.ipp7
-rw-r--r--boost/coroutine2/fixedsize_stack.hpp3
-rw-r--r--boost/coroutine2/segmented_stack.hpp3
-rw-r--r--boost/cstdint.hpp2
-rw-r--r--boost/date_time/date.hpp4
-rw-r--r--boost/date_time/gregorian_calendar.ipp10
-rw-r--r--boost/date_time/int_adapter.hpp4
-rw-r--r--boost/date_time/posix_time/posix_time_duration.hpp6
-rw-r--r--boost/date_time/time_system_counted.hpp2
-rw-r--r--boost/detail/is_incrementable.hpp54
-rw-r--r--boost/detail/winapi/GetCurrentProcess.hpp15
-rw-r--r--boost/detail/winapi/GetCurrentThread.hpp22
-rw-r--r--boost/detail/winapi/GetLastError.hpp14
-rw-r--r--boost/detail/winapi/GetProcessTimes.hpp51
-rw-r--r--boost/detail/winapi/GetThreadTimes.hpp42
-rw-r--r--boost/detail/winapi/LocalFree.hpp33
-rw-r--r--boost/detail/winapi/apc.hpp47
-rw-r--r--boost/detail/winapi/basic_types.hpp249
-rw-r--r--boost/detail/winapi/condition_variable.hpp116
-rw-r--r--boost/detail/winapi/config.hpp21
-rw-r--r--boost/detail/winapi/critical_section.hpp184
-rw-r--r--boost/detail/winapi/crypt.hpp223
-rw-r--r--boost/detail/winapi/detail/cast_ptr.hpp40
-rw-r--r--boost/detail/winapi/directory_management.hpp93
-rw-r--r--boost/detail/winapi/dll.hpp230
-rw-r--r--boost/detail/winapi/error_handling.hpp161
-rw-r--r--boost/detail/winapi/event.hpp183
-rw-r--r--boost/detail/winapi/file_management.hpp471
-rw-r--r--boost/detail/winapi/file_mapping.hpp170
-rw-r--r--boost/detail/winapi/handles.hpp59
-rw-r--r--boost/detail/winapi/heap_memory.hpp72
-rw-r--r--boost/detail/winapi/init_once.hpp123
-rw-r--r--boost/detail/winapi/local_memory.hpp51
-rw-r--r--boost/detail/winapi/memory.hpp46
-rw-r--r--boost/detail/winapi/mutex.hpp181
-rw-r--r--boost/detail/winapi/process.hpp20
-rw-r--r--boost/detail/winapi/security.hpp95
-rw-r--r--boost/detail/winapi/semaphore.hpp170
-rw-r--r--boost/detail/winapi/srw_lock.hpp105
-rw-r--r--boost/detail/winapi/synchronization.hpp285
-rw-r--r--boost/detail/winapi/system.hpp81
-rw-r--r--boost/detail/winapi/thread.hpp41
-rw-r--r--boost/detail/winapi/thread_pool.hpp130
-rw-r--r--boost/detail/winapi/time.hpp170
-rw-r--r--boost/detail/winapi/timers.hpp42
-rw-r--r--boost/detail/winapi/tls.hpp49
-rw-r--r--boost/detail/winapi/wait.hpp84
-rw-r--r--boost/detail/winapi/waitable_timer.hpp148
-rw-r--r--boost/endian/conversion.hpp9
-rw-r--r--boost/exception/exception.hpp10
-rw-r--r--boost/filesystem.hpp1
-rw-r--r--boost/filesystem/config.hpp3
-rw-r--r--boost/filesystem/operations.hpp308
-rw-r--r--boost/filesystem/path.hpp115
-rw-r--r--boost/filesystem/string_file.hpp43
-rw-r--r--boost/flyweight/assoc_container_factory.hpp6
-rw-r--r--boost/flyweight/flyweight.hpp6
-rw-r--r--boost/flyweight/flyweight_fwd.hpp15
-rw-r--r--boost/flyweight/serialize.hpp4
-rw-r--r--boost/format/feed_args.hpp4
-rw-r--r--boost/functional/hash/hash.hpp2
-rw-r--r--boost/fusion/algorithm/iteration/accumulate.hpp15
-rw-r--r--boost/fusion/algorithm/iteration/accumulate_fwd.hpp15
-rw-r--r--boost/fusion/algorithm/iteration/detail/fold.hpp530
-rw-r--r--boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp447
-rw-r--r--boost/fusion/algorithm/iteration/detail/preprocessed/iter_fold.hpp447
-rw-r--r--boost/fusion/algorithm/iteration/detail/preprocessed/reverse_fold.hpp447
-rw-r--r--boost/fusion/algorithm/iteration/detail/preprocessed/reverse_iter_fold.hpp447
-rw-r--r--boost/fusion/algorithm/iteration/detail/segmented_fold.hpp7
-rw-r--r--boost/fusion/algorithm/iteration/fold.hpp12
-rw-r--r--boost/fusion/algorithm/iteration/fold_fwd.hpp4
-rw-r--r--boost/fusion/algorithm/iteration/iter_fold.hpp13
-rw-r--r--boost/fusion/algorithm/iteration/iter_fold_fwd.hpp4
-rw-r--r--boost/fusion/algorithm/iteration/reverse_fold.hpp12
-rw-r--r--boost/fusion/algorithm/iteration/reverse_fold_fwd.hpp4
-rw-r--r--boost/fusion/algorithm/iteration/reverse_iter_fold.hpp12
-rw-r--r--boost/fusion/algorithm/iteration/reverse_iter_fold_fwd.hpp4
-rw-r--r--boost/fusion/algorithm/transformation/erase.hpp1
-rw-r--r--boost/fusion/algorithm/transformation/flatten.hpp4
-rw-r--r--boost/fusion/algorithm/transformation/insert.hpp1
-rw-r--r--boost/fusion/algorithm/transformation/insert_range.hpp1
-rw-r--r--boost/fusion/container/deque/deque.hpp3
-rw-r--r--boost/fusion/container/deque/detail/convert_impl.hpp9
-rw-r--r--boost/fusion/container/deque/detail/cpp03/build_deque.hpp1
-rw-r--r--boost/fusion/container/deque/detail/cpp03/deque.hpp4
-rw-r--r--boost/fusion/container/deque/detail/cpp03/preprocessed/deque10.hpp4
-rw-r--r--boost/fusion/container/deque/detail/cpp03/preprocessed/deque20.hpp4
-rw-r--r--boost/fusion/container/deque/detail/cpp03/preprocessed/deque30.hpp4
-rw-r--r--boost/fusion/container/deque/detail/cpp03/preprocessed/deque40.hpp4
-rw-r--r--boost/fusion/container/deque/detail/cpp03/preprocessed/deque50.hpp4
-rw-r--r--boost/fusion/container/generation/make_set.hpp41
-rw-r--r--boost/fusion/container/generation/make_vector.hpp61
-rw-r--r--boost/fusion/container/generation/vector_tie.hpp29
-rw-r--r--boost/fusion/container/set/detail/as_set.hpp50
-rw-r--r--boost/fusion/container/set/detail/convert_impl.hpp2
-rw-r--r--boost/fusion/container/set/set.hpp120
-rw-r--r--boost/fusion/container/set/set_fwd.hpp27
-rw-r--r--boost/fusion/container/vector.hpp19
-rw-r--r--boost/fusion/container/vector/detail/as_vector.hpp53
-rw-r--r--boost/fusion/container/vector/detail/at_impl.hpp9
-rw-r--r--boost/fusion/container/vector/detail/config.hpp36
-rw-r--r--boost/fusion/container/vector/detail/cpp03/limits.hpp1
-rw-r--r--boost/fusion/container/vector/detail/deref_impl.hpp6
-rw-r--r--boost/fusion/container/vector/detail/value_at_impl.hpp39
-rw-r--r--boost/fusion/container/vector/detail/value_of_impl.hpp6
-rw-r--r--boost/fusion/container/vector/vector.hpp322
-rw-r--r--boost/fusion/container/vector/vector10.hpp10
-rw-r--r--boost/fusion/container/vector/vector20.hpp10
-rw-r--r--boost/fusion/container/vector/vector30.hpp10
-rw-r--r--boost/fusion/container/vector/vector40.hpp10
-rw-r--r--boost/fusion/container/vector/vector50.hpp10
-rw-r--r--boost/fusion/container/vector/vector_fwd.hpp26
-rw-r--r--boost/fusion/functional/adapter/limits.hpp11
-rw-r--r--boost/fusion/functional/invocation/invoke.hpp8
-rw-r--r--boost/fusion/functional/invocation/invoke_function_object.hpp10
-rw-r--r--boost/fusion/functional/invocation/invoke_procedure.hpp4
-rw-r--r--boost/fusion/sequence/io/detail/manip.hpp3
-rw-r--r--boost/fusion/support/detail/enabler.hpp18
-rw-r--r--boost/fusion/support/detail/is_same_size.hpp29
-rw-r--r--boost/fusion/support/detail/result_of.hpp53
-rw-r--r--boost/fusion/support/segmented_fold_until.hpp5
-rw-r--r--boost/fusion/tuple/make_tuple.hpp31
-rw-r--r--boost/fusion/tuple/tuple.hpp75
-rw-r--r--boost/fusion/tuple/tuple_fwd.hpp26
-rw-r--r--boost/fusion/tuple/tuple_tie.hpp19
-rw-r--r--boost/fusion/view/detail/strictest_traversal.hpp2
-rw-r--r--boost/fusion/view/flatten_view.hpp4
-rw-r--r--boost/fusion/view/flatten_view/flatten_view.hpp4
-rw-r--r--boost/fusion/view/flatten_view/flatten_view_iterator.hpp4
-rw-r--r--boost/fusion/view/nview/detail/advance_impl.hpp9
-rw-r--r--boost/fusion/view/nview/detail/at_impl.hpp3
-rw-r--r--boost/fusion/view/nview/detail/begin_impl.hpp5
-rw-r--r--boost/fusion/view/nview/detail/cpp03/nview_impl.hpp5
-rw-r--r--boost/fusion/view/nview/detail/deref_impl.hpp6
-rw-r--r--boost/fusion/view/nview/detail/end_impl.hpp5
-rw-r--r--boost/fusion/view/nview/detail/next_impl.hpp8
-rw-r--r--boost/fusion/view/nview/detail/nview_impl.hpp32
-rw-r--r--boost/fusion/view/nview/detail/prior_impl.hpp8
-rw-r--r--boost/fusion/view/nview/nview.hpp8
-rw-r--r--boost/fusion/view/nview/nview_iterator.hpp3
-rw-r--r--boost/geometry/algorithms/centroid.hpp23
-rw-r--r--boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp23
-rw-r--r--boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp11
-rw-r--r--boost/geometry/algorithms/detail/buffer/buffered_ring.hpp12
-rw-r--r--boost/geometry/algorithms/detail/disjoint/box_box.hpp13
-rw-r--r--boost/geometry/algorithms/detail/disjoint/point_box.hpp13
-rw-r--r--boost/geometry/algorithms/detail/distance/segment_to_box.hpp21
-rw-r--r--boost/geometry/algorithms/detail/expand_by_epsilon.hpp113
-rw-r--r--boost/geometry/algorithms/detail/is_simple/areal.hpp12
-rw-r--r--boost/geometry/algorithms/detail/is_simple/linear.hpp5
-rw-r--r--boost/geometry/algorithms/detail/is_simple/multipoint.hpp4
-rw-r--r--boost/geometry/algorithms/detail/is_valid/box.hpp17
-rw-r--r--boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp151
-rw-r--r--boost/geometry/algorithms/detail/is_valid/linear.hpp6
-rw-r--r--boost/geometry/algorithms/detail/is_valid/pointlike.hpp13
-rw-r--r--boost/geometry/algorithms/detail/is_valid/polygon.hpp5
-rw-r--r--boost/geometry/algorithms/detail/is_valid/ring.hpp25
-rw-r--r--boost/geometry/algorithms/detail/is_valid/segment.hpp11
-rw-r--r--boost/geometry/algorithms/detail/overlay/clip_linestring.hpp13
-rw-r--r--boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp32
-rw-r--r--boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp21
-rw-r--r--boost/geometry/algorithms/detail/overlay/get_turn_info.hpp26
-rw-r--r--boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp4
-rw-r--r--boost/geometry/algorithms/detail/overlay/get_turns.hpp6
-rw-r--r--boost/geometry/algorithms/detail/overlay/handle_colocations.hpp278
-rw-r--r--boost/geometry/algorithms/detail/overlay/inconsistent_turns_exception.hpp38
-rw-r--r--boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp22
-rw-r--r--boost/geometry/algorithms/detail/overlay/intersection_insert.hpp124
-rw-r--r--boost/geometry/algorithms/detail/overlay/overlay.hpp25
-rw-r--r--boost/geometry/algorithms/detail/overlay/traversal_info.hpp2
-rw-r--r--boost/geometry/algorithms/detail/overlay/traverse.hpp24
-rw-r--r--boost/geometry/algorithms/detail/overlay/turn_info.hpp11
-rw-r--r--boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp46
-rw-r--r--boost/geometry/algorithms/detail/relate/areal_areal.hpp38
-rw-r--r--boost/geometry/algorithms/detail/relate/boundary_checker.hpp40
-rw-r--r--boost/geometry/algorithms/detail/relate/topology_check.hpp36
-rw-r--r--boost/geometry/algorithms/detail/relate/turns.hpp4
-rw-r--r--boost/geometry/algorithms/detail/sections/section_functions.hpp5
-rw-r--r--boost/geometry/algorithms/detail/sections/sectionalize.hpp21
-rw-r--r--boost/geometry/algorithms/overlaps.hpp16
-rw-r--r--boost/geometry/algorithms/touches.hpp31
-rw-r--r--boost/geometry/algorithms/validity_failure_type.hpp5
-rw-r--r--boost/geometry/arithmetic/determinant.hpp2
-rw-r--r--boost/geometry/core/exception.hpp1
-rw-r--r--boost/geometry/index/detail/is_bounding_geometry.hpp35
-rw-r--r--boost/geometry/index/detail/is_indexable.hpp47
-rw-r--r--boost/geometry/index/detail/rtree/node/node.hpp40
-rw-r--r--boost/geometry/index/detail/rtree/node/node_elements.hpp17
-rw-r--r--boost/geometry/index/detail/rtree/pack_create.hpp24
-rw-r--r--boost/geometry/index/detail/rtree/rstar/insert.hpp20
-rw-r--r--boost/geometry/index/detail/rtree/utilities/are_boxes_ok.hpp20
-rw-r--r--boost/geometry/index/detail/rtree/visitors/children_box.hpp4
-rw-r--r--boost/geometry/index/detail/rtree/visitors/insert.hpp48
-rw-r--r--boost/geometry/index/detail/rtree/visitors/remove.hpp15
-rw-r--r--boost/geometry/index/indexable.hpp27
-rw-r--r--boost/geometry/index/rtree.hpp27
-rw-r--r--boost/geometry/policies/is_valid/failing_reason_policy.hpp2
-rw-r--r--boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp2
-rw-r--r--boost/geometry/strategies/cartesian/box_in_box.hpp29
-rw-r--r--boost/geometry/strategies/cartesian/point_in_box.hpp11
-rw-r--r--boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp2
-rw-r--r--boost/geometry/strategies/transform/inverse_transformer.hpp3
-rw-r--r--boost/geometry/strategies/transform/matrix_transformers.hpp3
-rw-r--r--boost/geometry/util/has_infinite_coordinate.hpp55
-rw-r--r--boost/geometry/util/has_nan_coordinate.hpp99
-rw-r--r--boost/geometry/util/has_non_finite_coordinate.hpp55
-rw-r--r--boost/geometry/util/math.hpp77
-rw-r--r--boost/heap/binomial_heap.hpp5
-rw-r--r--boost/icl/concept/interval.hpp6
-rw-r--r--boost/icl/concept/interval_associator.hpp4
-rw-r--r--boost/icl/concept/interval_associator_base.hpp4
-rw-r--r--boost/icl/concept/interval_map.hpp8
-rw-r--r--boost/icl/detail/concept_check.hpp4
-rw-r--r--boost/icl/detail/interval_set_algo.hpp10
-rw-r--r--boost/icl/detail/subset_comparer.hpp4
-rw-r--r--boost/icl/interval_base_map.hpp3
-rw-r--r--boost/icl/map.hpp1
-rw-r--r--boost/icl/type_traits/has_inverse.hpp4
-rw-r--r--boost/icl/type_traits/infinity.hpp15
-rw-r--r--boost/icl/type_traits/is_interval_separator.hpp2
-rw-r--r--boost/icl/type_traits/is_numeric.hpp1
-rw-r--r--boost/interprocess/containers/pair.hpp1
-rw-r--r--boost/interprocess/detail/config_begin.hpp5
-rw-r--r--boost/interprocess/detail/config_end.hpp3
-rw-r--r--boost/interprocess/detail/os_thread_functions.hpp23
-rw-r--r--boost/interprocess/detail/posix_time_types_wrk.hpp5
-rw-r--r--boost/interprocess/detail/std_fwd.hpp40
-rw-r--r--boost/interprocess/detail/utilities.hpp26
-rw-r--r--boost/interprocess/detail/win32_api.hpp45
-rw-r--r--boost/interprocess/detail/workaround.hpp3
-rw-r--r--boost/interprocess/interprocess_fwd.hpp13
-rw-r--r--boost/interprocess/mapped_region.hpp4
-rw-r--r--boost/interprocess/offset_ptr.hpp398
-rw-r--r--boost/interprocess/sync/interprocess_mutex.hpp2
-rw-r--r--boost/interprocess/sync/interprocess_recursive_mutex.hpp2
-rw-r--r--boost/interprocess/sync/interprocess_semaphore.hpp2
-rw-r--r--boost/intrusive/avl_set.hpp4
-rw-r--r--boost/intrusive/bs_set.hpp4
-rw-r--r--boost/intrusive/bstree.hpp172
-rw-r--r--boost/intrusive/detail/ebo_functor_holder.hpp132
-rw-r--r--boost/intrusive/detail/has_member_function_callable_with.hpp13
-rw-r--r--boost/intrusive/detail/key_nodeptr_comp.hpp10
-rw-r--r--boost/intrusive/detail/math.hpp22
-rw-r--r--boost/intrusive/detail/parent_from_member.hpp4
-rw-r--r--boost/intrusive/detail/std_fwd.hpp30
-rw-r--r--boost/intrusive/detail/tree_iterator.hpp21
-rw-r--r--boost/intrusive/detail/tree_value_compare.hpp23
-rw-r--r--boost/intrusive/intrusive_fwd.hpp14
-rw-r--r--boost/intrusive/pointer_plus_bits.hpp14
-rw-r--r--boost/intrusive/pointer_traits.hpp14
-rw-r--r--boost/intrusive/rbtree_algorithms.hpp4
-rw-r--r--boost/intrusive/set.hpp4
-rw-r--r--boost/intrusive/sg_set.hpp4
-rw-r--r--boost/intrusive/sgtree.hpp17
-rw-r--r--boost/intrusive/splay_set.hpp4
-rw-r--r--boost/intrusive/treap_set.hpp4
-rw-r--r--boost/iterator/zip_iterator.hpp425
-rw-r--r--boost/lambda/detail/lambda_functors.hpp2
-rw-r--r--boost/lexical_cast.hpp7
-rw-r--r--boost/lexical_cast/detail/converter_lexical.hpp7
-rw-r--r--boost/lexical_cast/try_lexical_convert.hpp13
-rw-r--r--boost/locale/boundary/boundary_point.hpp8
-rw-r--r--boost/locale/boundary/facets.hpp4
-rw-r--r--boost/locale/boundary/index.hpp16
-rw-r--r--boost/locale/boundary/segment.hpp9
-rw-r--r--boost/locale/conversion.hpp4
-rw-r--r--boost/locale/encoding.hpp4
-rw-r--r--boost/locale/format.hpp4
-rw-r--r--boost/locale/generic_codecvt.hpp676
-rw-r--r--boost/locale/gnu_gettext.hpp4
-rw-r--r--boost/locale/message.hpp8
-rw-r--r--boost/locale/utf8_codecvt.hpp69
-rw-r--r--boost/locale/util.hpp15
-rw-r--r--boost/lockfree/detail/atomic.hpp19
-rw-r--r--boost/lockfree/detail/branch_hints.hpp38
-rw-r--r--boost/lockfree/detail/freelist.hpp2
-rw-r--r--boost/lockfree/detail/tagged_ptr_dcas.hpp1
-rw-r--r--boost/lockfree/detail/tagged_ptr_ptrcompression.hpp5
-rw-r--r--boost/lockfree/queue.hpp8
-rw-r--r--boost/lockfree/spsc_queue.hpp8
-rw-r--r--boost/log/attributes/attribute_set.hpp13
-rw-r--r--boost/log/attributes/counter.hpp166
-rw-r--r--boost/log/detail/adaptive_mutex.hpp (renamed from boost/log/detail/spin_mutex.hpp)165
-rw-r--r--boost/log/detail/code_conversion.hpp15
-rw-r--r--boost/log/detail/config.hpp31
-rw-r--r--boost/log/detail/is_character_type.hpp2
-rw-r--r--boost/log/detail/light_rw_mutex.hpp49
-rw-r--r--boost/log/detail/setup_config.hpp15
-rw-r--r--boost/log/detail/thread_specific.hpp10
-rw-r--r--boost/log/expressions/formatter.hpp215
-rw-r--r--boost/log/expressions/formatters/char_decorator.hpp26
-rw-r--r--boost/log/sinks/async_frontend.hpp72
-rw-r--r--boost/log/sinks/unbounded_fifo_queue.hpp11
-rw-r--r--boost/log/sources/record_ostream.hpp61
-rw-r--r--boost/log/utility/formatting_ostream.hpp19
-rw-r--r--boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp2
-rw-r--r--boost/log/utility/type_dispatch/static_type_dispatcher.hpp11
-rw-r--r--boost/math/concepts/real_concept.hpp29
-rw-r--r--boost/math/concepts/std_real_concept.hpp2
-rw-r--r--boost/math/constants/constants.hpp14
-rw-r--r--boost/math/cstdfloat/cstdfloat_iostream.hpp5
-rw-r--r--boost/math/distributions/bernoulli.hpp2
-rw-r--r--boost/math/distributions/binomial.hpp2
-rw-r--r--boost/math/distributions/detail/hypergeometric_pdf.hpp2
-rw-r--r--boost/math/distributions/detail/hypergeometric_quantile.hpp46
-rw-r--r--boost/math/distributions/exponential.hpp4
-rw-r--r--boost/math/distributions/extreme_value.hpp4
-rw-r--r--boost/math/distributions/fisher_f.hpp4
-rw-r--r--boost/math/distributions/geometric.hpp2
-rw-r--r--boost/math/distributions/hypergeometric.hpp44
-rw-r--r--boost/math/distributions/inverse_gaussian.hpp15
-rw-r--r--boost/math/distributions/negative_binomial.hpp2
-rw-r--r--boost/math/distributions/non_central_beta.hpp6
-rw-r--r--boost/math/distributions/non_central_chi_squared.hpp58
-rw-r--r--boost/math/distributions/non_central_t.hpp4
-rw-r--r--boost/math/distributions/rayleigh.hpp2
-rw-r--r--boost/math/distributions/skew_normal.hpp18
-rw-r--r--boost/math/distributions/triangular.hpp12
-rw-r--r--boost/math/distributions/uniform.hpp21
-rw-r--r--boost/math/policies/error_handling.hpp124
-rw-r--r--boost/math/policies/policy.hpp108
-rw-r--r--boost/math/special_functions.hpp2
-rw-r--r--boost/math/special_functions/bernoulli.hpp2
-rw-r--r--boost/math/special_functions/bessel.hpp34
-rw-r--r--boost/math/special_functions/bessel_prime.hpp8
-rw-r--r--boost/math/special_functions/beta.hpp183
-rw-r--r--boost/math/special_functions/detail/bernoulli_details.hpp18
-rw-r--r--boost/math/special_functions/detail/bessel_derivatives_linear.hpp16
-rw-r--r--boost/math/special_functions/detail/bessel_ik.hpp6
-rw-r--r--boost/math/special_functions/detail/bessel_jn.hpp7
-rw-r--r--boost/math/special_functions/detail/bessel_jy_asym.hpp18
-rw-r--r--boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp5
-rw-r--r--boost/math/special_functions/detail/bessel_yn.hpp34
-rw-r--r--boost/math/special_functions/detail/lanczos_sse2.hpp2
-rw-r--r--boost/math/special_functions/detail/polygamma.hpp8
-rw-r--r--boost/math/special_functions/detail/t_distribution_inv.hpp40
-rw-r--r--boost/math/special_functions/ellint_2.hpp13
-rw-r--r--boost/math/special_functions/ellint_d.hpp10
-rw-r--r--boost/math/special_functions/fpclassify.hpp22
-rw-r--r--boost/math/special_functions/gamma.hpp20
-rw-r--r--boost/math/special_functions/math_fwd.hpp25
-rw-r--r--boost/math/special_functions/nonfinite_num_facets.hpp5
-rw-r--r--boost/math/special_functions/owens_t.hpp84
-rw-r--r--boost/math/special_functions/powm1.hpp31
-rw-r--r--boost/math/special_functions/relative_difference.hpp134
-rw-r--r--boost/math/special_functions/trigamma.hpp28
-rw-r--r--boost/math/special_functions/ulp.hpp71
-rw-r--r--boost/math/special_functions/zeta.hpp182
-rw-r--r--boost/math/tools/big_constant.hpp6
-rw-r--r--boost/math/tools/config.hpp69
-rw-r--r--boost/math/tools/detail/polynomial_horner1_10.hpp22
-rw-r--r--boost/math/tools/detail/polynomial_horner1_11.hpp24
-rw-r--r--boost/math/tools/detail/polynomial_horner1_12.hpp26
-rw-r--r--boost/math/tools/detail/polynomial_horner1_13.hpp28
-rw-r--r--boost/math/tools/detail/polynomial_horner1_14.hpp30
-rw-r--r--boost/math/tools/detail/polynomial_horner1_15.hpp32
-rw-r--r--boost/math/tools/detail/polynomial_horner1_16.hpp34
-rw-r--r--boost/math/tools/detail/polynomial_horner1_17.hpp36
-rw-r--r--boost/math/tools/detail/polynomial_horner1_18.hpp38
-rw-r--r--boost/math/tools/detail/polynomial_horner1_19.hpp40
-rw-r--r--boost/math/tools/detail/polynomial_horner1_2.hpp6
-rw-r--r--boost/math/tools/detail/polynomial_horner1_20.hpp42
-rw-r--r--boost/math/tools/detail/polynomial_horner1_3.hpp8
-rw-r--r--boost/math/tools/detail/polynomial_horner1_4.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner1_5.hpp12
-rw-r--r--boost/math/tools/detail/polynomial_horner1_6.hpp14
-rw-r--r--boost/math/tools/detail/polynomial_horner1_7.hpp16
-rw-r--r--boost/math/tools/detail/polynomial_horner1_8.hpp18
-rw-r--r--boost/math/tools/detail/polynomial_horner1_9.hpp20
-rw-r--r--boost/math/tools/detail/polynomial_horner2_10.hpp22
-rw-r--r--boost/math/tools/detail/polynomial_horner2_11.hpp24
-rw-r--r--boost/math/tools/detail/polynomial_horner2_12.hpp26
-rw-r--r--boost/math/tools/detail/polynomial_horner2_13.hpp28
-rw-r--r--boost/math/tools/detail/polynomial_horner2_14.hpp30
-rw-r--r--boost/math/tools/detail/polynomial_horner2_15.hpp32
-rw-r--r--boost/math/tools/detail/polynomial_horner2_16.hpp34
-rw-r--r--boost/math/tools/detail/polynomial_horner2_17.hpp36
-rw-r--r--boost/math/tools/detail/polynomial_horner2_18.hpp38
-rw-r--r--boost/math/tools/detail/polynomial_horner2_19.hpp40
-rw-r--r--boost/math/tools/detail/polynomial_horner2_2.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner2_20.hpp42
-rw-r--r--boost/math/tools/detail/polynomial_horner2_3.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner2_4.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner2_5.hpp12
-rw-r--r--boost/math/tools/detail/polynomial_horner2_6.hpp14
-rw-r--r--boost/math/tools/detail/polynomial_horner2_7.hpp16
-rw-r--r--boost/math/tools/detail/polynomial_horner2_8.hpp18
-rw-r--r--boost/math/tools/detail/polynomial_horner2_9.hpp20
-rw-r--r--boost/math/tools/detail/polynomial_horner3_10.hpp22
-rw-r--r--boost/math/tools/detail/polynomial_horner3_11.hpp24
-rw-r--r--boost/math/tools/detail/polynomial_horner3_12.hpp26
-rw-r--r--boost/math/tools/detail/polynomial_horner3_13.hpp28
-rw-r--r--boost/math/tools/detail/polynomial_horner3_14.hpp30
-rw-r--r--boost/math/tools/detail/polynomial_horner3_15.hpp32
-rw-r--r--boost/math/tools/detail/polynomial_horner3_16.hpp34
-rw-r--r--boost/math/tools/detail/polynomial_horner3_17.hpp36
-rw-r--r--boost/math/tools/detail/polynomial_horner3_18.hpp38
-rw-r--r--boost/math/tools/detail/polynomial_horner3_19.hpp40
-rw-r--r--boost/math/tools/detail/polynomial_horner3_2.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner3_20.hpp42
-rw-r--r--boost/math/tools/detail/polynomial_horner3_3.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner3_4.hpp10
-rw-r--r--boost/math/tools/detail/polynomial_horner3_5.hpp12
-rw-r--r--boost/math/tools/detail/polynomial_horner3_6.hpp14
-rw-r--r--boost/math/tools/detail/polynomial_horner3_7.hpp16
-rw-r--r--boost/math/tools/detail/polynomial_horner3_8.hpp18
-rw-r--r--boost/math/tools/detail/polynomial_horner3_9.hpp20
-rw-r--r--boost/math/tools/detail/rational_horner1_10.hpp22
-rw-r--r--boost/math/tools/detail/rational_horner1_11.hpp24
-rw-r--r--boost/math/tools/detail/rational_horner1_12.hpp26
-rw-r--r--boost/math/tools/detail/rational_horner1_13.hpp28
-rw-r--r--boost/math/tools/detail/rational_horner1_14.hpp30
-rw-r--r--boost/math/tools/detail/rational_horner1_15.hpp32
-rw-r--r--boost/math/tools/detail/rational_horner1_16.hpp34
-rw-r--r--boost/math/tools/detail/rational_horner1_17.hpp36
-rw-r--r--boost/math/tools/detail/rational_horner1_18.hpp38
-rw-r--r--boost/math/tools/detail/rational_horner1_19.hpp40
-rw-r--r--boost/math/tools/detail/rational_horner1_2.hpp6
-rw-r--r--boost/math/tools/detail/rational_horner1_20.hpp42
-rw-r--r--boost/math/tools/detail/rational_horner1_3.hpp8
-rw-r--r--boost/math/tools/detail/rational_horner1_4.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner1_5.hpp12
-rw-r--r--boost/math/tools/detail/rational_horner1_6.hpp14
-rw-r--r--boost/math/tools/detail/rational_horner1_7.hpp16
-rw-r--r--boost/math/tools/detail/rational_horner1_8.hpp18
-rw-r--r--boost/math/tools/detail/rational_horner1_9.hpp20
-rw-r--r--boost/math/tools/detail/rational_horner2_10.hpp22
-rw-r--r--boost/math/tools/detail/rational_horner2_11.hpp24
-rw-r--r--boost/math/tools/detail/rational_horner2_12.hpp26
-rw-r--r--boost/math/tools/detail/rational_horner2_13.hpp28
-rw-r--r--boost/math/tools/detail/rational_horner2_14.hpp30
-rw-r--r--boost/math/tools/detail/rational_horner2_15.hpp32
-rw-r--r--boost/math/tools/detail/rational_horner2_16.hpp34
-rw-r--r--boost/math/tools/detail/rational_horner2_17.hpp36
-rw-r--r--boost/math/tools/detail/rational_horner2_18.hpp38
-rw-r--r--boost/math/tools/detail/rational_horner2_19.hpp40
-rw-r--r--boost/math/tools/detail/rational_horner2_2.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner2_20.hpp42
-rw-r--r--boost/math/tools/detail/rational_horner2_3.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner2_4.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner2_5.hpp12
-rw-r--r--boost/math/tools/detail/rational_horner2_6.hpp14
-rw-r--r--boost/math/tools/detail/rational_horner2_7.hpp16
-rw-r--r--boost/math/tools/detail/rational_horner2_8.hpp18
-rw-r--r--boost/math/tools/detail/rational_horner2_9.hpp20
-rw-r--r--boost/math/tools/detail/rational_horner3_10.hpp22
-rw-r--r--boost/math/tools/detail/rational_horner3_11.hpp24
-rw-r--r--boost/math/tools/detail/rational_horner3_12.hpp26
-rw-r--r--boost/math/tools/detail/rational_horner3_13.hpp28
-rw-r--r--boost/math/tools/detail/rational_horner3_14.hpp30
-rw-r--r--boost/math/tools/detail/rational_horner3_15.hpp32
-rw-r--r--boost/math/tools/detail/rational_horner3_16.hpp34
-rw-r--r--boost/math/tools/detail/rational_horner3_17.hpp36
-rw-r--r--boost/math/tools/detail/rational_horner3_18.hpp38
-rw-r--r--boost/math/tools/detail/rational_horner3_19.hpp40
-rw-r--r--boost/math/tools/detail/rational_horner3_2.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner3_20.hpp42
-rw-r--r--boost/math/tools/detail/rational_horner3_3.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner3_4.hpp10
-rw-r--r--boost/math/tools/detail/rational_horner3_5.hpp12
-rw-r--r--boost/math/tools/detail/rational_horner3_6.hpp14
-rw-r--r--boost/math/tools/detail/rational_horner3_7.hpp16
-rw-r--r--boost/math/tools/detail/rational_horner3_8.hpp18
-rw-r--r--boost/math/tools/detail/rational_horner3_9.hpp20
-rw-r--r--boost/math/tools/fraction.hpp18
-rw-r--r--boost/math/tools/minima.hpp2
-rw-r--r--boost/math/tools/precision.hpp136
-rw-r--r--boost/math/tools/promotion.hpp21
-rw-r--r--boost/math/tools/rational.hpp32
-rw-r--r--boost/math/tools/real_cast.hpp4
-rw-r--r--boost/math/tools/roots.hpp451
-rw-r--r--boost/math/tools/series.hpp16
-rw-r--r--boost/math/tools/toms748_solve.hpp6
-rw-r--r--boost/math/tools/traits.hpp7
-rw-r--r--boost/math/tools/workaround.hpp4
-rw-r--r--boost/math/tr1.hpp5
-rw-r--r--boost/move/core.hpp4
-rw-r--r--boost/move/default_delete.hpp6
-rw-r--r--boost/move/detail/fwd_macros.hpp266
-rw-r--r--boost/move/detail/iterator_traits.hpp18
-rw-r--r--boost/move/detail/meta_utils.hpp5
-rw-r--r--boost/move/detail/move_helpers.hpp322
-rw-r--r--boost/move/detail/std_ns_begin.hpp30
-rw-r--r--boost/move/detail/std_ns_end.hpp14
-rw-r--r--boost/move/detail/type_traits.hpp4
-rw-r--r--boost/move/unique_ptr.hpp4
-rw-r--r--boost/move/utility_core.hpp2
-rw-r--r--boost/mpi/collectives/reduce.hpp4
-rw-r--r--boost/mpi/collectives/scan.hpp2
-rw-r--r--boost/mpi/detail/forward_skeleton_iarchive.hpp4
-rw-r--r--boost/mpi/detail/forward_skeleton_oarchive.hpp4
-rw-r--r--boost/mpi/detail/ignore_skeleton_oarchive.hpp4
-rw-r--r--boost/mpl/string.hpp2
-rw-r--r--boost/multi_index/detail/ord_index_impl.hpp2
-rw-r--r--boost/multi_index/global_fun.hpp10
-rw-r--r--boost/multi_index/hashed_index.hpp2
-rw-r--r--boost/multi_index/identity.hpp10
-rw-r--r--boost/multi_index/random_access_index.hpp2
-rw-r--r--boost/multi_index/ranked_index.hpp6
-rw-r--r--boost/multi_index/sequenced_index.hpp2
-rw-r--r--boost/multiprecision/concepts/mp_number_archetypes.hpp2
-rw-r--r--boost/multiprecision/cpp_bin_float.hpp22
-rw-r--r--boost/multiprecision/cpp_int.hpp195
-rw-r--r--boost/multiprecision/cpp_int/bitwise.hpp9
-rw-r--r--boost/multiprecision/cpp_int/divide.hpp16
-rw-r--r--boost/multiprecision/cpp_int/import_export.hpp200
-rw-r--r--boost/multiprecision/cpp_int/limits.hpp2
-rw-r--r--boost/multiprecision/detail/default_ops.hpp4
-rw-r--r--boost/multiprecision/detail/functions/trig.hpp12
-rw-r--r--boost/multiprecision/detail/number_base.hpp186
-rw-r--r--boost/multiprecision/float128.hpp4
-rw-r--r--boost/multiprecision/gmp.hpp6
-rw-r--r--boost/multiprecision/miller_rabin.hpp2
-rw-r--r--boost/multiprecision/mpfi.hpp10
-rw-r--r--boost/multiprecision/mpfr.hpp52
-rw-r--r--boost/multiprecision/number.hpp70
-rw-r--r--boost/multiprecision/random.hpp583
-rw-r--r--boost/multiprecision/tommath.hpp2
-rw-r--r--boost/multiprecision/traits/is_byte_container.hpp33
-rw-r--r--boost/none.hpp12
-rw-r--r--boost/none_t.hpp18
-rw-r--r--boost/numeric/odeint.hpp1
-rw-r--r--boost/numeric/odeint/algebra/default_operations.hpp4
-rw-r--r--boost/numeric/odeint/integrate/check_adapter.hpp222
-rw-r--r--boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp17
-rw-r--r--boost/numeric/odeint/integrate/detail/integrate_const.hpp24
-rw-r--r--boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp18
-rw-r--r--boost/numeric/odeint/integrate/detail/integrate_times.hpp22
-rw-r--r--boost/numeric/odeint/integrate/integrate_adaptive.hpp2
-rw-r--r--boost/numeric/odeint/integrate/integrate_const.hpp203
-rw-r--r--boost/numeric/odeint/integrate/integrate_n_steps.hpp82
-rw-r--r--boost/numeric/odeint/integrate/integrate_times.hpp109
-rw-r--r--boost/numeric/odeint/integrate/max_step_checker.hpp114
-rw-r--r--boost/numeric/odeint/stepper/bulirsch_stoer.hpp20
-rw-r--r--boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp40
-rw-r--r--boost/numeric/odeint/stepper/controlled_runge_kutta.hpp236
-rw-r--r--boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp20
-rw-r--r--boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp14
-rw-r--r--boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp13
-rw-r--r--boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp7
-rw-r--r--boost/numeric/odeint/stepper/generation/make_controlled.hpp22
-rw-r--r--boost/numeric/odeint/stepper/generation/make_dense_output.hpp22
-rw-r--r--boost/numeric/odeint/stepper/rosenbrock4_controller.hpp32
-rw-r--r--boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp11
-rw-r--r--boost/numeric/odeint/util/detail/less_with_sign.hpp6
-rw-r--r--boost/numeric/odeint/util/odeint_error.hpp77
-rw-r--r--boost/numeric/odeint/util/resize.hpp2
-rw-r--r--boost/numeric/odeint/util/resizer.hpp2
-rw-r--r--boost/numeric/odeint/util/same_size.hpp2
-rw-r--r--boost/numeric/odeint/util/unwrap_reference.hpp2
-rw-r--r--boost/operators.hpp14
-rw-r--r--boost/optional/optional_io.hpp4
-rw-r--r--boost/phoenix/config.hpp68
-rw-r--r--boost/phoenix/function/adapt_function.hpp1
-rw-r--r--boost/phoenix/function/function.hpp75
-rw-r--r--boost/phoenix/function/lazy_list.hpp24
-rw-r--r--boost/phoenix/function/lazy_operator.hpp175
-rw-r--r--boost/phoenix/function/lazy_reuse.hpp58
-rw-r--r--boost/phoenix/function/lazy_signature.hpp335
-rw-r--r--boost/phoenix/function/lazy_smart.hpp153
-rw-r--r--boost/phoenix/statement/detail/catch_push_back.hpp44
-rw-r--r--boost/phoenix/statement/detail/preprocessed/catch_push_back_10.hpp324
-rw-r--r--boost/phoenix/statement/detail/preprocessed/catch_push_back_20.hpp684
-rw-r--r--boost/phoenix/statement/detail/preprocessed/catch_push_back_30.hpp1044
-rw-r--r--boost/phoenix/statement/detail/preprocessed/catch_push_back_40.hpp1404
-rw-r--r--boost/phoenix/statement/detail/preprocessed/catch_push_back_50.hpp1764
-rw-r--r--boost/phoenix/statement/detail/preprocessed/try_catch_eval_10.hpp38
-rw-r--r--boost/phoenix/statement/detail/preprocessed/try_catch_eval_20.hpp78
-rw-r--r--boost/phoenix/statement/detail/preprocessed/try_catch_eval_30.hpp118
-rw-r--r--boost/phoenix/statement/detail/preprocessed/try_catch_eval_40.hpp158
-rw-r--r--boost/phoenix/statement/detail/preprocessed/try_catch_eval_50.hpp198
-rw-r--r--boost/phoenix/statement/detail/try_catch_eval.hpp4
-rw-r--r--boost/phoenix/statement/try_catch.hpp182
-rw-r--r--boost/phoenix/stl/algorithm/detail/begin.hpp10
-rw-r--r--boost/phoenix/stl/algorithm/detail/end.hpp12
-rw-r--r--boost/phoenix/stl/algorithm/detail/has_find.hpp5
-rw-r--r--boost/phoenix/stl/algorithm/detail/is_unordered_set_or_map.hpp144
-rw-r--r--boost/phoenix/stl/algorithm/detail/std_unordered_set_or_map_fwd.hpp73
-rw-r--r--boost/phoenix/stl/algorithm/querying.hpp102
-rw-r--r--boost/phoenix/stl/algorithm/transformation.hpp58
-rw-r--r--boost/polygon/detail/boolean_op.hpp6
-rw-r--r--boost/polygon/detail/boolean_op_45.hpp4
-rw-r--r--boost/polygon/detail/polygon_45_formation.hpp17
-rw-r--r--boost/polygon/detail/polygon_90_set_view.hpp4
-rw-r--r--boost/polygon/detail/polygon_arbitrary_formation.hpp38
-rw-r--r--boost/polygon/detail/polygon_formation.hpp374
-rw-r--r--boost/polygon/detail/property_merge.hpp6
-rw-r--r--boost/polygon/detail/rectangle_formation.hpp2
-rw-r--r--boost/polygon/detail/scan_arbitrary.hpp2
-rw-r--r--boost/polygon/isotropy.hpp24
-rw-r--r--boost/polygon/point_data.hpp8
-rw-r--r--boost/polygon/polygon_45_set_data.hpp4
-rw-r--r--boost/polygon/polygon_90_set_data.hpp6
-rw-r--r--boost/polygon/polygon_set_data.hpp6
-rw-r--r--boost/polygon/polygon_traits.hpp12
-rw-r--r--boost/polygon/segment_data.hpp2
-rw-r--r--boost/pool/detail/mutex.hpp2
-rw-r--r--boost/predef.h1
-rw-r--r--boost/predef/detail/_cassert.h2
-rw-r--r--boost/predef/detail/_exception.h2
-rw-r--r--boost/predef/hardware.h16
-rw-r--r--boost/predef/hardware/simd.h107
-rw-r--r--boost/predef/hardware/simd/arm.h57
-rw-r--r--boost/predef/hardware/simd/arm/versions.h32
-rw-r--r--boost/predef/hardware/simd/ppc.h69
-rw-r--r--boost/predef/hardware/simd/ppc/versions.h51
-rw-r--r--boost/predef/hardware/simd/x86.h123
-rw-r--r--boost/predef/hardware/simd/x86/versions.h129
-rw-r--r--boost/predef/hardware/simd/x86_amd.h87
-rw-r--r--boost/predef/hardware/simd/x86_amd/versions.h51
-rw-r--r--boost/predef/platform/windows_desktop.h2
-rw-r--r--boost/predef/platform/windows_phone.h2
-rw-r--r--boost/predef/platform/windows_runtime.h2
-rw-r--r--boost/predef/platform/windows_store.h2
-rw-r--r--boost/predef/version.h2
-rw-r--r--boost/preprocessor/facilities/identity.hpp4
-rw-r--r--boost/preprocessor/tuple/eat.hpp11
-rw-r--r--boost/progress.hpp7
-rw-r--r--boost/python/data_members.hpp2
-rw-r--r--boost/random.hpp5
-rw-r--r--boost/random/binomial_distribution.hpp2
-rw-r--r--boost/random/chi_squared_distribution.hpp6
-rw-r--r--boost/random/detail/auto_link.hpp12
-rw-r--r--boost/random/detail/seed_impl.hpp18
-rw-r--r--boost/random/detail/signed_unsigned_tools.hpp10
-rw-r--r--boost/random/discrete_distribution.hpp14
-rw-r--r--boost/random/generate_canonical.hpp2
-rw-r--r--boost/random/hyperexponential_distribution.hpp883
-rw-r--r--boost/random/independent_bits.hpp29
-rw-r--r--boost/random/piecewise_constant_distribution.hpp2
-rw-r--r--boost/random/piecewise_linear_distribution.hpp3
-rw-r--r--boost/random/seed_seq.hpp16
-rw-r--r--boost/random/shuffle_order.hpp2
-rw-r--r--boost/random/subtract_with_carry.hpp4
-rw-r--r--boost/random/traits.hpp107
-rw-r--r--boost/random/triangle_distribution.hpp2
-rw-r--r--boost/random/uniform_01.hpp32
-rw-r--r--boost/random/uniform_int_distribution.hpp50
-rw-r--r--boost/random/uniform_real_distribution.hpp2
-rw-r--r--boost/random/uniform_smallint.hpp32
-rw-r--r--boost/rational.hpp54
-rw-r--r--boost/regex/config.hpp58
-rw-r--r--boost/regex/icu.hpp166
-rw-r--r--boost/regex/mfc.hpp4
-rw-r--r--boost/regex/pattern_except.hpp4
-rw-r--r--boost/regex/v4/basic_regex.hpp31
-rw-r--r--boost/regex/v4/basic_regex_creator.hpp42
-rw-r--r--boost/regex/v4/basic_regex_parser.hpp212
-rw-r--r--boost/regex/v4/cpp_regex_traits.hpp211
-rw-r--r--boost/regex/v4/cregex.hpp14
-rw-r--r--boost/regex/v4/fileiter.hpp18
-rw-r--r--boost/regex/v4/instances.hpp21
-rw-r--r--boost/regex/v4/iterator_traits.hpp4
-rw-r--r--boost/regex/v4/match_results.hpp34
-rw-r--r--boost/regex/v4/mem_block_cache.hpp2
-rw-r--r--boost/regex/v4/perl_matcher.hpp55
-rw-r--r--boost/regex/v4/perl_matcher_common.hpp40
-rw-r--r--boost/regex/v4/perl_matcher_non_recursive.hpp219
-rw-r--r--boost/regex/v4/perl_matcher_recursive.hpp126
-rw-r--r--boost/regex/v4/primary_transform.hpp4
-rw-r--r--boost/regex/v4/protected_call.hpp2
-rw-r--r--boost/regex/v4/regex_format.hpp28
-rw-r--r--boost/regex/v4/regex_grep.hpp2
-rw-r--r--boost/regex/v4/regex_iterator.hpp6
-rw-r--r--boost/regex/v4/regex_match.hpp2
-rw-r--r--boost/regex/v4/regex_raw_buffer.hpp4
-rw-r--r--boost/regex/v4/regex_replace.hpp8
-rw-r--r--boost/regex/v4/regex_search.hpp4
-rw-r--r--boost/regex/v4/regex_split.hpp8
-rw-r--r--boost/regex/v4/regex_token_iterator.hpp6
-rw-r--r--boost/regex/v4/regex_traits.hpp16
-rw-r--r--boost/regex/v4/regex_traits_defaults.hpp14
-rw-r--r--boost/regex/v4/regex_workaround.hpp7
-rw-r--r--boost/regex/v4/states.hpp26
-rw-r--r--boost/regex/v4/sub_match.hpp143
-rw-r--r--boost/regex/v4/u32regex_iterator.hpp4
-rw-r--r--boost/regex/v4/u32regex_token_iterator.hpp4
-rw-r--r--boost/regex/v4/w32_regex_traits.hpp82
-rw-r--r--boost/serialization/archive_input_unordered_map.hpp85
-rw-r--r--boost/serialization/archive_input_unordered_set.hpp70
-rw-r--r--boost/serialization/boost_unordered_map.hpp154
-rw-r--r--boost/serialization/boost_unordered_set.hpp150
-rw-r--r--boost/serialization/collections_load_imp.hpp2
-rw-r--r--boost/serialization/deque.hpp2
-rw-r--r--boost/serialization/detail/get_data.hpp2
-rw-r--r--boost/serialization/extended_type_info.hpp6
-rw-r--r--boost/serialization/extended_type_info_typeid.hpp4
-rw-r--r--boost/serialization/singleton.hpp4
-rw-r--r--boost/serialization/static_warning.hpp2
-rw-r--r--boost/serialization/unordered_map.hpp89
-rw-r--r--boost/serialization/unordered_set.hpp74
-rw-r--r--boost/serialization/variant.hpp1
-rw-r--r--boost/signals2/detail/auto_buffer.hpp4
-rw-r--r--boost/signals2/detail/variadic_slot_invoker.hpp15
-rw-r--r--boost/signals2/postconstructible.hpp2
-rw-r--r--boost/smart_ptr/detail/operator_bool.hpp3
-rw-r--r--boost/smart_ptr/detail/shared_count.hpp10
-rw-r--r--boost/smart_ptr/detail/sp_disable_deprecated.hpp40
-rw-r--r--boost/smart_ptr/detail/sp_interlocked.hpp11
-rw-r--r--boost/smart_ptr/detail/yield_k.hpp9
-rw-r--r--boost/smart_ptr/scoped_ptr.hpp10
-rw-r--r--boost/smart_ptr/shared_ptr.hpp10
-rw-r--r--boost/sort/spreadsort/detail/float_sort.hpp55
-rw-r--r--boost/sort/spreadsort/detail/string_sort.hpp2
-rw-r--r--boost/sort/spreadsort/spreadsort.hpp35
-rw-r--r--boost/spirit/home/classic/tree/parse_tree.hpp1
-rw-r--r--boost/spirit/home/karma/directive/duplicate.hpp2
-rw-r--r--boost/spirit/home/karma/directive/left_alignment.hpp4
-rw-r--r--boost/spirit/home/karma/string/lit.hpp3
-rw-r--r--boost/spirit/home/qi/detail/assign_to.hpp11
-rw-r--r--boost/spirit/home/qi/detail/attributes.hpp2
-rw-r--r--boost/spirit/home/qi/numeric/detail/numeric_utils.hpp31
-rw-r--r--boost/spirit/home/qi/numeric/detail/real_impl.hpp8
-rw-r--r--boost/spirit/home/support/attributes.hpp5
-rw-r--r--boost/spirit/home/support/char_encoding/ascii.hpp29
-rw-r--r--boost/spirit/home/support/detail/endian/endian.hpp21
-rw-r--r--boost/spirit/home/support/terminal.hpp44
-rw-r--r--boost/spirit/home/x3/char/char_set.hpp4
-rw-r--r--boost/static_assert.hpp23
-rw-r--r--boost/test/auto_unit_test.hpp2
-rw-r--r--boost/test/data/config.hpp9
-rw-r--r--boost/test/data/dataset.hpp2
-rw-r--r--boost/test/data/for_each_sample.hpp71
-rw-r--r--boost/test/data/generators.hpp2
-rw-r--r--boost/test/data/monomorphic.hpp3
-rw-r--r--boost/test/data/monomorphic/array.hpp66
-rw-r--r--boost/test/data/monomorphic/collection.hpp68
-rw-r--r--boost/test/data/monomorphic/dataset.hpp174
-rw-r--r--boost/test/data/monomorphic/fwd.hpp201
-rw-r--r--boost/test/data/monomorphic/generate.hpp53
-rw-r--r--boost/test/data/monomorphic/generators.hpp2
-rw-r--r--boost/test/data/monomorphic/generators/keywords.hpp2
-rw-r--r--boost/test/data/monomorphic/generators/random.hpp12
-rw-r--r--boost/test/data/monomorphic/generators/xrange.hpp39
-rw-r--r--boost/test/data/monomorphic/grid.hpp132
-rw-r--r--boost/test/data/monomorphic/initializer_list.hpp81
-rw-r--r--boost/test/data/monomorphic/join.hpp152
-rw-r--r--boost/test/data/monomorphic/singleton.hpp84
-rw-r--r--boost/test/data/monomorphic/zip.hpp130
-rw-r--r--boost/test/data/size.hpp2
-rw-r--r--boost/test/data/test_case.hpp22
-rw-r--r--boost/test/data/traits.hpp87
-rw-r--r--boost/test/debug.hpp2
-rw-r--r--boost/test/debug_config.hpp2
-rw-r--r--boost/test/detail/config.hpp14
-rw-r--r--boost/test/detail/enable_warnings.hpp9
-rw-r--r--boost/test/detail/fwd_decl.hpp2
-rw-r--r--boost/test/detail/global_typedef.hpp15
-rw-r--r--boost/test/detail/log_level.hpp2
-rw-r--r--boost/test/detail/pp_variadic.hpp2
-rw-r--r--boost/test/detail/suppress_warnings.hpp14
-rw-r--r--boost/test/detail/throw_exception.hpp39
-rw-r--r--boost/test/detail/workaround.hpp2
-rw-r--r--boost/test/execution_monitor.hpp14
-rw-r--r--boost/test/floating_point_comparison.hpp2
-rw-r--r--boost/test/framework.hpp15
-rw-r--r--boost/test/impl/compiler_log_formatter.ipp41
-rw-r--r--boost/test/impl/cpp_main.ipp8
-rw-r--r--boost/test/impl/debug.ipp6
-rw-r--r--boost/test/impl/decorator.ipp6
-rw-r--r--boost/test/impl/execution_monitor.ipp16
-rw-r--r--boost/test/impl/framework.ipp98
-rw-r--r--boost/test/impl/plain_report_formatter.ipp14
-rw-r--r--boost/test/impl/progress_monitor.ipp30
-rw-r--r--boost/test/impl/results_collector.ipp2
-rw-r--r--boost/test/impl/results_reporter.ipp31
-rw-r--r--boost/test/impl/test_main.ipp2
-rw-r--r--boost/test/impl/test_tools.ipp9
-rw-r--r--boost/test/impl/test_tree.ipp15
-rw-r--r--boost/test/impl/unit_test_log.ipp16
-rw-r--r--boost/test/impl/unit_test_main.ipp27
-rw-r--r--boost/test/impl/unit_test_monitor.ipp14
-rw-r--r--boost/test/impl/unit_test_parameters.ipp1085
-rw-r--r--boost/test/impl/xml_log_formatter.ipp45
-rw-r--r--boost/test/impl/xml_report_formatter.ipp25
-rw-r--r--boost/test/included/execution_monitor.hpp2
-rw-r--r--boost/test/included/prg_exec_monitor.hpp2
-rw-r--r--boost/test/included/test_exec_monitor.hpp2
-rw-r--r--boost/test/included/unit_test.hpp2
-rw-r--r--boost/test/included/unit_test_framework.hpp2
-rw-r--r--boost/test/minimal.hpp2
-rw-r--r--boost/test/output/compiler_log_formatter.hpp7
-rw-r--r--boost/test/output/plain_report_formatter.hpp5
-rw-r--r--boost/test/output/xml_log_formatter.hpp2
-rw-r--r--boost/test/output/xml_report_formatter.hpp2
-rw-r--r--boost/test/output_test_stream.hpp2
-rw-r--r--boost/test/parameterized_test.hpp2
-rw-r--r--boost/test/predicate_result.hpp2
-rw-r--r--boost/test/prg_exec_monitor.hpp2
-rw-r--r--boost/test/progress_monitor.hpp2
-rw-r--r--boost/test/results_collector.hpp2
-rw-r--r--boost/test/results_reporter.hpp2
-rw-r--r--boost/test/test_case_template.hpp2
-rw-r--r--boost/test/test_exec_monitor.hpp2
-rw-r--r--boost/test/test_tools.hpp17
-rw-r--r--boost/test/tools/assertion.hpp15
-rw-r--r--boost/test/tools/assertion_result.hpp2
-rw-r--r--boost/test/tools/collection_comparison_op.hpp23
-rw-r--r--boost/test/tools/context.hpp2
-rw-r--r--boost/test/tools/cstring_comparison_op.hpp2
-rw-r--r--boost/test/tools/detail/bitwise_manip.hpp2
-rw-r--r--boost/test/tools/detail/expression_holder.hpp2
-rw-r--r--boost/test/tools/detail/fwd.hpp2
-rw-r--r--boost/test/tools/detail/indirections.hpp2
-rw-r--r--boost/test/tools/detail/it_pair.hpp2
-rw-r--r--boost/test/tools/detail/lexicographic_manip.hpp2
-rw-r--r--boost/test/tools/detail/per_element_manip.hpp2
-rw-r--r--boost/test/tools/detail/print_helper.hpp2
-rw-r--r--boost/test/tools/detail/tolerance_manip.hpp4
-rw-r--r--boost/test/tools/floating_point_comparison.hpp4
-rw-r--r--boost/test/tools/fpc_op.hpp16
-rw-r--r--boost/test/tools/fpc_tolerance.hpp2
-rw-r--r--boost/test/tools/interface.hpp2
-rw-r--r--boost/test/tools/old/impl.hpp2
-rw-r--r--boost/test/tools/old/interface.hpp26
-rw-r--r--boost/test/tools/output_test_stream.hpp2
-rw-r--r--boost/test/tree/auto_registration.hpp2
-rw-r--r--boost/test/tree/decorator.hpp2
-rw-r--r--boost/test/tree/fixture.hpp2
-rw-r--r--boost/test/tree/global_fixture.hpp2
-rw-r--r--boost/test/tree/observer.hpp4
-rw-r--r--boost/test/tree/test_case_counter.hpp2
-rw-r--r--boost/test/tree/test_case_template.hpp2
-rw-r--r--boost/test/tree/test_unit.hpp10
-rw-r--r--boost/test/tree/traverse.hpp2
-rw-r--r--boost/test/tree/visitor.hpp2
-rw-r--r--boost/test/unit_test.hpp2
-rw-r--r--boost/test/unit_test_log.hpp2
-rw-r--r--boost/test/unit_test_log_formatter.hpp2
-rw-r--r--boost/test/unit_test_monitor.hpp2
-rw-r--r--boost/test/unit_test_parameters.hpp142
-rw-r--r--boost/test/unit_test_suite.hpp11
-rw-r--r--boost/test/utils/algorithm.hpp7
-rw-r--r--boost/test/utils/assign_op.hpp2
-rw-r--r--boost/test/utils/basic_cstring/basic_cstring.hpp2
-rw-r--r--boost/test/utils/basic_cstring/basic_cstring_fwd.hpp2
-rw-r--r--boost/test/utils/basic_cstring/bcs_char_traits.hpp2
-rw-r--r--boost/test/utils/basic_cstring/compare.hpp2
-rw-r--r--boost/test/utils/basic_cstring/io.hpp2
-rw-r--r--boost/test/utils/class_properties.hpp2
-rw-r--r--boost/test/utils/custom_manip.hpp4
-rw-r--r--boost/test/utils/fixed_mapping.hpp120
-rw-r--r--boost/test/utils/foreach.hpp2
-rw-r--r--boost/test/utils/is_cstring.hpp2
-rw-r--r--boost/test/utils/is_forward_iterable.hpp130
-rw-r--r--boost/test/utils/iterator/ifstream_line_iterator.hpp105
-rw-r--r--boost/test/utils/iterator/input_iterator_facade.hpp7
-rw-r--r--boost/test/utils/iterator/istream_line_iterator.hpp93
-rw-r--r--boost/test/utils/iterator/token_iterator.hpp23
-rw-r--r--boost/test/utils/lazy_ostream.hpp4
-rw-r--r--boost/test/utils/named_params.hpp228
-rw-r--r--boost/test/utils/nullstream.hpp2
-rw-r--r--boost/test/utils/rtti.hpp4
-rw-r--r--boost/test/utils/runtime/argument.hpp119
-rw-r--r--boost/test/utils/runtime/argument_factory.hpp242
-rw-r--r--boost/test/utils/runtime/cla/argument_factory.hpp216
-rw-r--r--boost/test/utils/runtime/cla/argv_traverser.cpp16
-rw-r--r--boost/test/utils/runtime/cla/argv_traverser.hpp133
-rw-r--r--boost/test/utils/runtime/cla/argv_traverser.ipp212
-rw-r--r--boost/test/utils/runtime/cla/basic_parameter.hpp85
-rw-r--r--boost/test/utils/runtime/cla/char_parameter.cpp16
-rw-r--r--boost/test/utils/runtime/cla/char_parameter.hpp100
-rw-r--r--boost/test/utils/runtime/cla/char_parameter.ipp57
-rw-r--r--boost/test/utils/runtime/cla/detail/argument_value_usage.hpp81
-rw-r--r--boost/test/utils/runtime/cla/dual_name_parameter.cpp16
-rw-r--r--boost/test/utils/runtime/cla/dual_name_parameter.hpp98
-rw-r--r--boost/test/utils/runtime/cla/dual_name_parameter.ipp90
-rw-r--r--boost/test/utils/runtime/cla/fwd.hpp55
-rw-r--r--boost/test/utils/runtime/cla/id_policy.cpp16
-rw-r--r--boost/test/utils/runtime/cla/id_policy.hpp147
-rw-r--r--boost/test/utils/runtime/cla/id_policy.ipp118
-rw-r--r--boost/test/utils/runtime/cla/iface/argument_factory.hpp51
-rw-r--r--boost/test/utils/runtime/cla/iface/id_policy.hpp73
-rw-r--r--boost/test/utils/runtime/cla/modifier.hpp69
-rw-r--r--boost/test/utils/runtime/cla/named_parameter.cpp16
-rw-r--r--boost/test/utils/runtime/cla/named_parameter.hpp95
-rw-r--r--boost/test/utils/runtime/cla/named_parameter.ipp129
-rw-r--r--boost/test/utils/runtime/cla/parameter.hpp151
-rw-r--r--boost/test/utils/runtime/cla/parser.cpp18
-rw-r--r--boost/test/utils/runtime/cla/parser.hpp515
-rw-r--r--boost/test/utils/runtime/cla/parser.ipp267
-rw-r--r--boost/test/utils/runtime/cla/positional_parameter.hpp91
-rw-r--r--boost/test/utils/runtime/cla/typed_parameter.hpp70
-rw-r--r--boost/test/utils/runtime/cla/validation.cpp16
-rw-r--r--boost/test/utils/runtime/cla/validation.hpp57
-rw-r--r--boost/test/utils/runtime/cla/validation.ipp61
-rw-r--r--boost/test/utils/runtime/cla/value_generator.hpp81
-rw-r--r--boost/test/utils/runtime/cla/value_handler.hpp57
-rw-r--r--boost/test/utils/runtime/config.hpp162
-rw-r--r--boost/test/utils/runtime/configuration.hpp61
-rw-r--r--boost/test/utils/runtime/env/environment.cpp23
-rw-r--r--boost/test/utils/runtime/env/environment.hpp171
-rw-r--r--boost/test/utils/runtime/env/environment.ipp125
-rw-r--r--boost/test/utils/runtime/env/fetch.hpp108
-rw-r--r--boost/test/utils/runtime/env/fwd.hpp61
-rw-r--r--boost/test/utils/runtime/env/modifier.hpp47
-rw-r--r--boost/test/utils/runtime/env/variable.hpp223
-rw-r--r--boost/test/utils/runtime/errors.hpp195
-rw-r--r--boost/test/utils/runtime/file/config_file.cpp249
-rw-r--r--boost/test/utils/runtime/file/config_file.hpp182
-rw-r--r--boost/test/utils/runtime/file/config_file_iterator.cpp685
-rw-r--r--boost/test/utils/runtime/file/config_file_iterator.hpp166
-rw-r--r--boost/test/utils/runtime/finalize.hpp56
-rw-r--r--boost/test/utils/runtime/fwd.hpp24
-rw-r--r--boost/test/utils/runtime/interpret_argument_value.hpp163
-rw-r--r--boost/test/utils/runtime/modifier.hpp101
-rw-r--r--boost/test/utils/runtime/parameter.hpp450
-rw-r--r--boost/test/utils/runtime/trace.hpp30
-rw-r--r--boost/test/utils/runtime/validation.hpp85
-rw-r--r--boost/test/utils/setcolor.hpp13
-rw-r--r--boost/test/utils/string_cast.hpp69
-rw-r--r--boost/test/utils/trivial_singleton.hpp2
-rw-r--r--boost/test/utils/wrap_stringstream.hpp2
-rw-r--r--boost/test/utils/xml_printer.hpp39
-rw-r--r--boost/thread/concurrent_queues/sync_queue.hpp7
-rw-r--r--boost/thread/concurrent_queues/sync_timed_queue.hpp2
-rw-r--r--boost/thread/csbl/devector.hpp8
-rw-r--r--boost/thread/detail/invoker.hpp36
-rw-r--r--boost/thread/detail/move.hpp19
-rw-r--r--boost/thread/detail/nullary_function.hpp2
-rw-r--r--boost/thread/detail/thread.hpp7
-rw-r--r--boost/thread/detail/thread_group.hpp3
-rw-r--r--boost/thread/executors/basic_thread_pool.hpp31
-rw-r--r--boost/thread/executors/executor.hpp5
-rw-r--r--boost/thread/executors/executor_adaptor.hpp9
-rw-r--r--boost/thread/executors/generic_executor_ref.hpp20
-rw-r--r--boost/thread/executors/loop_executor.hpp18
-rw-r--r--boost/thread/executors/serial_executor.hpp15
-rw-r--r--boost/thread/executors/serial_executor_cont.hpp2
-rw-r--r--boost/thread/executors/thread_executor.hpp1
-rwxr-xr-xboost/thread/experimental/parallel/v2/task_region.hpp2
-rw-r--r--boost/thread/future.hpp1379
-rw-r--r--boost/thread/futures/launch.hpp1
-rw-r--r--boost/thread/latch.hpp3
-rw-r--r--boost/thread/poly_lockable.hpp4
-rw-r--r--boost/thread/pthread/condition_variable.hpp141
-rw-r--r--boost/thread/pthread/condition_variable_fwd.hpp170
-rw-r--r--boost/thread/pthread/once_atomic.hpp4
-rw-r--r--boost/thread/shared_mutex.hpp1
-rw-r--r--boost/thread/v2/thread.hpp17
-rw-r--r--boost/thread/win32/condition_variable.hpp16
-rw-r--r--boost/thread/win32/shared_mutex.hpp4
-rw-r--r--boost/thread/win32/thread_data.hpp26
-rw-r--r--boost/thread/win32/thread_primitives.hpp42
-rw-r--r--boost/timer/timer.hpp2
-rw-r--r--boost/type_erasure/binding.hpp36
-rw-r--r--boost/type_erasure/detail/adapt_to_vtable.hpp38
-rw-r--r--boost/type_erasure/detail/auto_link.hpp38
-rw-r--r--boost/type_erasure/detail/check_map.hpp2
-rw-r--r--boost/type_erasure/detail/dynamic_vtable.hpp172
-rw-r--r--boost/type_erasure/detail/rebind_placeholders.hpp1
-rw-r--r--boost/type_erasure/detail/storage.hpp4
-rw-r--r--boost/type_erasure/dynamic_any_cast.hpp234
-rw-r--r--boost/type_erasure/dynamic_binding.hpp46
-rw-r--r--boost/type_erasure/is_placeholder.hpp7
-rw-r--r--boost/type_erasure/iterator.hpp7
-rw-r--r--boost/type_erasure/register_binding.hpp169
-rw-r--r--boost/type_traits.hpp72
-rw-r--r--boost/type_traits/add_const.hpp17
-rw-r--r--boost/type_traits/add_cv.hpp9
-rw-r--r--boost/type_traits/add_lvalue_reference.hpp15
-rw-r--r--boost/type_traits/add_pointer.hpp23
-rw-r--r--boost/type_traits/add_reference.hpp41
-rw-r--r--boost/type_traits/add_rvalue_reference.hpp10
-rw-r--r--boost/type_traits/add_volatile.hpp9
-rw-r--r--[-rwxr-xr-x]boost/type_traits/aligned_storage.hpp143
-rw-r--r--boost/type_traits/alignment_of.hpp25
-rw-r--r--boost/type_traits/broken_compiler_spec.hpp17
-rw-r--r--boost/type_traits/common_type.hpp249
-rw-r--r--boost/type_traits/conditional.hpp9
-rw-r--r--boost/type_traits/config.hpp61
-rw-r--r--boost/type_traits/copy_cv.hpp34
-rw-r--r--[-rwxr-xr-x]boost/type_traits/decay.hpp25
-rw-r--r--boost/type_traits/declval.hpp44
-rw-r--r--boost/type_traits/detail/bool_trait_def.hpp23
-rw-r--r--boost/type_traits/detail/common_arithmetic_type.hpp212
-rw-r--r--boost/type_traits/detail/common_type_imp.hpp333
-rw-r--r--boost/type_traits/detail/common_type_impl.hpp107
-rw-r--r--boost/type_traits/detail/composite_member_pointer_type.hpp113
-rw-r--r--boost/type_traits/detail/composite_pointer_type.hpp153
-rw-r--r--boost/type_traits/detail/config.hpp72
-rw-r--r--boost/type_traits/detail/cv_traits_impl.hpp140
-rw-r--r--boost/type_traits/detail/false_result.hpp28
-rw-r--r--boost/type_traits/detail/has_binary_operator.hpp23
-rw-r--r--boost/type_traits/detail/has_postfix_operator.hpp23
-rw-r--r--boost/type_traits/detail/has_prefix_operator.hpp25
-rw-r--r--boost/type_traits/detail/ice_and.hpp7
-rw-r--r--boost/type_traits/detail/ice_eq.hpp7
-rw-r--r--boost/type_traits/detail/ice_not.hpp7
-rw-r--r--boost/type_traits/detail/ice_or.hpp7
-rw-r--r--boost/type_traits/detail/is_function_ptr_helper.hpp18
-rw-r--r--boost/type_traits/detail/is_function_ptr_tester.hpp17
-rw-r--r--boost/type_traits/detail/is_mem_fun_pointer_impl.hpp16
-rw-r--r--boost/type_traits/detail/is_mem_fun_pointer_tester.hpp18
-rw-r--r--boost/type_traits/detail/mp_defer.hpp56
-rw-r--r--boost/type_traits/detail/size_t_trait_def.hpp51
-rw-r--r--boost/type_traits/detail/size_t_trait_undef.hpp16
-rw-r--r--boost/type_traits/detail/template_arity_spec.hpp27
-rw-r--r--boost/type_traits/detail/type_trait_def.hpp67
-rw-r--r--boost/type_traits/detail/type_trait_undef.hpp19
-rw-r--r--boost/type_traits/detail/wrap.hpp18
-rw-r--r--boost/type_traits/extent.hpp7
-rw-r--r--boost/type_traits/floating_point_promotion.hpp81
-rw-r--r--boost/type_traits/has_bit_and.hpp38
-rw-r--r--boost/type_traits/has_bit_and_assign.hpp46
-rw-r--r--boost/type_traits/has_bit_or.hpp38
-rw-r--r--boost/type_traits/has_bit_or_assign.hpp46
-rw-r--r--boost/type_traits/has_bit_xor.hpp38
-rw-r--r--boost/type_traits/has_bit_xor_assign.hpp46
-rw-r--r--boost/type_traits/has_complement.hpp14
-rw-r--r--boost/type_traits/has_dereference.hpp10
-rw-r--r--boost/type_traits/has_divides.hpp28
-rw-r--r--boost/type_traits/has_divides_assign.hpp36
-rw-r--r--boost/type_traits/has_equal_to.hpp40
-rw-r--r--boost/type_traits/has_greater.hpp40
-rw-r--r--boost/type_traits/has_greater_equal.hpp40
-rw-r--r--boost/type_traits/has_left_shift.hpp38
-rw-r--r--boost/type_traits/has_left_shift_assign.hpp46
-rw-r--r--boost/type_traits/has_less.hpp40
-rw-r--r--boost/type_traits/has_less_equal.hpp40
-rw-r--r--boost/type_traits/has_logical_and.hpp32
-rw-r--r--boost/type_traits/has_logical_or.hpp32
-rw-r--r--boost/type_traits/has_minus.hpp58
-rw-r--r--boost/type_traits/has_minus_assign.hpp58
-rw-r--r--boost/type_traits/has_modulus.hpp38
-rw-r--r--boost/type_traits/has_modulus_assign.hpp46
-rw-r--r--boost/type_traits/has_multiplies.hpp28
-rw-r--r--boost/type_traits/has_multiplies_assign.hpp36
-rw-r--r--boost/type_traits/has_new_operator.hpp23
-rw-r--r--boost/type_traits/has_not_equal_to.hpp40
-rw-r--r--boost/type_traits/has_nothrow_assign.hpp75
-rw-r--r--boost/type_traits/has_nothrow_constructor.hpp67
-rw-r--r--boost/type_traits/has_nothrow_copy.hpp75
-rw-r--r--boost/type_traits/has_nothrow_destructor.hpp30
-rw-r--r--boost/type_traits/has_plus.hpp46
-rw-r--r--boost/type_traits/has_plus_assign.hpp62
-rw-r--r--boost/type_traits/has_post_decrement.hpp22
-rw-r--r--boost/type_traits/has_post_increment.hpp22
-rw-r--r--boost/type_traits/has_pre_decrement.hpp22
-rw-r--r--boost/type_traits/has_pre_increment.hpp22
-rw-r--r--boost/type_traits/has_right_shift.hpp38
-rw-r--r--boost/type_traits/has_right_shift_assign.hpp46
-rw-r--r--boost/type_traits/has_trivial_assign.hpp52
-rw-r--r--boost/type_traits/has_trivial_constructor.hpp56
-rw-r--r--boost/type_traits/has_trivial_copy.hpp82
-rw-r--r--boost/type_traits/has_trivial_destructor.hpp43
-rw-r--r--boost/type_traits/has_trivial_move_assign.hpp65
-rw-r--r--boost/type_traits/has_trivial_move_constructor.hpp70
-rw-r--r--boost/type_traits/has_virtual_destructor.hpp9
-rw-r--r--boost/type_traits/integral_constant.hpp107
-rw-r--r--boost/type_traits/integral_promotion.hpp33
-rw-r--r--boost/type_traits/intrinsics.hpp126
-rw-r--r--boost/type_traits/is_abstract.hpp12
-rw-r--r--boost/type_traits/is_arithmetic.hpp35
-rw-r--r--boost/type_traits/is_array.hpp29
-rw-r--r--boost/type_traits/is_assignable.hpp76
-rw-r--r--boost/type_traits/is_base_and_derived.hpp24
-rw-r--r--boost/type_traits/is_base_of.hpp26
-rw-r--r--boost/type_traits/is_base_of_tr1.hpp23
-rw-r--r--boost/type_traits/is_class.hpp49
-rw-r--r--boost/type_traits/is_complex.hpp22
-rw-r--r--boost/type_traits/is_compound.hpp26
-rw-r--r--boost/type_traits/is_const.hpp60
-rw-r--r--boost/type_traits/is_constructible.hpp80
-rw-r--r--boost/type_traits/is_convertible.hpp124
-rw-r--r--boost/type_traits/is_copy_assignable.hpp18
-rw-r--r--boost/type_traits/is_copy_constructible.hpp222
-rw-r--r--boost/type_traits/is_default_constructible.hpp64
-rw-r--r--boost/type_traits/is_destructible.hpp60
-rw-r--r--boost/type_traits/is_empty.hpp38
-rw-r--r--boost/type_traits/is_enum.hpp56
-rw-r--r--boost/type_traits/is_final.hpp23
-rw-r--r--boost/type_traits/is_float.hpp11
-rw-r--r--[-rwxr-xr-x]boost/type_traits/is_floating_point.hpp21
-rw-r--r--boost/type_traits/is_function.hpp21
-rw-r--r--boost/type_traits/is_fundamental.hpp23
-rw-r--r--boost/type_traits/is_integral.hpp75
-rw-r--r--boost/type_traits/is_lvalue_reference.hpp20
-rw-r--r--boost/type_traits/is_member_function_pointer.hpp43
-rw-r--r--[-rwxr-xr-x]boost/type_traits/is_member_object_pointer.hpp28
-rw-r--r--boost/type_traits/is_member_pointer.hpp34
-rw-r--r--boost/type_traits/is_nothrow_move_assignable.hpp77
-rw-r--r--boost/type_traits/is_nothrow_move_constructible.hpp99
-rw-r--r--boost/type_traits/is_object.hpp31
-rw-r--r--boost/type_traits/is_pod.hpp49
-rw-r--r--boost/type_traits/is_pointer.hpp65
-rw-r--r--boost/type_traits/is_polymorphic.hpp19
-rw-r--r--boost/type_traits/is_reference.hpp27
-rw-r--r--boost/type_traits/is_rvalue_reference.hpp12
-rw-r--r--boost/type_traits/is_same.hpp12
-rw-r--r--boost/type_traits/is_scalar.hpp34
-rw-r--r--boost/type_traits/is_signed.hpp139
-rw-r--r--boost/type_traits/is_stateless.hpp31
-rw-r--r--boost/type_traits/is_union.hpp38
-rw-r--r--boost/type_traits/is_unsigned.hpp142
-rw-r--r--boost/type_traits/is_virtual_base_of.hpp24
-rw-r--r--boost/type_traits/is_void.hpp26
-rw-r--r--boost/type_traits/is_volatile.hpp59
-rw-r--r--boost/type_traits/make_signed.hpp90
-rw-r--r--boost/type_traits/make_unsigned.hpp89
-rw-r--r--boost/type_traits/promote.hpp22
-rw-r--r--boost/type_traits/rank.hpp9
-rw-r--r--boost/type_traits/remove_all_extents.hpp23
-rw-r--r--boost/type_traits/remove_bounds.hpp27
-rw-r--r--boost/type_traits/remove_const.hpp62
-rw-r--r--boost/type_traits/remove_cv.hpp49
-rw-r--r--boost/type_traits/remove_extent.hpp23
-rw-r--r--boost/type_traits/remove_pointer.hpp18
-rw-r--r--boost/type_traits/remove_reference.hpp15
-rw-r--r--boost/type_traits/remove_volatile.hpp57
-rw-r--r--boost/type_traits/transform_traits_spec.hpp14
-rw-r--r--boost/type_traits/type_identity.hpp22
-rw-r--r--boost/type_traits/type_with_alignment.hpp276
-rw-r--r--boost/utility/declval.hpp33
-rw-r--r--boost/utility/string_ref.hpp6
-rw-r--r--boost/uuid/detail/config.hpp22
-rw-r--r--boost/uuid/detail/uuid_x86.hpp30
-rw-r--r--boost/uuid/seed_rng.hpp5
-rw-r--r--boost/variant/detail/bool_trait_def.hpp30
-rw-r--r--boost/variant/detail/bool_trait_undef.hpp21
-rw-r--r--boost/variant/variant.hpp5
-rw-r--r--boost/version.hpp4
-rw-r--r--boost/vmd/array.hpp18
-rw-r--r--boost/vmd/array/to_seq.hpp49
-rw-r--r--boost/vmd/array/to_tuple.hpp49
-rw-r--r--boost/vmd/assert.hpp58
-rw-r--r--boost/vmd/assert_is_array.hpp113
-rw-r--r--boost/vmd/assert_is_empty.hpp105
-rw-r--r--boost/vmd/assert_is_identifier.hpp158
-rw-r--r--boost/vmd/assert_is_list.hpp113
-rw-r--r--boost/vmd/assert_is_number.hpp73
-rw-r--r--boost/vmd/assert_is_seq.hpp113
-rw-r--r--boost/vmd/assert_is_tuple.hpp73
-rw-r--r--boost/vmd/assert_is_type.hpp113
-rw-r--r--boost/vmd/detail/adjust_tuple_type.hpp97
-rw-r--r--boost/vmd/detail/array.hpp189
-rw-r--r--boost/vmd/detail/assert.hpp69
-rw-r--r--boost/vmd/detail/data_equal.hpp202
-rw-r--r--boost/vmd/detail/data_equal_common.hpp409
-rw-r--r--boost/vmd/detail/empty_result.hpp12
-rw-r--r--boost/vmd/detail/equal.hpp562
-rw-r--r--boost/vmd/detail/equal_common.hpp153
-rw-r--r--boost/vmd/detail/equal_type.hpp21
-rw-r--r--boost/vmd/detail/identifier.hpp429
-rw-r--r--boost/vmd/detail/identifier_concat.hpp21
-rw-r--r--boost/vmd/detail/identifier_type.hpp118
-rw-r--r--boost/vmd/detail/idprefix.hpp14
-rw-r--r--boost/vmd/detail/is_array.hpp41
-rw-r--r--boost/vmd/detail/is_array_common.hpp248
-rw-r--r--boost/vmd/detail/is_empty.hpp61
-rw-r--r--boost/vmd/detail/is_empty_array.hpp20
-rw-r--r--boost/vmd/detail/is_empty_tuple.hpp74
-rw-r--r--boost/vmd/detail/is_entire.hpp23
-rw-r--r--boost/vmd/detail/is_identifier.hpp96
-rw-r--r--boost/vmd/detail/is_list.hpp207
-rw-r--r--boost/vmd/detail/is_number.hpp38
-rw-r--r--boost/vmd/detail/is_seq.hpp27
-rw-r--r--boost/vmd/detail/is_tuple.hpp20
-rw-r--r--boost/vmd/detail/is_type.hpp57
-rw-r--r--boost/vmd/detail/is_type_type.hpp25
-rw-r--r--boost/vmd/detail/list.hpp212
-rw-r--r--boost/vmd/detail/match_identifier.hpp160
-rw-r--r--boost/vmd/detail/match_identifier_common.hpp37
-rw-r--r--boost/vmd/detail/match_single_identifier.hpp16
-rw-r--r--boost/vmd/detail/modifiers.hpp104
-rw-r--r--boost/vmd/detail/mods.hpp707
-rw-r--r--boost/vmd/detail/nil_registration.hpp13
-rw-r--r--boost/vmd/detail/not_empty.hpp20
-rw-r--r--boost/vmd/detail/number_registration.hpp784
-rw-r--r--boost/vmd/detail/only_after.hpp37
-rw-r--r--boost/vmd/detail/parens.hpp54
-rw-r--r--boost/vmd/detail/parens_common.hpp21
-rw-r--r--boost/vmd/detail/parens_split.hpp24
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_1.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_10.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_11.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_12.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_13.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_14.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_15.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_16.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_2.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_3.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_4.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_5.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_6.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_7.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_8.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_9.hpp185
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp22
-rw-r--r--boost/vmd/detail/recurse/data_equal/data_equal_specific.hpp185
-rw-r--r--boost/vmd/detail/recurse/equal/equal_1.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_10.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_11.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_12.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_13.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_14.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_15.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_16.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_2.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_3.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_4.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_5.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_6.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_7.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_8.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_9.hpp282
-rw-r--r--boost/vmd/detail/recurse/equal/equal_headers.hpp23
-rw-r--r--boost/vmd/detail/seq.hpp236
-rw-r--r--boost/vmd/detail/sequence_arity.hpp66
-rw-r--r--boost/vmd/detail/sequence_common.hpp766
-rw-r--r--boost/vmd/detail/sequence_elem.hpp985
-rw-r--r--boost/vmd/detail/sequence_enum.hpp40
-rw-r--r--boost/vmd/detail/sequence_size.hpp21
-rw-r--r--boost/vmd/detail/sequence_to_array.hpp47
-rw-r--r--boost/vmd/detail/sequence_to_list.hpp47
-rw-r--r--boost/vmd/detail/sequence_to_seq.hpp45
-rw-r--r--boost/vmd/detail/sequence_to_tuple.hpp45
-rw-r--r--boost/vmd/detail/sequence_type.hpp274
-rw-r--r--boost/vmd/detail/setup.hpp41
-rw-r--r--boost/vmd/detail/tuple.hpp196
-rw-r--r--boost/vmd/detail/type_registration.hpp43
-rw-r--r--boost/vmd/detail/variadic_pop_front.hpp24
-rw-r--r--boost/vmd/elem.hpp292
-rw-r--r--boost/vmd/empty.hpp41
-rw-r--r--boost/vmd/enum.hpp103
-rw-r--r--boost/vmd/equal.hpp89
-rw-r--r--boost/vmd/get_type.hpp123
-rw-r--r--boost/vmd/identity.hpp76
-rw-r--r--boost/vmd/is_array.hpp73
-rw-r--r--boost/vmd/is_empty.hpp95
-rw-r--r--boost/vmd/is_empty_array.hpp98
-rw-r--r--boost/vmd/is_empty_list.hpp73
-rw-r--r--boost/vmd/is_identifier.hpp117
-rw-r--r--boost/vmd/is_list.hpp73
-rw-r--r--boost/vmd/is_multi.hpp67
-rw-r--r--boost/vmd/is_number.hpp52
-rw-r--r--boost/vmd/is_parens_empty.hpp73
-rw-r--r--boost/vmd/is_seq.hpp71
-rw-r--r--boost/vmd/is_tuple.hpp45
-rw-r--r--boost/vmd/is_type.hpp73
-rw-r--r--boost/vmd/is_unary.hpp67
-rw-r--r--boost/vmd/list.hpp18
-rw-r--r--boost/vmd/list/to_seq.hpp49
-rw-r--r--boost/vmd/list/to_tuple.hpp49
-rw-r--r--boost/vmd/not_equal.hpp94
-rw-r--r--boost/vmd/seq.hpp26
-rw-r--r--boost/vmd/seq/is_vmd_seq.hpp56
-rw-r--r--boost/vmd/seq/pop_back.hpp51
-rw-r--r--boost/vmd/seq/pop_front.hpp51
-rw-r--r--boost/vmd/seq/push_back.hpp53
-rw-r--r--boost/vmd/seq/push_front.hpp53
-rw-r--r--boost/vmd/seq/remove.hpp57
-rw-r--r--boost/vmd/seq/size.hpp52
-rw-r--r--boost/vmd/seq/to_array.hpp52
-rw-r--r--boost/vmd/seq/to_list.hpp65
-rw-r--r--boost/vmd/seq/to_tuple.hpp49
-rw-r--r--boost/vmd/size.hpp57
-rw-r--r--boost/vmd/to_array.hpp101
-rw-r--r--boost/vmd/to_list.hpp101
-rw-r--r--boost/vmd/to_seq.hpp101
-rw-r--r--boost/vmd/to_tuple.hpp101
-rw-r--r--boost/vmd/tuple.hpp26
-rw-r--r--boost/vmd/tuple/is_vmd_tuple.hpp56
-rw-r--r--boost/vmd/tuple/pop_back.hpp73
-rw-r--r--boost/vmd/tuple/pop_front.hpp73
-rw-r--r--boost/vmd/tuple/push_back.hpp53
-rw-r--r--boost/vmd/tuple/push_front.hpp53
-rw-r--r--boost/vmd/tuple/remove.hpp84
-rw-r--r--boost/vmd/tuple/size.hpp52
-rw-r--r--boost/vmd/tuple/to_array.hpp52
-rw-r--r--boost/vmd/tuple/to_list.hpp52
-rw-r--r--boost/vmd/tuple/to_seq.hpp49
-rw-r--r--boost/vmd/vmd.hpp54
1492 files changed, 62037 insertions, 25615 deletions
diff --git a/boost/align.hpp b/boost/align.hpp
index 0b3221dffc..ce8f78d343 100644
--- a/boost/align.hpp
+++ b/boost/align.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014-2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/align.hpp b/boost/align/align.hpp
index b95d673bcd..648a65e295 100644
--- a/boost/align/align.hpp
+++ b/boost/align/align.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/aligned_alloc.hpp b/boost/align/aligned_alloc.hpp
index 0e3ba60641..b70f4bc632 100644
--- a/boost/align/aligned_alloc.hpp
+++ b/boost/align/aligned_alloc.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/aligned_allocator.hpp b/boost/align/aligned_allocator.hpp
index a31dfe599f..9655e3dfb2 100644
--- a/boost/align/aligned_allocator.hpp
+++ b/boost/align/aligned_allocator.hpp
@@ -1,6 +1,6 @@
/*
-(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+(c) 2014-2015 Glen Joseph Fernandes
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -17,8 +17,8 @@ http://boost.org/LICENSE_1_0.txt
#include <boost/align/alignment_of.hpp>
#include <boost/align/detail/addressof.hpp>
#include <boost/align/detail/is_alignment_constant.hpp>
-#include <boost/align/detail/max_align.hpp>
-#include <boost/align/detail/max_count_of.hpp>
+#include <boost/align/detail/max_objects.hpp>
+#include <boost/align/detail/max_size.hpp>
#include <new>
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
@@ -46,7 +46,7 @@ public:
private:
enum {
- min_align = detail::max_align<Alignment,
+ min_align = detail::max_size<Alignment,
alignment_of<value_type>::value>::value
};
@@ -57,7 +57,7 @@ public:
};
#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
- aligned_allocator() BOOST_NOEXCEPT = default;
+ aligned_allocator() = default;
#else
aligned_allocator() BOOST_NOEXCEPT {
}
@@ -79,18 +79,18 @@ public:
pointer allocate(size_type size, const_void_pointer = 0) {
void* p = aligned_alloc(min_align, sizeof(T) * size);
- if (!p && size > 0) {
- boost::throw_exception(std::bad_alloc());
+ if (size > 0 && !p) {
+ ::boost::throw_exception(std::bad_alloc());
}
return static_cast<T*>(p);
}
void deallocate(pointer ptr, size_type) {
- alignment::aligned_free(ptr);
+ ::boost::alignment::aligned_free(ptr);
}
BOOST_CONSTEXPR size_type max_size() const BOOST_NOEXCEPT {
- return detail::max_count_of<T>::value;
+ return detail::max_objects<T>::value;
}
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
@@ -160,7 +160,7 @@ inline bool operator!=(const aligned_allocator<T1,
return false;
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/aligned_allocator_adaptor.hpp b/boost/align/aligned_allocator_adaptor.hpp
index ac77b4ab9e..19777173f1 100644
--- a/boost/align/aligned_allocator_adaptor.hpp
+++ b/boost/align/aligned_allocator_adaptor.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014-2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -17,6 +17,7 @@ http://boost.org/LICENSE_1_0.txt
#include <boost/align/detail/addressof.hpp>
#include <boost/align/detail/is_alignment_constant.hpp>
#include <boost/align/detail/max_align.hpp>
+#include <boost/align/detail/max_size.hpp>
#include <new>
#if !defined(BOOST_NO_CXX11_ALLOCATOR)
@@ -74,9 +75,8 @@ public:
private:
enum {
- min_align = detail::max_align<Alignment,
- detail::max_align<alignment_of<value_type>::value,
- alignment_of<char_ptr>::value>::value>::value
+ min_align = detail::max_size<Alignment,
+ detail::max_align<value_type, char_ptr>::value>::value
};
public:
@@ -184,7 +184,7 @@ inline bool operator!=(const aligned_allocator_adaptor<A1,
return !(a == b);
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/aligned_allocator_adaptor_forward.hpp b/boost/align/aligned_allocator_adaptor_forward.hpp
index 327d7edbf9..d606f09920 100644
--- a/boost/align/aligned_allocator_adaptor_forward.hpp
+++ b/boost/align/aligned_allocator_adaptor_forward.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -17,7 +17,7 @@ namespace alignment {
template<class Allocator, std::size_t Alignment = 1>
class aligned_allocator_adaptor;
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/aligned_allocator_forward.hpp b/boost/align/aligned_allocator_forward.hpp
index 9a3f3635db..41f917f38c 100644
--- a/boost/align/aligned_allocator_forward.hpp
+++ b/boost/align/aligned_allocator_forward.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -17,7 +17,7 @@ namespace alignment {
template<class T, std::size_t Alignment = 1>
class aligned_allocator;
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/aligned_delete.hpp b/boost/align/aligned_delete.hpp
index 6d8caed302..c8ad64e4da 100644
--- a/boost/align/aligned_delete.hpp
+++ b/boost/align/aligned_delete.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -23,12 +23,12 @@ public:
BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(ptr->~T())) {
if (ptr) {
ptr->~T();
- alignment::aligned_free(ptr);
+ ::boost::alignment::aligned_free(ptr);
}
}
};
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/aligned_delete_forward.hpp b/boost/align/aligned_delete_forward.hpp
index 530e0970d3..375e576cb5 100644
--- a/boost/align/aligned_delete_forward.hpp
+++ b/boost/align/aligned_delete_forward.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -14,7 +14,7 @@ namespace alignment {
class aligned_delete;
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/alignment_of.hpp b/boost/align/alignment_of.hpp
index 06d22a0259..2531ced105 100644
--- a/boost/align/alignment_of.hpp
+++ b/boost/align/alignment_of.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014-2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -47,7 +47,7 @@ struct alignment_of
type>::type>::type>::type {
};
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/alignment_of_forward.hpp b/boost/align/alignment_of_forward.hpp
index 778a9f73b8..7ab227528b 100644
--- a/boost/align/alignment_of_forward.hpp
+++ b/boost/align/alignment_of_forward.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -15,7 +15,7 @@ namespace alignment {
template<class T>
struct alignment_of;
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/assume_aligned.hpp b/boost/align/assume_aligned.hpp
index 8d730e6d79..8d9f6ccf43 100644
--- a/boost/align/assume_aligned.hpp
+++ b/boost/align/assume_aligned.hpp
@@ -3,7 +3,7 @@
(c) 2015 LRI UMR 8623 CNRS/University Paris Sud XI
(c) 2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -16,7 +16,7 @@ http://boost.org/LICENSE_1_0.txt
#if defined(BOOST_MSVC)
#include <boost/align/detail/assume_aligned_msvc.hpp>
-#elif defined(BOOST_CLANG)
+#elif defined(BOOST_CLANG) && defined(__has_builtin)
#include <boost/align/detail/assume_aligned_clang.hpp>
#elif BOOST_GCC_VERSION >= 40700
#include <boost/align/detail/assume_aligned_gcc.hpp>
diff --git a/boost/align/detail/address.hpp b/boost/align/detail/address.hpp
index 63be1a95d0..b38e571534 100644
--- a/boost/align/detail/address.hpp
+++ b/boost/align/detail/address.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -17,13 +17,13 @@ namespace alignment {
namespace detail {
#if defined(BOOST_HAS_INTPTR_T)
-typedef boost::uintptr_t address_t;
+typedef boost::uintptr_t address;
#else
-typedef std::size_t address_t;
+typedef std::size_t address;
#endif
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/addressof.hpp b/boost/align/detail/addressof.hpp
index 8f0c88204e..50731a70d0 100644
--- a/boost/align/detail/addressof.hpp
+++ b/boost/align/detail/addressof.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -27,8 +27,8 @@ using std::addressof;
using boost::addressof;
#endif
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/align.hpp b/boost/align/detail/align.hpp
index 00be6fd6aa..d2404b3e6d 100644
--- a/boost/align/detail/align.hpp
+++ b/boost/align/detail/align.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -21,7 +21,7 @@ inline void* align(std::size_t alignment, std::size_t size,
void*& ptr, std::size_t& space)
{
BOOST_ASSERT(detail::is_alignment(alignment));
- std::size_t n = detail::address_t(ptr) & (alignment - 1);
+ std::size_t n = detail::address(ptr) & (alignment - 1);
if (n != 0) {
n = alignment - n;
}
@@ -34,7 +34,7 @@ inline void* align(std::size_t alignment, std::size_t size,
return p;
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/align_cxx11.hpp b/boost/align/detail/align_cxx11.hpp
index 80dc7e36a4..a95b84c70f 100644
--- a/boost/align/detail/align_cxx11.hpp
+++ b/boost/align/detail/align_cxx11.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -16,7 +16,7 @@ namespace alignment {
using std::align;
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/aligned_alloc.hpp b/boost/align/detail/aligned_alloc.hpp
index 1852ac15a6..28c0d2938e 100644
--- a/boost/align/detail/aligned_alloc.hpp
+++ b/boost/align/detail/aligned_alloc.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014-2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -48,7 +48,7 @@ inline void aligned_free(void* ptr) BOOST_NOEXCEPT
}
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/aligned_alloc_android.hpp b/boost/align/detail/aligned_alloc_android.hpp
index d97d67989e..2381d8be9c 100644
--- a/boost/align/detail/aligned_alloc_android.hpp
+++ b/boost/align/detail/aligned_alloc_android.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -30,7 +30,7 @@ inline void aligned_free(void* ptr) BOOST_NOEXCEPT
::free(ptr);
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/aligned_alloc_macos.hpp b/boost/align/detail/aligned_alloc_macos.hpp
index 9b6d235133..da3270b084 100644
--- a/boost/align/detail/aligned_alloc_macos.hpp
+++ b/boost/align/detail/aligned_alloc_macos.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -22,7 +22,7 @@ inline void* aligned_alloc(std::size_t alignment, std::size_t size)
BOOST_NOEXCEPT
{
BOOST_ASSERT(detail::is_alignment(alignment));
- if (!size) {
+ if (size == 0) {
return 0;
}
if (alignment < sizeof(void*)) {
@@ -40,7 +40,7 @@ inline void aligned_free(void* ptr) BOOST_NOEXCEPT
::free(ptr);
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/aligned_alloc_msvc.hpp b/boost/align/detail/aligned_alloc_msvc.hpp
index 1cb7f2a3a1..92f4291893 100644
--- a/boost/align/detail/aligned_alloc_msvc.hpp
+++ b/boost/align/detail/aligned_alloc_msvc.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -30,7 +30,7 @@ inline void aligned_free(void* ptr) BOOST_NOEXCEPT
::_aligned_free(ptr);
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/aligned_alloc_posix.hpp b/boost/align/detail/aligned_alloc_posix.hpp
index 3743652cbd..df64d75da3 100644
--- a/boost/align/detail/aligned_alloc_posix.hpp
+++ b/boost/align/detail/aligned_alloc_posix.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -37,7 +37,7 @@ inline void aligned_free(void* ptr) BOOST_NOEXCEPT
::free(ptr);
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/aligned_alloc_sunos.hpp b/boost/align/detail/aligned_alloc_sunos.hpp
index c5778cdd75..0114597bad 100644
--- a/boost/align/detail/aligned_alloc_sunos.hpp
+++ b/boost/align/detail/aligned_alloc_sunos.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -30,7 +30,7 @@ inline void aligned_free(void* ptr) BOOST_NOEXCEPT
::free(ptr);
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/alignment_of.hpp b/boost/align/detail/alignment_of.hpp
index b1d2d56920..2a630e9784 100644
--- a/boost/align/detail/alignment_of.hpp
+++ b/boost/align/detail/alignment_of.hpp
@@ -1,6 +1,6 @@
/*
-(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+(c) 2014-2015 Glen Joseph Fernandes
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -10,20 +10,25 @@ http://boost.org/LICENSE_1_0.txt
#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_HPP
#include <boost/align/detail/min_size.hpp>
-#include <boost/align/detail/offset_object.hpp>
namespace boost {
namespace alignment {
namespace detail {
template<class T>
+struct alignof_helper {
+ char value;
+ T object;
+};
+
+template<class T>
struct alignment_of
: min_size<sizeof(T),
- sizeof(offset_object<T>) - sizeof(T)>::type {
+ sizeof(alignof_helper<T>) - sizeof(T)>::type {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/alignment_of_clang.hpp b/boost/align/detail/alignment_of_clang.hpp
index fa96a37d9d..a8e2a349d6 100644
--- a/boost/align/detail/alignment_of_clang.hpp
+++ b/boost/align/detail/alignment_of_clang.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -21,8 +21,8 @@ struct alignment_of
: integral_constant<std::size_t, __alignof(T)> {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/alignment_of_codegear.hpp b/boost/align/detail/alignment_of_codegear.hpp
index e8986cef66..8875e6c424 100644
--- a/boost/align/detail/alignment_of_codegear.hpp
+++ b/boost/align/detail/alignment_of_codegear.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -21,8 +21,8 @@ struct alignment_of
: integral_constant<std::size_t, alignof(T)> {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/alignment_of_cxx11.hpp b/boost/align/detail/alignment_of_cxx11.hpp
index 0f66098b67..cbe2d9e7a8 100644
--- a/boost/align/detail/alignment_of_cxx11.hpp
+++ b/boost/align/detail/alignment_of_cxx11.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -17,8 +17,8 @@ namespace detail {
using std::alignment_of;
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/alignment_of_gcc.hpp b/boost/align/detail/alignment_of_gcc.hpp
index 615968b477..0812fde8e4 100644
--- a/boost/align/detail/alignment_of_gcc.hpp
+++ b/boost/align/detail/alignment_of_gcc.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -21,8 +21,8 @@ struct alignment_of
: integral_constant<std::size_t, __alignof__(T)> {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/alignment_of_msvc.hpp b/boost/align/detail/alignment_of_msvc.hpp
index 87d6ac8e28..df6912f411 100644
--- a/boost/align/detail/alignment_of_msvc.hpp
+++ b/boost/align/detail/alignment_of_msvc.hpp
@@ -1,6 +1,6 @@
/*
-(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+(c) 2014-2015 Glen Joseph Fernandes
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -10,19 +10,26 @@ http://boost.org/LICENSE_1_0.txt
#define BOOST_ALIGN_DETAIL_ALIGNMENT_OF_MSVC_HPP
#include <boost/align/detail/min_size.hpp>
-#include <boost/align/detail/offset_object.hpp>
namespace boost {
namespace alignment {
namespace detail {
template<class T>
+struct alignof_helper {
+ T first;
+ char value;
+ T second;
+};
+
+template<class T>
struct alignment_of
- : min_size<sizeof(T), offsetof(offset_object<T>, object)>::type {
+ : min_size<sizeof(T),
+ sizeof(alignof_helper<T>) - (sizeof(T) << 1)>::type {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/assume_aligned.hpp b/boost/align/detail/assume_aligned.hpp
index 0ecefa1dd0..cf77086624 100644
--- a/boost/align/detail/assume_aligned.hpp
+++ b/boost/align/detail/assume_aligned.hpp
@@ -3,7 +3,7 @@
(c) 2015 LRI UMR 8623 CNRS/University Paris Sud XI
(c) 2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/detail/assume_aligned_clang.hpp b/boost/align/detail/assume_aligned_clang.hpp
index d72b4cae86..2ba41c6970 100644
--- a/boost/align/detail/assume_aligned_clang.hpp
+++ b/boost/align/detail/assume_aligned_clang.hpp
@@ -1,6 +1,6 @@
/*
(c) 2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -9,11 +9,9 @@ http://boost.org/LICENSE_1_0.txt
#ifndef BOOST_ALIGN_DETAIL_ASSUME_ALIGNED_CLANG_HPP
#define BOOST_ALIGN_DETAIL_ASSUME_ALIGNED_CLANG_HPP
-#include <stdint.h>
-
-#if defined(__has_builtin) && __has_builtin(__builtin_assume)
+#if __has_builtin(__builtin_assume_aligned)
#define BOOST_ALIGN_ASSUME_ALIGNED(ptr, alignment) \
-__builtin_assume((uintptr_t(ptr) & ((alignment) - 1)) == 0)
+(ptr) = __builtin_assume_aligned((ptr), (alignment))
#else
#define BOOST_ALIGN_ASSUME_ALIGNED(ptr, alignment)
#endif
diff --git a/boost/align/detail/assume_aligned_gcc.hpp b/boost/align/detail/assume_aligned_gcc.hpp
index a1e6cb0280..f7a545851c 100644
--- a/boost/align/detail/assume_aligned_gcc.hpp
+++ b/boost/align/detail/assume_aligned_gcc.hpp
@@ -3,7 +3,7 @@
(c) 2015 LRI UMR 8623 CNRS/University Paris Sud XI
(c) 2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/detail/assume_aligned_intel.hpp b/boost/align/detail/assume_aligned_intel.hpp
index aaaf331802..e9ec2dbeb4 100644
--- a/boost/align/detail/assume_aligned_intel.hpp
+++ b/boost/align/detail/assume_aligned_intel.hpp
@@ -3,7 +3,7 @@
(c) 2015 LRI UMR 8623 CNRS/University Paris Sud XI
(c) 2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/detail/assume_aligned_msvc.hpp b/boost/align/detail/assume_aligned_msvc.hpp
index fdad429b08..97c1fb1add 100644
--- a/boost/align/detail/assume_aligned_msvc.hpp
+++ b/boost/align/detail/assume_aligned_msvc.hpp
@@ -3,7 +3,7 @@
(c) 2015 LRI UMR 8623 CNRS/University Paris Sud XI
(c) 2015 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/align/detail/integral_constant.hpp b/boost/align/detail/integral_constant.hpp
index 6116fea5f5..3f8bf0a8d9 100644
--- a/boost/align/detail/integral_constant.hpp
+++ b/boost/align/detail/integral_constant.hpp
@@ -1,6 +1,6 @@
/*
-(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+(c) 2014-2015 Glen Joseph Fernandes
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -25,24 +25,18 @@ using std::integral_constant;
template<class T, T Value>
struct integral_constant {
typedef T value_type;
- typedef integral_constant<T, Value> type;
+ typedef integral_constant type;
-#if !defined(BOOST_NO_CXX11_CONSTEXPR)
- constexpr operator value_type() const {
+ BOOST_CONSTEXPR operator value_type() const {
return Value;
}
- static constexpr T value = Value;
-#else
- enum {
- value = Value
- };
-#endif
+ static BOOST_CONSTEXPR_OR_CONST T value = Value;
};
#endif
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/is_aligned.hpp b/boost/align/detail/is_aligned.hpp
index a861e9f4c8..cb45be3433 100644
--- a/boost/align/detail/is_aligned.hpp
+++ b/boost/align/detail/is_aligned.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -22,10 +22,10 @@ inline bool is_aligned(std::size_t alignment, const void* ptr)
BOOST_NOEXCEPT
{
BOOST_ASSERT(detail::is_alignment(alignment));
- return (detail::address_t(ptr) & (alignment - 1)) == 0;
+ return (detail::address(ptr) & (alignment - 1)) == 0;
}
-} /* :alignment */
-} /* :boost */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/is_alignment.hpp b/boost/align/detail/is_alignment.hpp
index 7ac0bb3d12..12d8df974f 100644
--- a/boost/align/detail/is_alignment.hpp
+++ b/boost/align/detail/is_alignment.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -22,8 +22,8 @@ BOOST_CONSTEXPR inline bool is_alignment(std::size_t value)
return (value > 0) && ((value & (value - 1)) == 0);
}
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/is_alignment_constant.hpp b/boost/align/detail/is_alignment_constant.hpp
index 4c703cafc0..2c29343b2d 100644
--- a/boost/align/detail/is_alignment_constant.hpp
+++ b/boost/align/detail/is_alignment_constant.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -21,8 +21,8 @@ struct is_alignment_constant
: integral_constant<bool, (N > 0) && ((N & (N - 1)) == 0)> {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/max_align.hpp b/boost/align/detail/max_align.hpp
index 4351a5a2ed..daa0413935 100644
--- a/boost/align/detail/max_align.hpp
+++ b/boost/align/detail/max_align.hpp
@@ -1,6 +1,6 @@
/*
-(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+(c) 2014-2015 Glen Joseph Fernandes
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -9,20 +9,21 @@ http://boost.org/LICENSE_1_0.txt
#ifndef BOOST_ALIGN_DETAIL_MAX_ALIGN_HPP
#define BOOST_ALIGN_DETAIL_MAX_ALIGN_HPP
-#include <boost/align/detail/integral_constant.hpp>
+#include <boost/align/detail/max_size.hpp>
+#include <boost/align/alignment_of.hpp>
#include <cstddef>
namespace boost {
namespace alignment {
namespace detail {
-template<std::size_t A, std::size_t B>
+template<class A, class B>
struct max_align
- : integral_constant<std::size_t, (A > B) ? A : B> {
+ : max_size<alignment_of<A>::value, alignment_of<B>::value>::type {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/max_count_of.hpp b/boost/align/detail/max_objects.hpp
index e0ae3bce96..eb56d6fe66 100644
--- a/boost/align/detail/max_count_of.hpp
+++ b/boost/align/detail/max_objects.hpp
@@ -1,13 +1,13 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
http://boost.org/LICENSE_1_0.txt
*/
-#ifndef BOOST_ALIGN_DETAIL_MAX_COUNT_OF_HPP
-#define BOOST_ALIGN_DETAIL_MAX_COUNT_OF_HPP
+#ifndef BOOST_ALIGN_DETAIL_MAX_OBJECTS_HPP
+#define BOOST_ALIGN_DETAIL_MAX_OBJECTS_HPP
#include <boost/align/detail/integral_constant.hpp>
#include <cstddef>
@@ -17,13 +17,13 @@ namespace alignment {
namespace detail {
template<class T>
-struct max_count_of
+struct max_objects
: integral_constant<std::size_t,
~static_cast<std::size_t>(0) / sizeof(T)> {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/max_size.hpp b/boost/align/detail/max_size.hpp
new file mode 100644
index 0000000000..48fc45e2ee
--- /dev/null
+++ b/boost/align/detail/max_size.hpp
@@ -0,0 +1,28 @@
+/*
+(c) 2014-2015 Glen Joseph Fernandes
+<glenjofe -at- gmail.com>
+
+Distributed under the Boost Software
+License, Version 1.0.
+http://boost.org/LICENSE_1_0.txt
+*/
+#ifndef BOOST_ALIGN_DETAIL_MAX_SIZE_HPP
+#define BOOST_ALIGN_DETAIL_MAX_SIZE_HPP
+
+#include <boost/align/detail/integral_constant.hpp>
+#include <cstddef>
+
+namespace boost {
+namespace alignment {
+namespace detail {
+
+template<std::size_t A, std::size_t B>
+struct max_size
+ : integral_constant<std::size_t, (A > B) ? A : B> {
+};
+
+} /* .detail */
+} /* .alignment */
+} /* .boost */
+
+#endif
diff --git a/boost/align/detail/min_size.hpp b/boost/align/detail/min_size.hpp
index 71afe8c686..8ed3e87ab6 100644
--- a/boost/align/detail/min_size.hpp
+++ b/boost/align/detail/min_size.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -21,8 +21,8 @@ struct min_size
: integral_constant<std::size_t, (A < B) ? A : B> {
};
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/detail/offset_object.hpp b/boost/align/detail/offset_object.hpp
deleted file mode 100644
index 2055edfb4a..0000000000
--- a/boost/align/detail/offset_object.hpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
-
-Distributed under the Boost Software
-License, Version 1.0.
-http://boost.org/LICENSE_1_0.txt
-*/
-#ifndef BOOST_ALIGN_DETAIL_OFFSET_OBJECT_HPP
-#define BOOST_ALIGN_DETAIL_OFFSET_OBJECT_HPP
-
-namespace boost {
-namespace alignment {
-namespace detail {
-
-template<class T>
-struct offset_object {
- char offset;
- T object;
-};
-
-} /* :detail */
-} /* :alignment */
-} /* :boost */
-
-#endif
diff --git a/boost/align/detail/remove_traits.hpp b/boost/align/detail/remove_traits.hpp
index f59d6bf9e8..86a98d459a 100644
--- a/boost/align/detail/remove_traits.hpp
+++ b/boost/align/detail/remove_traits.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
@@ -85,8 +85,8 @@ struct remove_cv {
};
#endif
-} /* :detail */
-} /* :alignment */
-} /* :boost */
+} /* .detail */
+} /* .alignment */
+} /* .boost */
#endif
diff --git a/boost/align/is_aligned.hpp b/boost/align/is_aligned.hpp
index 7473864ca7..5d99847e4a 100644
--- a/boost/align/is_aligned.hpp
+++ b/boost/align/is_aligned.hpp
@@ -1,6 +1,6 @@
/*
(c) 2014 Glen Joseph Fernandes
-glenjofe at gmail dot com
+<glenjofe -at- gmail.com>
Distributed under the Boost Software
License, Version 1.0.
diff --git a/boost/aligned_storage.hpp b/boost/aligned_storage.hpp
index b5455f00b6..f400fa9e75 100644
--- a/boost/aligned_storage.hpp
+++ b/boost/aligned_storage.hpp
@@ -13,131 +13,6 @@
#ifndef BOOST_ALIGNED_STORAGE_HPP
#define BOOST_ALIGNED_STORAGE_HPP
-#include <cstddef> // for std::size_t
-
-#include "boost/config.hpp"
-#include "boost/detail/workaround.hpp"
-#include "boost/type_traits/alignment_of.hpp"
-#include "boost/type_traits/type_with_alignment.hpp"
-#include "boost/type_traits/is_pod.hpp"
-
-#include "boost/mpl/eval_if.hpp"
-#include "boost/mpl/identity.hpp"
-
-#include "boost/type_traits/detail/bool_trait_def.hpp"
-
-namespace boost {
-
-namespace detail { namespace aligned_storage {
-
-BOOST_STATIC_CONSTANT(
- std::size_t
- , alignment_of_max_align = ::boost::alignment_of<max_align>::value
- );
-
-//
-// To be TR1 conforming this must be a POD type:
-//
-template <
- std::size_t size_
- , std::size_t alignment_
->
-struct aligned_storage_imp
-{
- union data_t
- {
- char buf[size_];
-
- typename ::boost::mpl::eval_if_c<
- alignment_ == std::size_t(-1)
- , ::boost::mpl::identity< ::boost::detail::max_align >
- , ::boost::type_with_alignment<alignment_>
- >::type align_;
- } data_;
- void* address() const { return const_cast<aligned_storage_imp*>(this); }
-};
-
-template< std::size_t alignment_ >
-struct aligned_storage_imp<0u,alignment_>
-{
- /* intentionally empty */
- void* address() const { return 0; }
-};
-
-}} // namespace detail::aligned_storage
-
-template <
- std::size_t size_
- , std::size_t alignment_ = std::size_t(-1)
->
-class aligned_storage :
-#ifndef __BORLANDC__
- private
-#else
- public
-#endif
- ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_>
-{
-
-public: // constants
-
- typedef ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> type;
-
- BOOST_STATIC_CONSTANT(
- std::size_t
- , size = size_
- );
- BOOST_STATIC_CONSTANT(
- std::size_t
- , alignment = (
- alignment_ == std::size_t(-1)
- ? ::boost::detail::aligned_storage::alignment_of_max_align
- : alignment_
- )
- );
-
-private: // noncopyable
-
- aligned_storage(const aligned_storage&);
- aligned_storage& operator=(const aligned_storage&);
-
-public: // structors
-
- aligned_storage()
- {
- }
-
- ~aligned_storage()
- {
- }
-
-public: // accessors
-
- void* address()
- {
- return static_cast<type*>(this)->address();
- }
-
- const void* address() const
- {
- return static_cast<const type*>(this)->address();
- }
-};
-
-//
-// Make sure that is_pod recognises aligned_storage<>::type
-// as a POD (Note that aligned_storage<> itself is not a POD):
-//
-template <std::size_t size_, std::size_t alignment_>
-struct is_pod< ::boost::detail::aligned_storage::aligned_storage_imp<size_,alignment_> >
- BOOST_TT_AUX_BOOL_C_BASE(true)
-{
- BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(true)
-};
-
-
-} // namespace boost
-
-#include "boost/type_traits/detail/bool_trait_undef.hpp"
+#include <boost/type_traits/aligned_storage.hpp>
#endif // BOOST_ALIGNED_STORAGE_HPP
diff --git a/boost/archive/archive_exception.hpp b/boost/archive/archive_exception.hpp
index 1159d27755..fabcdb5fa7 100644
--- a/boost/archive/archive_exception.hpp
+++ b/boost/archive/archive_exception.hpp
@@ -87,6 +87,7 @@ public:
const char * e1 = NULL,
const char * e2 = NULL
) BOOST_NOEXCEPT;
+ BOOST_ARCHIVE_DECL archive_exception(archive_exception const &) BOOST_NOEXCEPT ;
virtual BOOST_ARCHIVE_DECL ~archive_exception() BOOST_NOEXCEPT_OR_NOTHROW ;
virtual BOOST_ARCHIVE_DECL const char * what() const BOOST_NOEXCEPT_OR_NOTHROW ;
};
diff --git a/boost/archive/basic_binary_oprimitive.hpp b/boost/archive/basic_binary_oprimitive.hpp
index 077d705ef1..f2ea6aa3ea 100644
--- a/boost/archive/basic_binary_oprimitive.hpp
+++ b/boost/archive/basic_binary_oprimitive.hpp
@@ -149,9 +149,7 @@ basic_binary_oprimitive<Archive, Elem, Tr>::save_binary(
const void *address,
std::size_t count
){
- //BOOST_ASSERT(
- // static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)()) >= count
- //);
+ // BOOST_ASSERT(count <= std::size_t(boost::integer_traits<std::streamsize>::const_max));
// note: if the following assertions fail
// a likely cause is that the output stream is set to "text"
// mode where by cr characters recieve special treatment.
@@ -161,9 +159,7 @@ basic_binary_oprimitive<Archive, Elem, Tr>::save_binary(
// archive_exception(archive_exception::output_stream_error)
// );
// figure number of elements to output - round up
- count = ( count + sizeof(Elem) - 1)
- / sizeof(Elem);
- BOOST_ASSERT(count <= std::size_t(boost::integer_traits<std::streamsize>::const_max));
+ count = ( count + sizeof(Elem) - 1) / sizeof(Elem);
std::streamsize scount = m_sb.sputn(
static_cast<const Elem *>(address),
static_cast<std::streamsize>(count)
diff --git a/boost/archive/detail/basic_iarchive.hpp b/boost/archive/detail/basic_iarchive.hpp
index befd0c75f2..1f5a8bf63b 100644
--- a/boost/archive/detail/basic_iarchive.hpp
+++ b/boost/archive/detail/basic_iarchive.hpp
@@ -65,11 +65,7 @@ protected:
public:
// some msvc versions require that the following function be public
// otherwise it should really protected.
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_ARCHIVE_DECL ~basic_iarchive();
+ virtual BOOST_ARCHIVE_DECL ~basic_iarchive();
// note: NOT part of the public API.
BOOST_ARCHIVE_DECL void next_object_pointer(void *t);
BOOST_ARCHIVE_DECL void register_basic_serializer(
diff --git a/boost/archive/detail/basic_iserializer.hpp b/boost/archive/detail/basic_iserializer.hpp
index 240f0bc06e..0d66674c34 100644
--- a/boost/archive/detail/basic_iserializer.hpp
+++ b/boost/archive/detail/basic_iserializer.hpp
@@ -51,11 +51,7 @@ protected:
explicit BOOST_ARCHIVE_DECL basic_iserializer(
const boost::serialization::extended_type_info & type
);
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_ARCHIVE_DECL ~basic_iserializer();
+ virtual BOOST_ARCHIVE_DECL ~basic_iserializer();
public:
bool serialized_as_pointer() const {
return m_bpis != NULL;
diff --git a/boost/archive/detail/basic_oarchive.hpp b/boost/archive/detail/basic_oarchive.hpp
index 702c5604bc..c379108d58 100644
--- a/boost/archive/detail/basic_oarchive.hpp
+++ b/boost/archive/detail/basic_oarchive.hpp
@@ -61,14 +61,8 @@ class BOOST_SYMBOL_VISIBLE basic_oarchive :
protected:
BOOST_ARCHIVE_DECL basic_oarchive(unsigned int flags = 0);
BOOST_ARCHIVE_DECL boost::archive::detail::helper_collection &
- get_helper_collection(){
- return *this;
- }
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_ARCHIVE_DECL ~basic_oarchive();
+ get_helper_collection();
+ virtual BOOST_ARCHIVE_DECL ~basic_oarchive();
public:
// note: NOT part of the public interface
BOOST_ARCHIVE_DECL void register_basic_serializer(
diff --git a/boost/archive/detail/basic_oserializer.hpp b/boost/archive/detail/basic_oserializer.hpp
index 7a710ba6bc..94247e9005 100644
--- a/boost/archive/detail/basic_oserializer.hpp
+++ b/boost/archive/detail/basic_oserializer.hpp
@@ -52,11 +52,7 @@ protected:
explicit BOOST_ARCHIVE_DECL basic_oserializer(
const boost::serialization::extended_type_info & type_
);
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_ARCHIVE_DECL ~basic_oserializer();
+ virtual BOOST_ARCHIVE_DECL ~basic_oserializer();
public:
bool serialized_as_pointer() const {
return m_bpos != NULL;
diff --git a/boost/archive/detail/basic_pointer_iserializer.hpp b/boost/archive/detail/basic_pointer_iserializer.hpp
index 23b9f906dc..1fc4b14d6e 100644
--- a/boost/archive/detail/basic_pointer_iserializer.hpp
+++ b/boost/archive/detail/basic_pointer_iserializer.hpp
@@ -46,11 +46,7 @@ protected:
explicit BOOST_ARCHIVE_DECL basic_pointer_iserializer(
const boost::serialization::extended_type_info & type_
);
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_ARCHIVE_DECL ~basic_pointer_iserializer();
+ virtual BOOST_ARCHIVE_DECL ~basic_pointer_iserializer();
public:
virtual void * heap_allocation() const = 0;
virtual const basic_iserializer & get_basic_serializer() const = 0;
diff --git a/boost/archive/detail/basic_pointer_oserializer.hpp b/boost/archive/detail/basic_pointer_oserializer.hpp
index 868e2fa580..1a5d9549ea 100644
--- a/boost/archive/detail/basic_pointer_oserializer.hpp
+++ b/boost/archive/detail/basic_pointer_oserializer.hpp
@@ -47,11 +47,7 @@ protected:
const boost::serialization::extended_type_info & type_
);
public:
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_ARCHIVE_DECL ~basic_pointer_oserializer();
+ virtual BOOST_ARCHIVE_DECL ~basic_pointer_oserializer();
virtual const basic_oserializer & get_basic_serializer() const = 0;
virtual void save_object_ptr(
basic_oarchive & ar,
diff --git a/boost/archive/detail/interface_oarchive.hpp b/boost/archive/detail/interface_oarchive.hpp
index 187013b6cd..359463ed9d 100644
--- a/boost/archive/detail/interface_oarchive.hpp
+++ b/boost/archive/detail/interface_oarchive.hpp
@@ -29,7 +29,7 @@ namespace boost {
namespace archive {
namespace detail {
-class BOOST_ARCHIVE_OR_WARCHIVE_DECL basic_pointer_oserializer;
+class basic_pointer_oserializer;
template<class Archive>
class interface_oarchive
@@ -75,7 +75,7 @@ public:
template<class T>
Archive & operator&(const T & t){
return * this ->This() << t;
- };
+ }
};
} // namespace detail
diff --git a/boost/archive/detail/iserializer.hpp b/boost/archive/detail/iserializer.hpp
index d6d3f42f6e..6419e623c8 100644
--- a/boost/archive/detail/iserializer.hpp
+++ b/boost/archive/detail/iserializer.hpp
@@ -57,10 +57,16 @@ namespace std{
#include <boost/type_traits/is_polymorphic.hpp>
#include <boost/serialization/assume_abstract.hpp>
-#define DONT_USE_HAS_NEW_OPERATOR ( \
- BOOST_WORKAROUND(__IBMCPP__, < 1210) \
- || defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590) \
-)
+
+#ifndef BOOST_MSVC
+ #define DONT_USE_HAS_NEW_OPERATOR ( \
+ BOOST_WORKAROUND(__IBMCPP__, < 1210) \
+ || defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590) \
+ )
+#else
+ #define DONT_USE_HAS_NEW_OPERATOR 0
+#endif
+
#if ! DONT_USE_HAS_NEW_OPERATOR
#include <boost/type_traits/has_new_operator.hpp>
#endif
@@ -220,20 +226,25 @@ struct heap_allocation {
static T * invoke_new() {
return static_cast<T *>((T::operator new)(sizeof(T)));
}
+ template<void D(void *, std::size_t)>
+ static void deleter(void * t, std::size_t s){
+ D(t, s);
+ }
+
+ template<void D(void *)>
+ static void deleter(void * t, std::size_t s){
+ D(t);
+ }
static void invoke_delete(T * t) {
// if compilation fails here, the likely cause that the class
// T has a class specific new operator but no class specific
- // delete operator which matches the following signature. Fix
- // your program to have this. Note that adding operator delete
- // with only one parameter doesn't seem correct to me since
- // the standard(3.7.4.2) says "
- // "If a class T has a member deallocation function named
- // 'operator delete' with exactly one parameter, then that function
- // is a usual (non-placement) deallocation function" which I take
- // to mean that it will call the destructor of type T which we don't
- // want to do here.
- // Note: reliance upon automatic conversion from T * to void * here
- (T::operator delete)(t, sizeof(T));
+ // delete operator which matches the following signature.
+ // note that this solution addresses the issue that two
+ // possible signatures. But it doesn't address the possibility
+ // that the class might have class specific new with NO
+ // class specific delete at all. Patches (compatible with
+ // C++03) welcome!
+ deleter<T::operator delete>(t, sizeof(T));
}
};
struct doesnt_have_new_operator {
diff --git a/boost/archive/detail/polymorphic_iarchive_route.hpp b/boost/archive/detail/polymorphic_iarchive_route.hpp
index 2c57a3f51c..105685ebbd 100644
--- a/boost/archive/detail/polymorphic_iarchive_route.hpp
+++ b/boost/archive/detail/polymorphic_iarchive_route.hpp
@@ -39,8 +39,8 @@ namespace serialization {
namespace archive {
namespace detail{
-class BOOST_ARCHIVE_DECL basic_iserializer;
-class BOOST_ARCHIVE_DECL basic_pointer_iserializer;
+class basic_iserializer;
+class basic_pointer_iserializer;
#ifdef BOOST_MSVC
# pragma warning(push)
diff --git a/boost/archive/detail/polymorphic_oarchive_route.hpp b/boost/archive/detail/polymorphic_oarchive_route.hpp
index ae750133a8..b23fd6bf39 100644
--- a/boost/archive/detail/polymorphic_oarchive_route.hpp
+++ b/boost/archive/detail/polymorphic_oarchive_route.hpp
@@ -39,8 +39,8 @@ namespace serialization {
namespace archive {
namespace detail{
-class BOOST_ARCHIVE_DECL basic_oserializer;
-class BOOST_ARCHIVE_DECL basic_pointer_oserializer;
+class basic_oserializer;
+class basic_pointer_oserializer;
#ifdef BOOST_MSVC
# pragma warning(push)
diff --git a/boost/archive/impl/xml_iarchive_impl.ipp b/boost/archive/impl/xml_iarchive_impl.ipp
index 7639ecb3b1..bf94774987 100644
--- a/boost/archive/impl/xml_iarchive_impl.ipp
+++ b/boost/archive/impl/xml_iarchive_impl.ipp
@@ -18,10 +18,11 @@ namespace std{
#endif
#ifndef BOOST_NO_CWCHAR
-#include <cstdlib> // mbtowc
+#include <cwchar> // mbstate_t and mbrtowc
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
- using ::mbtowc;
+ using ::mbstate_t;
+ using ::mbrtowc;
} // namespace std
#endif
#endif // BOOST_NO_CWCHAR
@@ -64,21 +65,22 @@ xml_iarchive_impl<Archive>::load(std::wstring &ws){
if(NULL != ws.data())
#endif
ws.resize(0);
+ std::mbstate_t mbs;
const char * start = s.data();
const char * end = start + s.size();
while(start < end){
wchar_t wc;
- int resultx = std::mbtowc(&wc, start, end - start);
- if(0 < resultx){
- start += resultx;
- ws += wc;
+ std::size_t result = std::mbrtowc(&wc, start, end - start, &mbs);
+ if(result == static_cast<std::size_t>(-1))
+ boost::serialization::throw_exception(
+ iterators::dataflow_exception(
+ iterators::dataflow_exception::invalid_conversion
+ )
+ );
+ if(result == static_cast<std::size_t>(-2))
continue;
- }
- boost::serialization::throw_exception(
- iterators::dataflow_exception(
- iterators::dataflow_exception::invalid_conversion
- )
- );
+ start += result;
+ ws += wc;
}
}
#endif // BOOST_NO_STD_WSTRING
@@ -91,24 +93,28 @@ xml_iarchive_impl<Archive>::load(wchar_t * ws){
bool result = gimpl->parse_string(is, s);
if(! result)
boost::serialization::throw_exception(
- xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+ xml_archive_exception(
+ xml_archive_exception::xml_archive_parsing_error
+ )
);
+ std::mbstate_t mbs;
const char * start = s.data();
const char * end = start + s.size();
while(start < end){
wchar_t wc;
- int length = std::mbtowc(&wc, start, end - start);
- if(0 < length){
- start += length;
- *ws++ = wc;
+ std::size_t length = std::mbrtowc(&wc, start, end - start, &mbs);
+ if(static_cast<std::size_t>(-1) == length)
+ boost::serialization::throw_exception(
+ iterators::dataflow_exception(
+ iterators::dataflow_exception::invalid_conversion
+ )
+ );
+ if(static_cast<std::size_t>(-2) == length)
continue;
- }
- boost::serialization::throw_exception(
- iterators::dataflow_exception(
- iterators::dataflow_exception::invalid_conversion
- )
- );
+
+ start += length;
+ *ws++ = wc;
}
*ws = L'\0';
}
diff --git a/boost/archive/iterators/head_iterator.hpp b/boost/archive/iterators/head_iterator.hpp
deleted file mode 100644
index 6ad7d6b32b..0000000000
--- a/boost/archive/iterators/head_iterator.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP
-#define BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP
-
-// MS compatible compilers support #pragma once
-#if defined(_MSC_VER)
-# pragma once
-#endif
-
-/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
-// head_iterator.hpp
-
-// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org for updates, documentation, and revision history.
-
-#include <boost/iterator/iterator_adaptor.hpp>
-#include <boost/iterator/iterator_traits.hpp>
-
-namespace boost {
-namespace archive {
-namespace iterators {
-
-template<class Predicate, class Base>
-class head_iterator
- : public boost::iterator_adaptor<
- head_iterator<Predicate, Base>,
- Base,
- use_default,
- single_pass_traversal_tag
- >
-{
-private:
- friend class iterator_core_access;
- typedef boost::iterator_adaptor<
- head_iterator<Predicate, Base>,
- Base,
- use_default,
- single_pass_traversal_tag
- > super_t;
-
- typedef head_iterator<Predicate, Base> this_t;
- typedef super_t::value_type value_type;
- typedef super_t::reference reference_type;
-
- reference_type dereference_impl(){
- if(! m_end){
- while(! m_predicate(* this->base_reference()))
- ++ this->base_reference();
- m_end = true;
- }
- return * this->base_reference();
- }
-
- reference_type dereference() const {
- return const_cast<this_t *>(this)->dereference_impl();
- }
-
- void increment(){
- ++base_reference();
- }
- Predicate m_predicate;
- bool m_end;
-public:
- template<class T>
- head_iterator(Predicate f, T start) :
- super_t(Base(start)),
- m_predicate(f),
- m_end(false)
- {}
-
-};
-
-} // namespace iterators
-} // namespace archive
-} // namespace boost
-
-#endif // BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP
diff --git a/boost/archive/iterators/mb_from_wchar.hpp b/boost/archive/iterators/mb_from_wchar.hpp
index deb798f623..d76eb3e2d2 100644
--- a/boost/archive/iterators/mb_from_wchar.hpp
+++ b/boost/archive/iterators/mb_from_wchar.hpp
@@ -18,13 +18,14 @@
#include <boost/assert.hpp>
#include <cstddef> // size_t
-#include <cstdlib> // for wctomb()
+#include <cwchar> // for mbstate_t and wcrtomb()
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
using ::size_t;
- using ::wctomb;
+ using ::mbstate_t;
+ using ::wcrtomb;
} // namespace std
#endif
@@ -82,13 +83,10 @@ class mb_from_wchar
}
void fill(){
+ std::mbstate_t mbs;
+ std::wcrtomb(0, 0, &mbs);
wchar_t value = * this->base_reference();
- #if (defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 3) \
- || ((__MINGW32_MAJOR_VERSION == 3) && (__MINGW32_MINOR_VERSION >= 8))))
- m_bend = std::wcrtomb(m_buffer, value,0);
- #else
- m_bend = std::wctomb(m_buffer, value);
- #endif
+ m_bend = std::wcrtomb(m_buffer, value, &mbs);
BOOST_ASSERT(-1 != m_bend);
BOOST_ASSERT((std::size_t)m_bend <= sizeof(m_buffer));
BOOST_ASSERT(m_bend > 0);
diff --git a/boost/archive/iterators/wchar_from_mb.hpp b/boost/archive/iterators/wchar_from_mb.hpp
index ad1d4cbb7d..998a4686b2 100644
--- a/boost/archive/iterators/wchar_from_mb.hpp
+++ b/boost/archive/iterators/wchar_from_mb.hpp
@@ -19,13 +19,13 @@
#include <boost/assert.hpp>
#include <cctype>
#include <cstddef> // size_t
-#include <cstdlib> // mblen
+#include <cwchar> // mbstate_t and mbrtowc
#include <boost/config.hpp>
#if defined(BOOST_NO_STDC_NAMESPACE)
namespace std{
- using ::mblen;
- using ::mbtowc;
+ using ::mbstate_t;
+ using ::mbrtowc;
} // namespace std
#endif
@@ -101,23 +101,17 @@ public:
template<class Base>
wchar_t wchar_from_mb<Base>::drain(){
- char buffer[9];
- char * bptr = buffer;
- char val;
- for(std::size_t i = 0; i++ < (unsigned)MB_CUR_MAX;){
- val = * this->base_reference();
- *bptr++ = val;
- int result = std::mblen(buffer, i);
- if(-1 != result)
- break;
- ++(this->base_reference());
- }
+ std::mbstate_t mbs;
wchar_t retval;
- int result = std::mbtowc(& retval, buffer, MB_CUR_MAX);
- if(0 >= result)
- boost::serialization::throw_exception(iterators::dataflow_exception(
- iterators::dataflow_exception::invalid_conversion
- ));
+ std::size_t result;
+ do {
+ char val = *this->base_reference();
+ result = std::mbrtowc(&retval, &val, 1, &mbs);
+ if(result == static_cast<std::size_t>(-1))
+ boost::serialization::throw_exception(iterators::dataflow_exception(
+ iterators::dataflow_exception::invalid_conversion
+ ));
+ } while (result == static_cast<std::size_t>(-2));
return retval;
}
diff --git a/boost/archive/polymorphic_iarchive.hpp b/boost/archive/polymorphic_iarchive.hpp
index 7f19410dd8..d3c59a9f0f 100644
--- a/boost/archive/polymorphic_iarchive.hpp
+++ b/boost/archive/polymorphic_iarchive.hpp
@@ -43,8 +43,8 @@ namespace serialization {
} // namespace serialization
namespace archive {
namespace detail {
- class BOOST_ARCHIVE_DECL basic_iarchive;
- class BOOST_ARCHIVE_DECL basic_iarchive;
+ class basic_iarchive;
+ class basic_iserializer;
}
class polymorphic_iarchive;
diff --git a/boost/archive/polymorphic_oarchive.hpp b/boost/archive/polymorphic_oarchive.hpp
index aa30b2ac3e..edac4edb1e 100644
--- a/boost/archive/polymorphic_oarchive.hpp
+++ b/boost/archive/polymorphic_oarchive.hpp
@@ -42,8 +42,8 @@ namespace serialization {
} // namespace serialization
namespace archive {
namespace detail {
- class BOOST_ARCHIVE_DECL basic_oarchive;
- class BOOST_ARCHIVE_DECL basic_oserializer;
+ class basic_oarchive;
+ class basic_oserializer;
}
class polymorphic_oarchive;
diff --git a/boost/archive/xml_archive_exception.hpp b/boost/archive/xml_archive_exception.hpp
index b07f9a0c33..82c53ef5d3 100644
--- a/boost/archive/xml_archive_exception.hpp
+++ b/boost/archive/xml_archive_exception.hpp
@@ -45,6 +45,8 @@ public:
const char * e1 = NULL,
const char * e2 = NULL
);
+ BOOST_ARCHIVE_DECL xml_archive_exception(xml_archive_exception const &) ;
+ virtual BOOST_ARCHIVE_DECL ~xml_archive_exception() BOOST_NOEXCEPT_OR_NOTHROW ;
};
}// namespace archive
diff --git a/boost/asio/basic_serial_port.hpp b/boost/asio/basic_serial_port.hpp
index e0f83b0a5b..d318963a12 100644
--- a/boost/asio/basic_serial_port.hpp
+++ b/boost/asio/basic_serial_port.hpp
@@ -445,7 +445,7 @@ public:
*
* @param option The option value to be obtained from the serial port.
*
- * @param ec Set to indicate what error occured, if any.
+ * @param ec Set to indicate what error occurred, if any.
*
* @sa GettableSerialPortOption @n
* boost::asio::serial_port_base::baud_rate @n
diff --git a/boost/asio/detail/config.hpp b/boost/asio/detail/config.hpp
index 0f9e52d593..a39d85d600 100644
--- a/boost/asio/detail/config.hpp
+++ b/boost/asio/detail/config.hpp
@@ -221,8 +221,7 @@
# define BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
# endif // defined(__GXX_EXPERIMENTAL_CXX0X__)
# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4)
-# endif // defined(__GNUC__)
-# if defined(BOOST_ASIO_MSVC)
+# elif defined(BOOST_ASIO_MSVC)
# if (_MSC_VER >= 1900)
# define BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
# endif // (_MSC_VER >= 1900)
@@ -515,25 +514,41 @@
# endif // !defined(BOOST_ASIO_DISABLE_STD_MUTEX_AND_CONDVAR)
#endif // !defined(BOOST_ASIO_HAS_STD_MUTEX_AND_CONDVAR)
-// WinRT target.
-#if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
-# if defined(__cplusplus_winrt)
+// Windows App target. Windows but with a limited API.
+#if !defined(BOOST_ASIO_WINDOWS_APP)
+# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603)
# include <winapifamily.h>
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \
&& !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-# define BOOST_ASIO_WINDOWS_RUNTIME 1
+# define BOOST_ASIO_WINDOWS_APP 1
# endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
// && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-# endif // defined(__cplusplus_winrt)
+# endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603)
+#endif // !defined(BOOST_ASIO_WINDOWS_APP)
+
+// Legacy WinRT target. Windows App is preferred.
+#if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
+# if !defined(BOOST_ASIO_WINDOWS_APP)
+# if defined(__cplusplus_winrt)
+# include <winapifamily.h>
+# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \
+ && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+# define BOOST_ASIO_WINDOWS_RUNTIME 1
+# endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+# endif // defined(__cplusplus_winrt)
+# endif // !defined(BOOST_ASIO_WINDOWS_APP)
#endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
-// Windows target. Excludes WinRT.
+// Windows target. Excludes WinRT but includes Windows App targets.
#if !defined(BOOST_ASIO_WINDOWS)
# if !defined(BOOST_ASIO_WINDOWS_RUNTIME)
# if defined(BOOST_ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS)
# define BOOST_ASIO_WINDOWS 1
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
# define BOOST_ASIO_WINDOWS 1
+# elif defined(BOOST_ASIO_WINDOWS_APP)
+# define BOOST_ASIO_WINDOWS 1
# endif // defined(BOOST_ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS)
# endif // !defined(BOOST_ASIO_WINDOWS_RUNTIME)
#endif // !defined(BOOST_ASIO_WINDOWS)
@@ -601,11 +616,11 @@
#if !defined(BOOST_ASIO_HAS_IOCP)
# if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400)
-# if !defined(UNDER_CE)
+# if !defined(UNDER_CE) && !defined(BOOST_ASIO_WINDOWS_APP)
# if !defined(BOOST_ASIO_DISABLE_IOCP)
# define BOOST_ASIO_HAS_IOCP 1
# endif // !defined(BOOST_ASIO_DISABLE_IOCP)
-# endif // !defined(UNDER_CE)
+# endif // !defined(UNDER_CE) && !defined(BOOST_ASIO_WINDOWS_APP)
# endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400)
# endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
#endif // !defined(BOOST_ASIO_HAS_IOCP)
@@ -721,9 +736,9 @@
#if !defined(BOOST_ASIO_HAS_WINDOWS_OBJECT_HANDLE)
# if !defined(BOOST_ASIO_DISABLE_WINDOWS_OBJECT_HANDLE)
# if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
-# if !defined(UNDER_CE)
+# if !defined(UNDER_CE) && !defined(BOOST_ASIO_WINDOWS_APP)
# define BOOST_ASIO_HAS_WINDOWS_OBJECT_HANDLE 1
-# endif // !defined(UNDER_CE)
+# endif // !defined(UNDER_CE) && !defined(BOOST_ASIO_WINDOWS_APP)
# endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
# endif // !defined(BOOST_ASIO_DISABLE_WINDOWS_OBJECT_HANDLE)
#endif // !defined(BOOST_ASIO_HAS_WINDOWS_OBJECT_HANDLE)
diff --git a/boost/asio/detail/handler_type_requirements.hpp b/boost/asio/detail/handler_type_requirements.hpp
index a2d3fd1f20..228e93c69f 100644
--- a/boost/asio/detail/handler_type_requirements.hpp
+++ b/boost/asio/detail/handler_type_requirements.hpp
@@ -53,8 +53,18 @@
# include <boost/asio/handler_type.hpp>
#endif // defined(BOOST_ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS)
-// Newer gcc needs special treatment to suppress unused typedef warnings.
-#if defined(__GNUC__)
+// Newer gcc, clang need special treatment to suppress unused typedef warnings.
+#if defined(__clang__)
+# if defined(__apple_build_version__)
+# if (__clang_major__ >= 7)
+# define BOOST_ASIO_UNUSED_TYPEDEF __attribute__((__unused__))
+# endif // (__clang_major__ >= 7)
+# elif ((__clang_major__ == 3) && (__clang_minor__ >= 6)) \
+ || (__clang_major__ > 3)
+# define BOOST_ASIO_UNUSED_TYPEDEF __attribute__((__unused__))
+# endif // ((__clang_major__ == 3) && (__clang_minor__ >= 6))
+ // || (__clang_major__ > 3)
+#elif defined(__GNUC__)
# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4)
# define BOOST_ASIO_UNUSED_TYPEDEF __attribute__((__unused__))
# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4)
diff --git a/boost/asio/detail/impl/socket_ops.ipp b/boost/asio/detail/impl/socket_ops.ipp
index dc068e0e03..976eaa42db 100644
--- a/boost/asio/detail/impl/socket_ops.ipp
+++ b/boost/asio/detail/impl/socket_ops.ipp
@@ -1634,7 +1634,8 @@ int getpeername(socket_type s, socket_addr_type* addr,
return socket_error_retval;
}
-#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
+#if defined(BOOST_ASIO_WINDOWS) && !defined(BOOST_ASIO_WINDOWS_APP) \
+ || defined(__CYGWIN__)
if (cached)
{
// Check if socket is still connected.
@@ -1655,9 +1656,11 @@ int getpeername(socket_type s, socket_addr_type* addr,
ec = boost::system::error_code();
return 0;
}
-#else // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
+#else // defined(BOOST_ASIO_WINDOWS) && !defined(BOOST_ASIO_WINDOWS_APP)
+ // || defined(__CYGWIN__)
(void)cached;
-#endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
+#endif // defined(BOOST_ASIO_WINDOWS) && !defined(BOOST_ASIO_WINDOWS_APP)
+ // || defined(__CYGWIN__)
clear_last_error();
int result = error_wrapper(call_getpeername(
@@ -2581,7 +2584,8 @@ inline void gai_strcpy(char* target, const char* source, std::size_t max_size)
strcpy_s(target, max_size, source);
#else // defined(BOOST_ASIO_HAS_SECURE_RTL)
*target = 0;
- strncat(target, source, max_size);
+ if (max_size > 0)
+ strncat(target, source, max_size - 1);
#endif // defined(BOOST_ASIO_HAS_SECURE_RTL)
}
diff --git a/boost/asio/detail/impl/win_event.ipp b/boost/asio/detail/impl/win_event.ipp
index 0fffbce9cd..40f3f641eb 100644
--- a/boost/asio/detail/impl/win_event.ipp
+++ b/boost/asio/detail/impl/win_event.ipp
@@ -32,7 +32,11 @@ namespace detail {
win_event::win_event()
: state_(0)
{
- events_[0] = ::CreateEvent(0, true, false, 0);
+#if defined(BOOST_ASIO_WINDOWS_APP)
+ events_[0] = ::CreateEventExW(0, 0, CREATE_EVENT_MANUAL_RESET, 0);
+#else // defined(BOOST_ASIO_WINDOWS_APP)
+ events_[0] = ::CreateEventW(0, true, false, 0);
+#endif // defined(BOOST_ASIO_WINDOWS_APP)
if (!events_[0])
{
DWORD last_error = ::GetLastError();
@@ -41,7 +45,11 @@ win_event::win_event()
boost::asio::detail::throw_error(ec, "event");
}
- events_[1] = ::CreateEvent(0, false, false, 0);
+#if defined(BOOST_ASIO_WINDOWS_APP)
+ events_[1] = ::CreateEventExW(0, 0, 0, 0);
+#else // defined(BOOST_ASIO_WINDOWS_APP)
+ events_[1] = ::CreateEventW(0, false, false, 0);
+#endif // defined(BOOST_ASIO_WINDOWS_APP)
if (!events_[1])
{
DWORD last_error = ::GetLastError();
diff --git a/boost/asio/detail/impl/win_iocp_handle_service.ipp b/boost/asio/detail/impl/win_iocp_handle_service.ipp
index b0c784e556..24820a55b0 100644
--- a/boost/asio/detail/impl/win_iocp_handle_service.ipp
+++ b/boost/asio/detail/impl/win_iocp_handle_service.ipp
@@ -40,7 +40,7 @@ public:
OffsetHigh = 0;
// Create a non-signalled manual-reset event, for GetOverlappedResult.
- hEvent = ::CreateEvent(0, TRUE, FALSE, 0);
+ hEvent = ::CreateEventW(0, TRUE, FALSE, 0);
if (hEvent)
{
// As documented in GetQueuedCompletionStatus, setting the low order
diff --git a/boost/asio/detail/impl/win_mutex.ipp b/boost/asio/detail/impl/win_mutex.ipp
index 60ce9dd598..be1d1b8111 100644
--- a/boost/asio/detail/impl/win_mutex.ipp
+++ b/boost/asio/detail/impl/win_mutex.ipp
@@ -44,6 +44,8 @@ int win_mutex::do_init()
// we'll just call the Windows API and hope.
# if defined(UNDER_CE)
::InitializeCriticalSection(&crit_section_);
+# elif defined(BOOST_ASIO_WINDOWS_APP)
+ ::InitializeCriticalSectionEx(&crit_section_, 0x80000000, 0);
# else
if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000))
return ::GetLastError();
@@ -54,6 +56,9 @@ int win_mutex::do_init()
{
# if defined(UNDER_CE)
::InitializeCriticalSection(&crit_section_);
+# elif defined(BOOST_ASIO_WINDOWS_APP)
+ if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0))
+ return ::GetLastError();
# else
if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000))
return ::GetLastError();
diff --git a/boost/asio/detail/impl/win_static_mutex.ipp b/boost/asio/detail/impl/win_static_mutex.ipp
index 02b44b5d37..14a08efd90 100644
--- a/boost/asio/detail/impl/win_static_mutex.ipp
+++ b/boost/asio/detail/impl/win_static_mutex.ipp
@@ -50,13 +50,23 @@ int win_static_mutex::do_init()
mutex_name, 128, L"asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p",
static_cast<unsigned int>(::GetCurrentProcessId()), this);
+#if defined(BOOST_ASIO_WINDOWS_APP)
+ HANDLE mutex = ::CreateMutexExW(0, mutex_name, CREATE_MUTEX_INITIAL_OWNER, 0);
+#else // defined(BOOST_ASIO_WINDOWS_APP)
HANDLE mutex = ::CreateMutexW(0, TRUE, mutex_name);
+#endif // defined(BOOST_ASIO_WINDOWS_APP)
DWORD last_error = ::GetLastError();
if (mutex == 0)
return ::GetLastError();
if (last_error == ERROR_ALREADY_EXISTS)
+ {
+#if defined(BOOST_ASIO_WINDOWS_APP)
+ ::WaitForSingleObjectEx(mutex, INFINITE, false);
+#else // defined(BOOST_ASIO_WINDOWS_APP)
::WaitForSingleObject(mutex, INFINITE);
+#endif // defined(BOOST_ASIO_WINDOWS_APP)
+ }
if (initialised_)
{
@@ -84,6 +94,14 @@ int win_static_mutex::do_init()
{
# if defined(UNDER_CE)
::InitializeCriticalSection(&crit_section_);
+# elif defined(BOOST_ASIO_WINDOWS_APP)
+ if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0))
+ {
+ last_error = ::GetLastError();
+ ::ReleaseMutex(mutex);
+ ::CloseHandle(mutex);
+ return last_error;
+ }
# else
if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000))
{
diff --git a/boost/asio/detail/impl/win_thread.ipp b/boost/asio/detail/impl/win_thread.ipp
index 727c122e95..5ebd0e68a0 100644
--- a/boost/asio/detail/impl/win_thread.ipp
+++ b/boost/asio/detail/impl/win_thread.ipp
@@ -17,7 +17,9 @@
#include <boost/asio/detail/config.hpp>
-#if defined(BOOST_ASIO_WINDOWS) && !defined(UNDER_CE)
+#if defined(BOOST_ASIO_WINDOWS) \
+ && !defined(BOOST_ASIO_WINDOWS_APP) \
+ && !defined(UNDER_CE)
#include <process.h>
#include <boost/asio/detail/throw_error.hpp>
@@ -57,7 +59,7 @@ void win_thread::join()
void win_thread::start_thread(func_base* arg, unsigned int stack_size)
{
::HANDLE entry_event = 0;
- arg->entry_event_ = entry_event = ::CreateEvent(0, true, false, 0);
+ arg->entry_event_ = entry_event = ::CreateEventW(0, true, false, 0);
if (!entry_event)
{
DWORD last_error = ::GetLastError();
@@ -67,7 +69,7 @@ void win_thread::start_thread(func_base* arg, unsigned int stack_size)
boost::asio::detail::throw_error(ec, "thread.entry_event");
}
- arg->exit_event_ = exit_event_ = ::CreateEvent(0, true, false, 0);
+ arg->exit_event_ = exit_event_ = ::CreateEventW(0, true, false, 0);
if (!exit_event_)
{
DWORD last_error = ::GetLastError();
@@ -136,6 +138,8 @@ void __stdcall apc_function(ULONG_PTR) {}
#include <boost/asio/detail/pop_options.hpp>
-#endif // defined(BOOST_ASIO_WINDOWS) && !defined(UNDER_CE)
+#endif // defined(BOOST_ASIO_WINDOWS)
+ // && !defined(BOOST_ASIO_WINDOWS_APP)
+ // && !defined(UNDER_CE)
#endif // BOOST_ASIO_DETAIL_IMPL_WIN_THREAD_IPP
diff --git a/boost/asio/detail/local_free_on_block_exit.hpp b/boost/asio/detail/local_free_on_block_exit.hpp
index 47b5dafc46..a3b597e836 100644
--- a/boost/asio/detail/local_free_on_block_exit.hpp
+++ b/boost/asio/detail/local_free_on_block_exit.hpp
@@ -18,6 +18,7 @@
#include <boost/asio/detail/config.hpp>
#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
+#if !defined(BOOST_ASIO_WINDOWS_APP)
#include <boost/asio/detail/noncopyable.hpp>
#include <boost/asio/detail/socket_types.hpp>
@@ -54,6 +55,7 @@ private:
#include <boost/asio/detail/pop_options.hpp>
+#endif // !defined(BOOST_ASIO_WINDOWS_APP)
#endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
#endif // BOOST_ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP
diff --git a/boost/asio/detail/socket_types.hpp b/boost/asio/detail/socket_types.hpp
index f4be937703..e8c71093a0 100644
--- a/boost/asio/detail/socket_types.hpp
+++ b/boost/asio/detail/socket_types.hpp
@@ -37,7 +37,9 @@
# endif // defined(WINAPI_FAMILY)
# include <winsock2.h>
# include <ws2tcpip.h>
-# include <mswsock.h>
+# if !defined(BOOST_ASIO_WINDOWS_APP)
+# include <mswsock.h>
+# endif // !defined(BOOST_ASIO_WINDOWS_APP)
# if defined(BOOST_ASIO_WSPIAPI_H_DEFINED)
# undef _WSPIAPI_H_
# undef BOOST_ASIO_WSPIAPI_H_DEFINED
@@ -47,7 +49,9 @@
# pragma comment(lib, "ws2.lib")
# elif defined(_MSC_VER) || defined(__BORLANDC__)
# pragma comment(lib, "ws2_32.lib")
-# pragma comment(lib, "mswsock.lib")
+# if !defined(BOOST_ASIO_WINDOWS_APP)
+# pragma comment(lib, "mswsock.lib")
+# endif // !defined(BOOST_ASIO_WINDOWS_APP)
# endif // defined(_MSC_VER) || defined(__BORLANDC__)
# endif // !defined(BOOST_ASIO_NO_DEFAULT_LINKED_LIBS)
# include <boost/asio/detail/old_win_sdk_compat.hpp>
diff --git a/boost/asio/detail/thread.hpp b/boost/asio/detail/thread.hpp
index adc5a55708..1076e6452c 100644
--- a/boost/asio/detail/thread.hpp
+++ b/boost/asio/detail/thread.hpp
@@ -20,8 +20,8 @@
#if !defined(BOOST_ASIO_HAS_THREADS)
# include <boost/asio/detail/null_thread.hpp>
#elif defined(BOOST_ASIO_WINDOWS)
-# if defined(UNDER_CE)
-# include <boost/asio/detail/wince_thread.hpp>
+# if defined(BOOST_ASIO_WINDOWS_APP) || defined(UNDER_CE)
+# include <boost/asio/detail/winapi_thread.hpp>
# else
# include <boost/asio/detail/win_thread.hpp>
# endif
@@ -40,8 +40,8 @@ namespace detail {
#if !defined(BOOST_ASIO_HAS_THREADS)
typedef null_thread thread;
#elif defined(BOOST_ASIO_WINDOWS)
-# if defined(UNDER_CE)
-typedef wince_thread thread;
+# if defined(BOOST_ASIO_WINDOWS_APP) || defined(UNDER_CE)
+typedef winapi_thread thread;
# else
typedef win_thread thread;
# endif
diff --git a/boost/asio/detail/win_event.hpp b/boost/asio/detail/win_event.hpp
index ff4df5be23..d9aba6cbec 100644
--- a/boost/asio/detail/win_event.hpp
+++ b/boost/asio/detail/win_event.hpp
@@ -102,7 +102,11 @@ public:
{
state_ += 2;
lock.unlock();
+#if defined(BOOST_ASIO_WINDOWS_APP)
+ ::WaitForMultipleObjectsEx(2, events_, false, INFINITE, false);
+#else // defined(BOOST_ASIO_WINDOWS_APP)
::WaitForMultipleObjects(2, events_, false, INFINITE);
+#endif // defined(BOOST_ASIO_WINDOWS_APP)
lock.lock();
state_ -= 2;
}
diff --git a/boost/asio/detail/win_thread.hpp b/boost/asio/detail/win_thread.hpp
index e465430031..44bf8da535 100644
--- a/boost/asio/detail/win_thread.hpp
+++ b/boost/asio/detail/win_thread.hpp
@@ -17,7 +17,9 @@
#include <boost/asio/detail/config.hpp>
-#if defined(BOOST_ASIO_WINDOWS) && !defined(UNDER_CE)
+#if defined(BOOST_ASIO_WINDOWS) \
+ && !defined(BOOST_ASIO_WINDOWS_APP) \
+ && !defined(UNDER_CE)
#include <boost/asio/detail/noncopyable.hpp>
#include <boost/asio/detail/socket_types.hpp>
@@ -136,6 +138,8 @@ private:
# include <boost/asio/detail/impl/win_thread.ipp>
#endif // defined(BOOST_ASIO_HEADER_ONLY)
-#endif // defined(BOOST_ASIO_WINDOWS) && !defined(UNDER_CE)
+#endif // defined(BOOST_ASIO_WINDOWS)
+ // && !defined(BOOST_ASIO_WINDOWS_APP)
+ // && !defined(UNDER_CE)
#endif // BOOST_ASIO_DETAIL_WIN_THREAD_HPP
diff --git a/boost/asio/detail/winapi_thread.hpp b/boost/asio/detail/winapi_thread.hpp
new file mode 100644
index 0000000000..ce4050b2d1
--- /dev/null
+++ b/boost/asio/detail/winapi_thread.hpp
@@ -0,0 +1,124 @@
+//
+// detail/winapi_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BOOST_ASIO_DETAIL_WINAPI_THREAD_HPP
+#define BOOST_ASIO_DETAIL_WINAPI_THREAD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include <boost/asio/detail/config.hpp>
+
+#if defined(BOOST_ASIO_WINDOWS)
+#if defined(BOOST_ASIO_WINDOWS_APP) || defined(UNDER_CE)
+
+#include <memory>
+#include <boost/asio/detail/noncopyable.hpp>
+#include <boost/asio/detail/socket_types.hpp>
+#include <boost/asio/detail/throw_error.hpp>
+#include <boost/asio/error.hpp>
+
+#include <boost/asio/detail/push_options.hpp>
+
+namespace boost {
+namespace asio {
+namespace detail {
+
+DWORD WINAPI winapi_thread_function(LPVOID arg);
+
+class winapi_thread
+ : private noncopyable
+{
+public:
+ // Constructor.
+ template <typename Function>
+ winapi_thread(Function f, unsigned int = 0)
+ {
+ std::auto_ptr<func_base> arg(new func<Function>(f));
+ DWORD thread_id = 0;
+ thread_ = ::CreateThread(0, 0, winapi_thread_function,
+ arg.get(), 0, &thread_id);
+ if (!thread_)
+ {
+ DWORD last_error = ::GetLastError();
+ boost::system::error_code ec(last_error,
+ boost::asio::error::get_system_category());
+ boost::asio::detail::throw_error(ec, "thread");
+ }
+ arg.release();
+ }
+
+ // Destructor.
+ ~winapi_thread()
+ {
+ ::CloseHandle(thread_);
+ }
+
+ // Wait for the thread to exit.
+ void join()
+ {
+#if defined(BOOST_ASIO_WINDOWS_APP)
+ ::WaitForSingleObjectEx(thread_, INFINITE, false);
+#else // defined(BOOST_ASIO_WINDOWS_APP)
+ ::WaitForSingleObject(thread_, INFINITE);
+#endif // defined(BOOST_ASIO_WINDOWS_APP)
+ }
+
+private:
+ friend DWORD WINAPI winapi_thread_function(LPVOID arg);
+
+ class func_base
+ {
+ public:
+ virtual ~func_base() {}
+ virtual void run() = 0;
+ };
+
+ template <typename Function>
+ class func
+ : public func_base
+ {
+ public:
+ func(Function f)
+ : f_(f)
+ {
+ }
+
+ virtual void run()
+ {
+ f_();
+ }
+
+ private:
+ Function f_;
+ };
+
+ ::HANDLE thread_;
+};
+
+inline DWORD WINAPI winapi_thread_function(LPVOID arg)
+{
+ std::auto_ptr<winapi_thread::func_base> func(
+ static_cast<winapi_thread::func_base*>(arg));
+ func->run();
+ return 0;
+}
+
+} // namespace detail
+} // namespace asio
+} // namespace boost
+
+#include <boost/asio/detail/pop_options.hpp>
+
+#endif // defined(BOOST_ASIO_WINDOWS_APP) || defined(UNDER_CE)
+#endif // defined(BOOST_ASIO_WINDOWS)
+
+#endif // BOOST_ASIO_DETAIL_WINAPI_THREAD_HPP
diff --git a/boost/asio/ssl/impl/context.ipp b/boost/asio/ssl/impl/context.ipp
index 67191ade20..acb191a706 100644
--- a/boost/asio/ssl/impl/context.ipp
+++ b/boost/asio/ssl/impl/context.ipp
@@ -89,6 +89,14 @@ context::context(context::method m)
handle_ = ::SSL_CTX_new(::SSLv2_server_method());
break;
#endif // defined(OPENSSL_NO_SSL2)
+#if defined(OPENSSL_NO_SSL3)
+ case context::sslv3:
+ case context::sslv3_client:
+ case context::sslv3_server:
+ boost::asio::detail::throw_error(
+ boost::asio::error::invalid_argument, "context");
+ break;
+#else // defined(OPENSSL_NO_SSL3)
case context::sslv3:
handle_ = ::SSL_CTX_new(::SSLv3_method());
break;
@@ -98,6 +106,7 @@ context::context(context::method m)
case context::sslv3_server:
handle_ = ::SSL_CTX_new(::SSLv3_server_method());
break;
+#endif // defined(OPENSSL_NO_SSL3)
case context::tlsv1:
handle_ = ::SSL_CTX_new(::TLSv1_method());
break;
@@ -557,11 +566,15 @@ boost::system::error_code context::use_certificate_chain(
return ec;
}
+#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && !defined(LIBRESSL_VERSION_NUMBER)
+ ::SSL_CTX_clear_chain_certs(handle_);
+#else
if (handle_->extra_certs)
{
::sk_X509_pop_free(handle_->extra_certs, X509_free);
handle_->extra_certs = 0;
}
+#endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L)
while (X509* cacert = ::PEM_read_bio_X509(bio.p, 0,
handle_->default_passwd_callback,
@@ -949,7 +962,8 @@ int context::password_callback_function(
strcpy_s(buf, size, passwd.c_str());
#else // defined(BOOST_ASIO_HAS_SECURE_RTL)
*buf = '\0';
- strncat(buf, passwd.c_str(), size);
+ if (size > 0)
+ strncat(buf, passwd.c_str(), size - 1);
#endif // defined(BOOST_ASIO_HAS_SECURE_RTL)
return static_cast<int>(strlen(buf));
diff --git a/boost/asio/ssl/old/detail/openssl_context_service.hpp b/boost/asio/ssl/old/detail/openssl_context_service.hpp
index 9b45e3585f..61eac6efc5 100644
--- a/boost/asio/ssl/old/detail/openssl_context_service.hpp
+++ b/boost/asio/ssl/old/detail/openssl_context_service.hpp
@@ -85,6 +85,13 @@ public:
impl = ::SSL_CTX_new(::SSLv2_server_method());
break;
#endif // defined(OPENSSL_NO_SSL2)
+#if defined(OPENSSL_NO_SSL3)
+ case context_base::sslv3:
+ case context_base::sslv3_client:
+ case context_base::sslv3_server:
+ boost::asio::detail::throw_error(boost::asio::error::invalid_argument);
+ break;
+#else // defined(OPENSSL_NO_SSL3)
case context_base::sslv3:
impl = ::SSL_CTX_new(::SSLv3_method());
break;
@@ -94,6 +101,7 @@ public:
case context_base::sslv3_server:
impl = ::SSL_CTX_new(::SSLv3_server_method());
break;
+#endif // defined(OPENSSL_NO_SSL3)
case context_base::tlsv1:
impl = ::SSL_CTX_new(::TLSv1_method());
break;
diff --git a/boost/asio/version.hpp b/boost/asio/version.hpp
index e8eefafb17..8d506405c2 100644
--- a/boost/asio/version.hpp
+++ b/boost/asio/version.hpp
@@ -18,6 +18,6 @@
// BOOST_ASIO_VERSION % 100 is the sub-minor version
// BOOST_ASIO_VERSION / 100 % 1000 is the minor version
// BOOST_ASIO_VERSION / 100000 is the major version
-#define BOOST_ASIO_VERSION 101006 // 1.10.6
+#define BOOST_ASIO_VERSION 101007 // 1.10.7
#endif // BOOST_ASIO_VERSION_HPP
diff --git a/boost/assert.hpp b/boost/assert.hpp
index 1713d9bb1d..9650d7a290 100644
--- a/boost/assert.hpp
+++ b/boost/assert.hpp
@@ -3,10 +3,12 @@
// BOOST_ASSERT_MSG(expr, msg)
// BOOST_VERIFY(expr)
// BOOST_VERIFY_MSG(expr, msg)
+// BOOST_ASSERT_IS_VOID
//
// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
// Copyright (c) 2007, 2014 Peter Dimov
// Copyright (c) Beman Dawes 2011
+// Copyright (c) 2015 Ion Gaztanaga
//
// Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at
@@ -24,16 +26,18 @@
//
//
-// BOOST_ASSERT, BOOST_ASSERT_MSG
+// BOOST_ASSERT, BOOST_ASSERT_MSG, BOOST_ASSERT_IS_VOID
//
#undef BOOST_ASSERT
#undef BOOST_ASSERT_MSG
+#undef BOOST_ASSERT_IS_VOID
#if defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) )
# define BOOST_ASSERT(expr) ((void)0)
# define BOOST_ASSERT_MSG(expr, msg) ((void)0)
+# define BOOST_ASSERT_IS_VOID
#elif defined(BOOST_ENABLE_ASSERT_HANDLER) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && !defined(NDEBUG) )
@@ -55,6 +59,9 @@ namespace boost
# define BOOST_ASSERT(expr) assert(expr)
# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))
+#if defined(NDEBUG)
+# define BOOST_ASSERT_IS_VOID
+#endif
#endif
diff --git a/boost/atomic/detail/atomic_flag.hpp b/boost/atomic/detail/atomic_flag.hpp
index 6a6667d8eb..7fb44cdb1a 100644
--- a/boost/atomic/detail/atomic_flag.hpp
+++ b/boost/atomic/detail/atomic_flag.hpp
@@ -42,7 +42,7 @@ struct atomic_flag
typedef atomics::detail::operations< 1u, false > operations;
typedef operations::storage_type storage_type;
- storage_type m_storage;
+ operations::aligned_storage_type m_storage;
BOOST_FORCEINLINE BOOST_CONSTEXPR atomic_flag() BOOST_NOEXCEPT : m_storage(0)
{
@@ -50,14 +50,14 @@ struct atomic_flag
BOOST_FORCEINLINE bool test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return operations::test_and_set(m_storage, order);
+ return operations::test_and_set(m_storage.value, order);
}
BOOST_FORCEINLINE void clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
BOOST_ASSERT(order != memory_order_acquire);
BOOST_ASSERT(order != memory_order_acq_rel);
- operations::clear(m_storage, order);
+ operations::clear(m_storage.value, order);
}
BOOST_DELETED_FUNCTION(atomic_flag(atomic_flag const&))
diff --git a/boost/atomic/detail/atomic_template.hpp b/boost/atomic/detail/atomic_template.hpp
index bc3922a711..2deaded62f 100644
--- a/boost/atomic/detail/atomic_template.hpp
+++ b/boost/atomic/detail/atomic_template.hpp
@@ -22,7 +22,7 @@
#include <boost/type_traits/is_signed.hpp>
#include <boost/type_traits/is_integral.hpp>
#include <boost/atomic/detail/config.hpp>
-#include <boost/atomic/detail/casts.hpp>
+#include <boost/atomic/detail/bitwise_cast.hpp>
#include <boost/atomic/detail/operations_fwd.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
@@ -87,7 +87,7 @@ public:
typedef typename operations::storage_type storage_type;
protected:
- storage_type m_storage;
+ typename operations::aligned_storage_type m_storage;
public:
BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
@@ -99,7 +99,7 @@ public:
BOOST_ASSERT(order != memory_order_acquire);
BOOST_ASSERT(order != memory_order_acq_rel);
- operations::store(m_storage, static_cast< storage_type >(v), order);
+ operations::store(m_storage.value, static_cast< storage_type >(v), order);
}
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
@@ -107,22 +107,22 @@ public:
BOOST_ASSERT(order != memory_order_release);
BOOST_ASSERT(order != memory_order_acq_rel);
- return static_cast< value_type >(operations::load(m_storage, order));
+ return static_cast< value_type >(operations::load(m_storage.value, order));
}
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return static_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v), order));
+ return static_cast< value_type >(operations::fetch_add(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return static_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v), order));
+ return static_cast< value_type >(operations::fetch_sub(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return static_cast< value_type >(operations::exchange(m_storage, static_cast< storage_type >(v), order));
+ return static_cast< value_type >(operations::exchange(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
@@ -132,7 +132,7 @@ public:
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
storage_type old_value = static_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+ const bool res = operations::compare_exchange_strong(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);
expected = static_cast< value_type >(old_value);
return res;
}
@@ -149,7 +149,7 @@ public:
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
storage_type old_value = static_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+ const bool res = operations::compare_exchange_weak(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);
expected = static_cast< value_type >(old_value);
return res;
}
@@ -161,22 +161,22 @@ public:
BOOST_FORCEINLINE value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return static_cast< value_type >(operations::fetch_and(m_storage, static_cast< storage_type >(v), order));
+ return static_cast< value_type >(operations::fetch_and(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return static_cast< value_type >(operations::fetch_or(m_storage, static_cast< storage_type >(v), order));
+ return static_cast< value_type >(operations::fetch_or(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return static_cast< value_type >(operations::fetch_xor(m_storage, static_cast< storage_type >(v), order));
+ return static_cast< value_type >(operations::fetch_xor(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
{
- return operations::is_lock_free(m_storage);
+ return operations::is_lock_free(m_storage.value);
}
BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
@@ -243,7 +243,7 @@ public:
typedef operations::storage_type storage_type;
protected:
- storage_type m_storage;
+ operations::aligned_storage_type m_storage;
public:
BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
@@ -255,7 +255,7 @@ public:
BOOST_ASSERT(order != memory_order_acquire);
BOOST_ASSERT(order != memory_order_acq_rel);
- operations::store(m_storage, static_cast< storage_type >(v), order);
+ operations::store(m_storage.value, static_cast< storage_type >(v), order);
}
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
@@ -263,12 +263,12 @@ public:
BOOST_ASSERT(order != memory_order_release);
BOOST_ASSERT(order != memory_order_acq_rel);
- return !!operations::load(m_storage, order);
+ return !!operations::load(m_storage.value, order);
}
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return !!operations::exchange(m_storage, static_cast< storage_type >(v), order);
+ return !!operations::exchange(m_storage.value, static_cast< storage_type >(v), order);
}
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
@@ -278,7 +278,7 @@ public:
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
storage_type old_value = static_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+ const bool res = operations::compare_exchange_strong(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);
expected = !!old_value;
return res;
}
@@ -295,7 +295,7 @@ public:
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
storage_type old_value = static_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
+ const bool res = operations::compare_exchange_weak(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);
expected = !!old_value;
return res;
}
@@ -307,7 +307,7 @@ public:
BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
{
- return operations::is_lock_free(m_storage);
+ return operations::is_lock_free(m_storage.value);
}
BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
@@ -330,10 +330,10 @@ public:
typedef typename operations::storage_type storage_type;
protected:
- storage_type m_storage;
+ typename operations::aligned_storage_type m_storage;
public:
- BOOST_FORCEINLINE explicit base_atomic(value_type const& v = value_type()) BOOST_NOEXCEPT : m_storage(atomics::detail::memcpy_cast< storage_type >(v))
+ BOOST_FORCEINLINE explicit base_atomic(value_type const& v = value_type()) BOOST_NOEXCEPT : m_storage(atomics::detail::bitwise_cast< storage_type >(v))
{
}
@@ -343,7 +343,7 @@ public:
BOOST_ASSERT(order != memory_order_acquire);
BOOST_ASSERT(order != memory_order_acq_rel);
- operations::store(m_storage, atomics::detail::memcpy_cast< storage_type >(v), order);
+ operations::store(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order);
}
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
@@ -351,12 +351,12 @@ public:
BOOST_ASSERT(order != memory_order_release);
BOOST_ASSERT(order != memory_order_acq_rel);
- return atomics::detail::memcpy_cast< value_type >(operations::load(m_storage, order));
+ return atomics::detail::bitwise_cast< value_type >(operations::load(m_storage.value, order));
}
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::memcpy_cast< value_type >(operations::exchange(m_storage, atomics::detail::memcpy_cast< storage_type >(v), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::exchange(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
@@ -365,9 +365,9 @@ public:
BOOST_ASSERT(failure_order != memory_order_acq_rel);
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
- storage_type old_value = atomics::detail::memcpy_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::memcpy_cast< storage_type >(desired), success_order, failure_order);
- expected = atomics::detail::memcpy_cast< value_type >(old_value);
+ storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
+ const bool res = operations::compare_exchange_strong(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
+ expected = atomics::detail::bitwise_cast< value_type >(old_value);
return res;
}
@@ -382,9 +382,9 @@ public:
BOOST_ASSERT(failure_order != memory_order_acq_rel);
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
- storage_type old_value = atomics::detail::memcpy_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::memcpy_cast< storage_type >(desired), success_order, failure_order);
- expected = atomics::detail::memcpy_cast< value_type >(old_value);
+ storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
+ const bool res = operations::compare_exchange_weak(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
+ expected = atomics::detail::bitwise_cast< value_type >(old_value);
return res;
}
@@ -395,7 +395,7 @@ public:
BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
{
- return operations::is_lock_free(m_storage);
+ return operations::is_lock_free(m_storage.value);
}
BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
@@ -419,11 +419,11 @@ public:
typedef typename operations::storage_type storage_type;
protected:
- storage_type m_storage;
+ typename operations::aligned_storage_type m_storage;
public:
BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
- BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::union_cast< storage_type >(v))
+ BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::bitwise_cast< storage_type >(v))
{
}
@@ -433,7 +433,7 @@ public:
BOOST_ASSERT(order != memory_order_acquire);
BOOST_ASSERT(order != memory_order_acq_rel);
- operations::store(m_storage, atomics::detail::union_cast< storage_type >(v), order);
+ operations::store(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order);
}
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
@@ -441,22 +441,22 @@ public:
BOOST_ASSERT(order != memory_order_release);
BOOST_ASSERT(order != memory_order_acq_rel);
- return atomics::detail::union_cast< value_type >(operations::load(m_storage, order));
+ return atomics::detail::bitwise_cast< value_type >(operations::load(m_storage.value, order));
}
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::union_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v * sizeof(T)), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::fetch_add(m_storage.value, static_cast< storage_type >(v * sizeof(T)), order));
}
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::union_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v * sizeof(T)), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::fetch_sub(m_storage.value, static_cast< storage_type >(v * sizeof(T)), order));
}
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::union_cast< value_type >(operations::exchange(m_storage, atomics::detail::union_cast< storage_type >(v), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::exchange(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
@@ -465,9 +465,9 @@ public:
BOOST_ASSERT(failure_order != memory_order_acq_rel);
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
- storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
- expected = atomics::detail::union_cast< value_type >(old_value);
+ storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
+ const bool res = operations::compare_exchange_strong(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
+ expected = atomics::detail::bitwise_cast< value_type >(old_value);
return res;
}
@@ -482,9 +482,9 @@ public:
BOOST_ASSERT(failure_order != memory_order_acq_rel);
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
- storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
- expected = atomics::detail::union_cast< value_type >(old_value);
+ storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
+ const bool res = operations::compare_exchange_weak(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
+ expected = atomics::detail::bitwise_cast< value_type >(old_value);
return res;
}
@@ -495,7 +495,7 @@ public:
BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
{
- return operations::is_lock_free(m_storage);
+ return operations::is_lock_free(m_storage.value);
}
BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
@@ -549,11 +549,11 @@ public:
typedef operations::storage_type storage_type;
protected:
- storage_type m_storage;
+ operations::aligned_storage_type m_storage;
public:
BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
- BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::union_cast< storage_type >(v))
+ BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::bitwise_cast< storage_type >(v))
{
}
@@ -563,7 +563,7 @@ public:
BOOST_ASSERT(order != memory_order_acquire);
BOOST_ASSERT(order != memory_order_acq_rel);
- operations::store(m_storage, atomics::detail::union_cast< storage_type >(v), order);
+ operations::store(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order);
}
BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
@@ -571,22 +571,22 @@ public:
BOOST_ASSERT(order != memory_order_release);
BOOST_ASSERT(order != memory_order_acq_rel);
- return atomics::detail::union_cast< value_type >(operations::load(m_storage, order));
+ return atomics::detail::bitwise_cast< value_type >(operations::load(m_storage.value, order));
}
BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::union_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::fetch_add(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::union_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::fetch_sub(m_storage.value, static_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
- return atomics::detail::union_cast< value_type >(operations::exchange(m_storage, atomics::detail::union_cast< storage_type >(v), order));
+ return atomics::detail::bitwise_cast< value_type >(operations::exchange(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order));
}
BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
@@ -595,9 +595,9 @@ public:
BOOST_ASSERT(failure_order != memory_order_acq_rel);
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
- storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
- expected = atomics::detail::union_cast< value_type >(old_value);
+ storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
+ const bool res = operations::compare_exchange_strong(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
+ expected = atomics::detail::bitwise_cast< value_type >(old_value);
return res;
}
@@ -612,9 +612,9 @@ public:
BOOST_ASSERT(failure_order != memory_order_acq_rel);
BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
- storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
- const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
- expected = atomics::detail::union_cast< value_type >(old_value);
+ storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
+ const bool res = operations::compare_exchange_weak(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
+ expected = atomics::detail::bitwise_cast< value_type >(old_value);
return res;
}
@@ -625,7 +625,7 @@ public:
BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
{
- return operations::is_lock_free(m_storage);
+ return operations::is_lock_free(m_storage.value);
}
BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
@@ -696,10 +696,10 @@ public:
return this->load();
}
- BOOST_FORCEINLINE storage_type& storage() BOOST_NOEXCEPT { return this->m_storage; }
- BOOST_FORCEINLINE storage_type volatile& storage() volatile BOOST_NOEXCEPT { return this->m_storage; }
- BOOST_FORCEINLINE storage_type const& storage() const BOOST_NOEXCEPT { return this->m_storage; }
- BOOST_FORCEINLINE storage_type const volatile& storage() const volatile BOOST_NOEXCEPT { return this->m_storage; }
+ BOOST_FORCEINLINE storage_type& storage() BOOST_NOEXCEPT { return this->m_storage.value; }
+ BOOST_FORCEINLINE storage_type volatile& storage() volatile BOOST_NOEXCEPT { return this->m_storage.value; }
+ BOOST_FORCEINLINE storage_type const& storage() const BOOST_NOEXCEPT { return this->m_storage.value; }
+ BOOST_FORCEINLINE storage_type const volatile& storage() const volatile BOOST_NOEXCEPT { return this->m_storage.value; }
BOOST_DELETED_FUNCTION(atomic(atomic const&))
BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&))
diff --git a/boost/atomic/detail/casts.hpp b/boost/atomic/detail/bitwise_cast.hpp
index db28bc25ff..8654d10b95 100644
--- a/boost/atomic/detail/casts.hpp
+++ b/boost/atomic/detail/bitwise_cast.hpp
@@ -8,16 +8,18 @@
* Copyright (c) 2013 - 2014 Andrey Semashev
*/
/*!
- * \file atomic/detail/casts.hpp
+ * \file atomic/detail/bitwise_cast.hpp
*
- * This header defines \c union_cast and \c memcpy_cast used to convert between storage and value types
+ * This header defines \c bitwise_cast used to convert between storage and value types
*/
-#ifndef BOOST_ATOMIC_DETAIL_CASTS_HPP_INCLUDED_
-#define BOOST_ATOMIC_DETAIL_CASTS_HPP_INCLUDED_
+#ifndef BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_
+#define BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_
-#include <cstring>
#include <boost/atomic/detail/config.hpp>
+#if !defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY)
+#include <cstring>
+#endif
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
@@ -28,27 +30,14 @@ namespace atomics {
namespace detail {
template< typename To, typename From >
-BOOST_FORCEINLINE To union_cast(From const& from) BOOST_NOEXCEPT
-{
- union
- {
- To as_to;
- From as_from;
- }
- caster = {};
- caster.as_from = from;
- return caster.as_to;
-}
-
-template< typename To, typename From >
-BOOST_FORCEINLINE To memcpy_cast(From const& from) BOOST_NOEXCEPT
+BOOST_FORCEINLINE To bitwise_cast(From const& from) BOOST_NOEXCEPT
{
struct
{
To to;
}
value = {};
- std::memcpy
+ BOOST_ATOMIC_DETAIL_MEMCPY
(
&reinterpret_cast< char& >(value.to),
&reinterpret_cast< const char& >(from),
@@ -61,4 +50,4 @@ BOOST_FORCEINLINE To memcpy_cast(From const& from) BOOST_NOEXCEPT
} // namespace atomics
} // namespace boost
-#endif // BOOST_ATOMIC_DETAIL_CASTS_HPP_INCLUDED_
+#endif // BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_
diff --git a/boost/atomic/detail/caps_gcc_ppc.hpp b/boost/atomic/detail/caps_gcc_ppc.hpp
index 6dbdde826d..ee2346081b 100644
--- a/boost/atomic/detail/caps_gcc_ppc.hpp
+++ b/boost/atomic/detail/caps_gcc_ppc.hpp
@@ -25,7 +25,7 @@
#define BOOST_ATOMIC_INT8_LOCK_FREE 2
#define BOOST_ATOMIC_INT16_LOCK_FREE 2
#define BOOST_ATOMIC_INT32_LOCK_FREE 2
-#if defined(__powerpc64__)
+#if defined(__powerpc64__) || defined(__PPC64__)
#define BOOST_ATOMIC_INT64_LOCK_FREE 2
#endif
#define BOOST_ATOMIC_POINTER_LOCK_FREE 2
diff --git a/boost/atomic/detail/config.hpp b/boost/atomic/detail/config.hpp
index 6b0e418693..489281c2b4 100644
--- a/boost/atomic/detail/config.hpp
+++ b/boost/atomic/detail/config.hpp
@@ -21,6 +21,30 @@
#pragma once
#endif
+#if defined(__has_builtin)
+#if __has_builtin(__builtin_memcpy)
+#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY
+#endif
+#if __has_builtin(__builtin_memcmp)
+#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP
+#endif
+#elif defined(BOOST_GCC)
+#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY
+#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP
+#endif
+
+#if defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY)
+#define BOOST_ATOMIC_DETAIL_MEMCPY __builtin_memcpy
+#else
+#define BOOST_ATOMIC_DETAIL_MEMCPY std::memcpy
+#endif
+
+#if defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP)
+#define BOOST_ATOMIC_DETAIL_MEMCMP __builtin_memcmp
+#else
+#define BOOST_ATOMIC_DETAIL_MEMCMP std::memcmp
+#endif
+
#if defined(__CUDACC__)
// nvcc does not support alternatives in asm statement constraints
#define BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES
@@ -36,4 +60,16 @@
#define BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA
#endif
+#if (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 403)
+// This macro indicates we're using older binutils that don't support implied zero displacements for memory opereands,
+// making code like this invalid:
+// movl 4+(%%edx), %%eax
+#define BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS
+#endif
+
+#if defined(__clang__) || (defined(BOOST_GCC) && (BOOST_GCC+0) < 40500)
+// This macro indicates that the compiler does not support allocating rax:rdx register pairs ("A") in asm blocks
+#define BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS
+#endif
+
#endif // BOOST_ATOMIC_DETAIL_CONFIG_HPP_INCLUDED_
diff --git a/boost/atomic/detail/int_sizes.hpp b/boost/atomic/detail/int_sizes.hpp
index d06ed42a11..eada4fff07 100644
--- a/boost/atomic/detail/int_sizes.hpp
+++ b/boost/atomic/detail/int_sizes.hpp
@@ -117,8 +117,8 @@
#include <wchar.h>
#include <boost/cstdint.hpp>
-#if defined(_MSC_VER) && _MSC_VER <= 1310
-// MSVC 7.1 defines WCHAR_MAX to a value not suitable for constant expressions
+ #if defined(_MSC_VER) && ( _MSC_VER <= 1310 || defined(UNDER_CE) && _MSC_VER <= 1500 )
+// MSVC 7.1 and MSVC 8 (arm) define WCHAR_MAX to a value not suitable for constant expressions
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
#elif (WCHAR_MAX + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f
#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1
diff --git a/boost/atomic/detail/operations_fwd.hpp b/boost/atomic/detail/operations_fwd.hpp
index 69049e4630..efd4970747 100644
--- a/boost/atomic/detail/operations_fwd.hpp
+++ b/boost/atomic/detail/operations_fwd.hpp
@@ -14,6 +14,7 @@
#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_
#define BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_
+#include <cstddef>
#include <boost/atomic/detail/config.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
@@ -24,7 +25,7 @@ namespace boost {
namespace atomics {
namespace detail {
-template< unsigned int Size, bool Signed >
+template< std::size_t Size, bool Signed >
struct operations;
} // namespace detail
diff --git a/boost/atomic/detail/ops_cas_based.hpp b/boost/atomic/detail/ops_cas_based.hpp
index 7f8d288f7f..504cedb70f 100644
--- a/boost/atomic/detail/ops_cas_based.hpp
+++ b/boost/atomic/detail/ops_cas_based.hpp
@@ -16,6 +16,7 @@
#include <boost/memory_order.hpp>
#include <boost/atomic/detail/config.hpp>
+#include <boost/atomic/detail/storage_type.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
@@ -26,6 +27,21 @@ namespace atomics {
namespace detail {
template< typename Base >
+struct cas_based_exchange :
+ public Base
+{
+ typedef typename Base::storage_type storage_type;
+
+ static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+ {
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
+ while (!Base::compare_exchange_weak(storage, old_val, v, order, memory_order_relaxed)) {}
+ return old_val;
+ }
+};
+
+template< typename Base >
struct cas_based_operations :
public Base
{
@@ -33,49 +49,47 @@ struct cas_based_operations :
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
while (!Base::compare_exchange_weak(storage, old_val, old_val + v, order, memory_order_relaxed)) {}
return old_val;
}
static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
while (!Base::compare_exchange_weak(storage, old_val, old_val - v, order, memory_order_relaxed)) {}
return old_val;
}
- static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
- {
- storage_type old_val = Base::load(storage, memory_order_relaxed);
- while (!Base::compare_exchange_weak(storage, old_val, v, order, memory_order_relaxed)) {}
- return old_val;
- }
-
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
while (!Base::compare_exchange_weak(storage, old_val, old_val & v, order, memory_order_relaxed)) {}
return old_val;
}
static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
while (!Base::compare_exchange_weak(storage, old_val, old_val | v, order, memory_order_relaxed)) {}
return old_val;
}
static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
while (!Base::compare_exchange_weak(storage, old_val, old_val ^ v, order, memory_order_relaxed)) {}
return old_val;
}
static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
{
- return !!exchange(storage, (storage_type)1, order);
+ return !!Base::exchange(storage, (storage_type)1, order);
}
static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
diff --git a/boost/atomic/detail/ops_emulated.hpp b/boost/atomic/detail/ops_emulated.hpp
index 597490f2d7..0dc4e6828a 100644
--- a/boost/atomic/detail/ops_emulated.hpp
+++ b/boost/atomic/detail/ops_emulated.hpp
@@ -14,6 +14,7 @@
#ifndef BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
#define BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_
+#include <cstddef>
#include <boost/memory_order.hpp>
#include <boost/atomic/detail/config.hpp>
#include <boost/atomic/detail/storage_type.hpp>
@@ -90,7 +91,17 @@ struct emulated_operations
static BOOST_FORCEINLINE bool compare_exchange_weak(
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
{
- return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
+ // Note: This function is the exact copy of compare_exchange_strong. The reason we're not just forwarding the call
+ // is that MSVC-12 ICEs in this case.
+ storage_type& s = const_cast< storage_type& >(storage);
+ lockpool::scoped_lock lock(&storage);
+ storage_type old_val = s;
+ const bool res = old_val == expected;
+ if (res)
+ s = desired;
+ expected = old_val;
+
+ return res;
}
static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
@@ -136,10 +147,11 @@ struct emulated_operations
}
};
-template< unsigned int Size, bool Signed >
+template< std::size_t Size, bool Signed >
struct operations :
public emulated_operations< typename make_storage_type< Size, Signed >::type >
{
+ typedef typename make_storage_type< Size, Signed >::aligned aligned_storage_type;
};
} // namespace detail
diff --git a/boost/atomic/detail/ops_extending_cas_based.hpp b/boost/atomic/detail/ops_extending_cas_based.hpp
index d7f3c5f5de..3f21031f12 100644
--- a/boost/atomic/detail/ops_extending_cas_based.hpp
+++ b/boost/atomic/detail/ops_extending_cas_based.hpp
@@ -14,6 +14,7 @@
#ifndef BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_
#define BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_
+#include <cstddef>
#include <boost/memory_order.hpp>
#include <boost/atomic/detail/config.hpp>
#include <boost/atomic/detail/storage_type.hpp>
@@ -26,7 +27,7 @@ namespace boost {
namespace atomics {
namespace detail {
-template< typename Base, unsigned int Size, bool Signed >
+template< typename Base, std::size_t Size, bool Signed >
struct extending_cas_based_operations :
public Base
{
@@ -35,7 +36,8 @@ struct extending_cas_based_operations :
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
emulated_storage_type new_val;
do
{
@@ -47,7 +49,8 @@ struct extending_cas_based_operations :
static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
- storage_type old_val = Base::load(storage, memory_order_relaxed);
+ storage_type old_val;
+ atomics::detail::non_atomic_load(storage, old_val);
emulated_storage_type new_val;
do
{
diff --git a/boost/atomic/detail/ops_gcc_alpha.hpp b/boost/atomic/detail/ops_gcc_alpha.hpp
index 6978c7f1c4..3c0e258ceb 100644
--- a/boost/atomic/detail/ops_gcc_alpha.hpp
+++ b/boost/atomic/detail/ops_gcc_alpha.hpp
@@ -88,6 +88,7 @@ struct operations< 4u, Signed > :
public gcc_alpha_operations_base
{
typedef typename make_storage_type< 4u, Signed >::type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -599,6 +600,7 @@ struct operations< 8u, Signed > :
public gcc_alpha_operations_base
{
typedef typename make_storage_type< 8u, Signed >::type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
diff --git a/boost/atomic/detail/ops_gcc_arm.hpp b/boost/atomic/detail/ops_gcc_arm.hpp
index a28da6919d..d2c2f39a2c 100644
--- a/boost/atomic/detail/ops_gcc_arm.hpp
+++ b/boost/atomic/detail/ops_gcc_arm.hpp
@@ -156,6 +156,7 @@ struct operations< 4u, Signed > :
public gcc_arm_operations_base
{
typedef typename make_storage_type< 4u, Signed >::type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -677,6 +678,7 @@ struct operations< 8u, Signed > :
public gcc_arm_operations_base
{
typedef typename make_storage_type< 8u, Signed >::type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
diff --git a/boost/atomic/detail/ops_gcc_atomic.hpp b/boost/atomic/detail/ops_gcc_atomic.hpp
index 2e4c37bec7..573a695d08 100644
--- a/boost/atomic/detail/ops_gcc_atomic.hpp
+++ b/boost/atomic/detail/ops_gcc_atomic.hpp
@@ -180,6 +180,7 @@ template< bool Signed >
struct operations< 16u, Signed > :
public gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >
{
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
};
#endif
@@ -208,6 +209,7 @@ template< bool Signed >
struct operations< 8u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >
{
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
};
#else
@@ -216,6 +218,7 @@ template< bool Signed >
struct operations< 8u, Signed > :
public gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >
{
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
};
#endif
@@ -236,6 +239,7 @@ template< bool Signed >
struct operations< 4u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 4u, Signed >
{
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
};
#else // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
@@ -244,6 +248,7 @@ template< bool Signed >
struct operations< 4u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >
{
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
};
#endif // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
@@ -254,6 +259,7 @@ template< bool Signed >
struct operations< 4u, Signed > :
public gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >
{
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
};
#endif
@@ -274,6 +280,7 @@ template< bool Signed >
struct operations< 2u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 2u, Signed >
{
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
};
#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
@@ -282,6 +289,7 @@ template< bool Signed >
struct operations< 2u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 2u, Signed >
{
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
};
#else
@@ -290,6 +298,7 @@ template< bool Signed >
struct operations< 2u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >
{
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
};
#endif
@@ -300,6 +309,7 @@ template< bool Signed >
struct operations< 2u, Signed > :
public gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >
{
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
};
#endif
@@ -320,6 +330,7 @@ template< bool Signed >
struct operations< 1u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >, 1u, Signed >
{
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
};
#elif !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)
@@ -328,6 +339,7 @@ template< bool Signed >
struct operations< 1u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 1u, Signed >
{
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
};
#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)
@@ -336,6 +348,7 @@ template< bool Signed >
struct operations< 1u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 1u, Signed >
{
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
};
#else
@@ -344,6 +357,7 @@ template< bool Signed >
struct operations< 1u, Signed > :
public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >
{
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
};
#endif
@@ -354,6 +368,7 @@ template< bool Signed >
struct operations< 1u, Signed > :
public gcc_atomic_operations< typename make_storage_type< 1u, Signed >::type >
{
+ typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;
};
#endif
diff --git a/boost/atomic/detail/ops_gcc_ppc.hpp b/boost/atomic/detail/ops_gcc_ppc.hpp
index 8698ee8d76..9131791193 100644
--- a/boost/atomic/detail/ops_gcc_ppc.hpp
+++ b/boost/atomic/detail/ops_gcc_ppc.hpp
@@ -30,6 +30,9 @@ namespace boost {
namespace atomics {
namespace detail {
+// The implementation below uses information from this document:
+// http://www.rdrop.com/users/paulmck/scalability/paper/N2745r.2010.02.19a.html
+
/*
Refer to: Motorola: "Programming Environments Manual for 32-Bit
Implementations of the PowerPC Architecture", Appendix E:
@@ -84,7 +87,7 @@ struct gcc_ppc_operations_base
{
static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT
{
-#if defined(__powerpc64__)
+#if defined(__powerpc64__) || defined(__PPC64__)
if (order == memory_order_seq_cst)
__asm__ __volatile__ ("sync" ::: "memory");
else if ((order & memory_order_release) != 0)
@@ -100,12 +103,6 @@ struct gcc_ppc_operations_base
if ((order & (memory_order_consume | memory_order_acquire)) != 0)
__asm__ __volatile__ ("isync" ::: "memory");
}
-
- static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT
- {
- if (order == memory_order_seq_cst)
- __asm__ __volatile__ ("sync" ::: "memory");
- }
};
@@ -114,33 +111,47 @@ struct operations< 4u, Signed > :
public gcc_ppc_operations_base
{
typedef typename make_storage_type< 4u, Signed >::type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
fence_before(order);
__asm__ __volatile__
(
- "stw %1, %0\n"
+ "stw %1, %0\n\t"
: "+m" (storage)
: "r" (v)
);
- fence_after_store(order);
}
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
{
storage_type v;
- __asm__ __volatile__
- (
- "lwz %0, %1\n"
- "cmpw %0, %0\n"
- "bne- 1f\n"
- "1:\n"
- : "=&r" (v)
- : "m" (storage)
- : "cr0"
- );
- fence_after(order);
+ if (order == memory_order_seq_cst)
+ __asm__ __volatile__ ("sync" ::: "memory");
+ if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+ {
+ __asm__ __volatile__
+ (
+ "lwz %0, %1\n\t"
+ "cmpw %0, %0\n\t"
+ "bne- 1f\n\t"
+ "1:\n\t"
+ "isync\n\t"
+ : "=&r" (v)
+ : "m" (storage)
+ : "cr0", "memory"
+ );
+ }
+ else
+ {
+ __asm__ __volatile__
+ (
+ "lwz %0, %1\n\t"
+ : "=&r" (v)
+ : "m" (storage)
+ );
+ }
return v;
}
@@ -150,10 +161,10 @@ struct operations< 4u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y1\n"
- "stwcx. %2,%y1\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y1\n\t"
+ "stwcx. %2,%y1\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "+Z" (storage)
: "b" (v)
: "cr0"
@@ -169,14 +180,14 @@ struct operations< 4u, Signed > :
fence_before(success_order);
__asm__ __volatile__
(
- "li %1, 0\n"
- "lwarx %0,%y2\n"
- "cmpw %0, %3\n"
- "bne- 1f\n"
- "stwcx. %4,%y2\n"
- "bne- 1f\n"
- "li %1, 1\n"
- "1:"
+ "li %1, 0\n\t"
+ "lwarx %0,%y2\n\t"
+ "cmpw %0, %3\n\t"
+ "bne- 1f\n\t"
+ "stwcx. %4,%y2\n\t"
+ "bne- 1f\n\t"
+ "li %1, 1\n\t"
+ "1:\n\t"
: "=&b" (expected), "=&b" (success), "+Z" (storage)
: "b" (expected), "b" (desired)
: "cr0"
@@ -195,14 +206,14 @@ struct operations< 4u, Signed > :
fence_before(success_order);
__asm__ __volatile__
(
- "li %1, 0\n"
- "0: lwarx %0,%y2\n"
- "cmpw %0, %3\n"
- "bne- 1f\n"
- "stwcx. %4,%y2\n"
- "bne- 0b\n"
- "li %1, 1\n"
- "1:"
+ "li %1, 0\n\t"
+ "0: lwarx %0,%y2\n\t"
+ "cmpw %0, %3\n\t"
+ "bne- 1f\n\t"
+ "stwcx. %4,%y2\n\t"
+ "bne- 0b\n\t"
+ "li %1, 1\n\t"
+ "1:\n\t"
: "=&b" (expected), "=&b" (success), "+Z" (storage)
: "b" (expected), "b" (desired)
: "cr0"
@@ -220,11 +231,11 @@ struct operations< 4u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "add %1,%0,%3\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "add %1,%0,%3\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -239,11 +250,11 @@ struct operations< 4u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "sub %1,%0,%3\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "sub %1,%0,%3\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -258,11 +269,11 @@ struct operations< 4u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "and %1,%0,%3\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "and %1,%0,%3\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -277,11 +288,11 @@ struct operations< 4u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "or %1,%0,%3\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "or %1,%0,%3\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -296,11 +307,11 @@ struct operations< 4u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "xor %1,%0,%3\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "xor %1,%0,%3\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -339,12 +350,12 @@ struct operations< 1u, false > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "add %1,%0,%3\n"
- "rlwinm %1, %1, 0, 0xff\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "add %1,%0,%3\n\t"
+ "rlwinm %1, %1, 0, 0xff\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -359,12 +370,12 @@ struct operations< 1u, false > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "sub %1,%0,%3\n"
- "rlwinm %1, %1, 0, 0xff\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "sub %1,%0,%3\n\t"
+ "rlwinm %1, %1, 0, 0xff\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -387,12 +398,12 @@ struct operations< 1u, true > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "add %1,%0,%3\n"
- "extsb %1, %1\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "add %1,%0,%3\n\t"
+ "extsb %1, %1\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -407,12 +418,12 @@ struct operations< 1u, true > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "sub %1,%0,%3\n"
- "extsb %1, %1\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "sub %1,%0,%3\n\t"
+ "extsb %1, %1\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -436,12 +447,12 @@ struct operations< 2u, false > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "add %1,%0,%3\n"
- "rlwinm %1, %1, 0, 0xffff\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "add %1,%0,%3\n\t"
+ "rlwinm %1, %1, 0, 0xffff\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -456,12 +467,12 @@ struct operations< 2u, false > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "sub %1,%0,%3\n"
- "rlwinm %1, %1, 0, 0xffff\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "sub %1,%0,%3\n\t"
+ "rlwinm %1, %1, 0, 0xffff\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -484,12 +495,12 @@ struct operations< 2u, true > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "add %1,%0,%3\n"
- "extsh %1, %1\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "add %1,%0,%3\n\t"
+ "extsh %1, %1\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -504,12 +515,12 @@ struct operations< 2u, true > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "lwarx %0,%y2\n"
- "sub %1,%0,%3\n"
- "extsh %1, %1\n"
- "stwcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "lwarx %0,%y2\n\t"
+ "sub %1,%0,%3\n\t"
+ "extsh %1, %1\n\t"
+ "stwcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -520,40 +531,54 @@ struct operations< 2u, true > :
};
-#if defined(__powerpc64__)
+#if defined(__powerpc64__) || defined(__PPC64__)
template< bool Signed >
struct operations< 8u, Signed > :
public gcc_ppc_operations_base
{
typedef typename make_storage_type< 8u, Signed >::type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
fence_before(order);
__asm__ __volatile__
(
- "std %1, %0\n"
+ "std %1, %0\n\t"
: "+m" (storage)
: "r" (v)
);
- fence_after_store(order);
}
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT
{
storage_type v;
- __asm__ __volatile__
- (
- "ld %0, %1\n"
- "cmpd %0, %0\n"
- "bne- 1f\n"
- "1:\n"
- : "=&b" (v)
- : "m" (storage)
- : "cr0"
- );
- fence_after(order);
+ if (order == memory_order_seq_cst)
+ __asm__ __volatile__ ("sync" ::: "memory");
+ if ((order & (memory_order_consume | memory_order_acquire)) != 0)
+ {
+ __asm__ __volatile__
+ (
+ "ld %0, %1\n\t"
+ "cmpd %0, %0\n\t"
+ "bne- 1f\n\t"
+ "1:\n\t"
+ "isync\n\t"
+ : "=&b" (v)
+ : "m" (storage)
+ : "cr0", "memory"
+ );
+ }
+ else
+ {
+ __asm__ __volatile__
+ (
+ "ld %0, %1\n\t"
+ : "=&b" (v)
+ : "m" (storage)
+ );
+ }
return v;
}
@@ -563,10 +588,10 @@ struct operations< 8u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "ldarx %0,%y1\n"
- "stdcx. %2,%y1\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "ldarx %0,%y1\n\t"
+ "stdcx. %2,%y1\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "+Z" (storage)
: "b" (v)
: "cr0"
@@ -582,13 +607,13 @@ struct operations< 8u, Signed > :
fence_before(success_order);
__asm__ __volatile__
(
- "li %1, 0\n"
- "ldarx %0,%y2\n"
- "cmpd %0, %3\n"
- "bne- 1f\n"
- "stdcx. %4,%y2\n"
- "bne- 1f\n"
- "li %1, 1\n"
+ "li %1, 0\n\t"
+ "ldarx %0,%y2\n\t"
+ "cmpd %0, %3\n\t"
+ "bne- 1f\n\t"
+ "stdcx. %4,%y2\n\t"
+ "bne- 1f\n\t"
+ "li %1, 1\n\t"
"1:"
: "=&b" (expected), "=&b" (success), "+Z" (storage)
: "b" (expected), "b" (desired)
@@ -608,14 +633,14 @@ struct operations< 8u, Signed > :
fence_before(success_order);
__asm__ __volatile__
(
- "li %1, 0\n"
- "0: ldarx %0,%y2\n"
- "cmpd %0, %3\n"
- "bne- 1f\n"
- "stdcx. %4,%y2\n"
- "bne- 0b\n"
- "li %1, 1\n"
- "1:"
+ "li %1, 0\n\t"
+ "0: ldarx %0,%y2\n\t"
+ "cmpd %0, %3\n\t"
+ "bne- 1f\n\t"
+ "stdcx. %4,%y2\n\t"
+ "bne- 0b\n\t"
+ "li %1, 1\n\t"
+ "1:\n\t"
: "=&b" (expected), "=&b" (success), "+Z" (storage)
: "b" (expected), "b" (desired)
: "cr0"
@@ -633,11 +658,11 @@ struct operations< 8u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "ldarx %0,%y2\n"
- "add %1,%0,%3\n"
- "stdcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "ldarx %0,%y2\n\t"
+ "add %1,%0,%3\n\t"
+ "stdcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -652,11 +677,11 @@ struct operations< 8u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "ldarx %0,%y2\n"
- "sub %1,%0,%3\n"
- "stdcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "ldarx %0,%y2\n\t"
+ "sub %1,%0,%3\n\t"
+ "stdcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -671,11 +696,11 @@ struct operations< 8u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "ldarx %0,%y2\n"
- "and %1,%0,%3\n"
- "stdcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "ldarx %0,%y2\n\t"
+ "and %1,%0,%3\n\t"
+ "stdcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -690,11 +715,11 @@ struct operations< 8u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "ldarx %0,%y2\n"
- "or %1,%0,%3\n"
- "stdcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "ldarx %0,%y2\n\t"
+ "or %1,%0,%3\n\t"
+ "stdcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -709,11 +734,11 @@ struct operations< 8u, Signed > :
fence_before(order);
__asm__ __volatile__
(
- "1:\n"
- "ldarx %0,%y2\n"
- "xor %1,%0,%3\n"
- "stdcx. %1,%y2\n"
- "bne- 1b\n"
+ "1:\n\t"
+ "ldarx %0,%y2\n\t"
+ "xor %1,%0,%3\n\t"
+ "stdcx. %1,%y2\n\t"
+ "bne- 1b\n\t"
: "=&b" (original), "=&b" (tmp), "+Z" (storage)
: "b" (v)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC
@@ -738,7 +763,7 @@ struct operations< 8u, Signed > :
}
};
-#endif // defined(__powerpc64__)
+#endif // defined(__powerpc64__) || defined(__PPC64__)
BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
@@ -747,14 +772,12 @@ BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
{
case memory_order_consume:
case memory_order_acquire:
- __asm__ __volatile__ ("isync" ::: "memory");
- break;
case memory_order_release:
-#if defined(__powerpc64__)
+ case memory_order_acq_rel:
+#if defined(__powerpc64__) || defined(__PPC64__)
__asm__ __volatile__ ("lwsync" ::: "memory");
break;
#endif
- case memory_order_acq_rel:
case memory_order_seq_cst:
__asm__ __volatile__ ("sync" ::: "memory");
break;
@@ -765,7 +788,11 @@ BOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT
BOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT
{
if (order != memory_order_relaxed)
+#if defined(__ibmxl__) || defined(__IBMCPP__)
+ __fence();
+#else
__asm__ __volatile__ ("" ::: "memory");
+#endif
}
} // namespace detail
diff --git a/boost/atomic/detail/ops_gcc_sparc.hpp b/boost/atomic/detail/ops_gcc_sparc.hpp
index ea6df91dc6..020882bbfa 100644
--- a/boost/atomic/detail/ops_gcc_sparc.hpp
+++ b/boost/atomic/detail/ops_gcc_sparc.hpp
@@ -62,6 +62,7 @@ struct gcc_sparc_cas32 :
public gcc_sparc_cas_base
{
typedef typename make_storage_type< 4u, Signed >::type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -104,19 +105,6 @@ struct gcc_sparc_cas32 :
return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
}
- static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
- {
- return true;
- }
-};
-
-template< bool Signed >
-struct operations< 4u, Signed > :
- public cas_based_operations< gcc_sparc_cas32< Signed > >
-{
- typedef cas_based_operations< gcc_sparc_cas32< Signed > > base_type;
- typedef typename base_type::storage_type storage_type;
-
static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
base_type::fence_before(order);
@@ -131,13 +119,19 @@ struct operations< 4u, Signed > :
return v;
}
- static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT
+ static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
{
- return !!exchange(storage, (storage_type)1, order);
+ return true;
}
};
template< bool Signed >
+struct operations< 4u, Signed > :
+ public cas_based_operations< gcc_sparc_cas32< Signed > >
+{
+};
+
+template< bool Signed >
struct operations< 1u, Signed > :
public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >
{
@@ -154,6 +148,7 @@ struct gcc_sparc_cas64 :
public gcc_sparc_cas_base
{
typedef typename make_storage_type< 8u, Signed >::type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -204,7 +199,7 @@ struct gcc_sparc_cas64 :
template< bool Signed >
struct operations< 8u, Signed > :
- public cas_based_operations< gcc_sparc_cas64< Signed > >
+ public cas_based_operations< cas_based_exchange< gcc_sparc_cas64< Signed > > >
{
};
diff --git a/boost/atomic/detail/ops_gcc_sync.hpp b/boost/atomic/detail/ops_gcc_sync.hpp
index f4fc3331c6..87f2f53029 100644
--- a/boost/atomic/detail/ops_gcc_sync.hpp
+++ b/boost/atomic/detail/ops_gcc_sync.hpp
@@ -165,6 +165,17 @@ struct operations< 1u, Signed > :
public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >
#endif
{
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)
+ typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
+#else
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
+#endif
};
#endif
@@ -181,6 +192,15 @@ struct operations< 2u, Signed > :
public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >
#endif
{
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
+#else
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
+#endif
};
#endif
@@ -195,6 +215,13 @@ struct operations< 4u, Signed > :
public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >
#endif
{
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
+#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
+#else
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
+#endif
};
#endif
@@ -207,6 +234,11 @@ struct operations< 8u, Signed > :
public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >
#endif
{
+#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
+#else
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
+#endif
};
#endif
@@ -215,6 +247,7 @@ template< bool Signed >
struct operations< 16u, Signed > :
public gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >
{
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
};
#endif
diff --git a/boost/atomic/detail/ops_gcc_x86.hpp b/boost/atomic/detail/ops_gcc_x86.hpp
index 6e600457aa..f68125c491 100644
--- a/boost/atomic/detail/ops_gcc_x86.hpp
+++ b/boost/atomic/detail/ops_gcc_x86.hpp
@@ -115,6 +115,7 @@ struct operations< 1u, Signed > :
{
typedef gcc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -201,6 +202,7 @@ struct operations< 2u, Signed > :
{
typedef gcc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -287,6 +289,7 @@ struct operations< 4u, Signed > :
{
typedef gcc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -383,6 +386,7 @@ struct operations< 8u, Signed > :
{
typedef gcc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
diff --git a/boost/atomic/detail/ops_gcc_x86_dcas.hpp b/boost/atomic/detail/ops_gcc_x86_dcas.hpp
index a6109f926c..f7a84f79ce 100644
--- a/boost/atomic/detail/ops_gcc_x86_dcas.hpp
+++ b/boost/atomic/detail/ops_gcc_x86_dcas.hpp
@@ -36,6 +36,7 @@ template< bool Signed >
struct gcc_dcas_x86
{
typedef typename make_storage_type< 8u, Signed >::type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -68,6 +69,37 @@ struct gcc_dcas_x86
}
else
{
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+#if defined(__PIC__)
+ uint32_t scratch;
+ __asm__ __volatile__
+ (
+ "movl %%ebx, %[scratch]\n\t"
+ "movl %[value_lo], %%ebx\n\t"
+ "movl %[dest], %%eax\n\t"
+ "movl 4+%[dest], %%edx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg8b %[dest]\n\t"
+ "jne 1b\n\t"
+ "movl %[scratch], %%ebx\n\t"
+ : [scratch] "=m" (scratch), [dest] "=o" (storage)
+ : [value_lo] "a" ((uint32_t)v), "c" ((uint32_t)(v >> 32))
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "edx", "memory"
+ );
+#else // defined(__PIC__)
+ __asm__ __volatile__
+ (
+ "movl %[dest], %%eax\n\t"
+ "movl 4+%[dest], %%edx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg8b %[dest]\n\t"
+ "jne 1b\n\t"
+ : [dest] "=o" (storage)
+ : [value_lo] "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32))
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "eax", "edx", "memory"
+ );
+#endif // defined(__PIC__)
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
#if defined(__PIC__)
uint32_t scratch;
__asm__ __volatile__
@@ -79,7 +111,7 @@ struct gcc_dcas_x86
".align 16\n\t"
"1: lock; cmpxchg8b 0(%[dest])\n\t"
"jne 1b\n\t"
- "movl %[scratch], %%ebx"
+ "movl %[scratch], %%ebx\n\t"
#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
: [scratch] "=m,m" (scratch)
: [value_lo] "a,a" ((uint32_t)v), "c,c" ((uint32_t)(v >> 32)), [dest] "D,S" (&storage)
@@ -89,7 +121,7 @@ struct gcc_dcas_x86
#endif
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "edx", "memory"
);
-#else
+#else // defined(__PIC__)
__asm__ __volatile__
(
"movl 0(%[dest]), %%eax\n\t"
@@ -105,7 +137,8 @@ struct gcc_dcas_x86
#endif
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "eax", "edx", "memory"
);
-#endif
+#endif // defined(__PIC__)
+#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
}
}
@@ -152,7 +185,7 @@ struct gcc_dcas_x86
(
"movl %%ebx, %%eax\n\t"
"movl %%ecx, %%edx\n\t"
- "lock; cmpxchg8b %[storage]"
+ "lock; cmpxchg8b %[storage]\n\t"
: "=&A" (value)
: [storage] "m" (storage)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
@@ -191,7 +224,7 @@ struct gcc_dcas_x86
"movl %[desired_lo], %%ebx\n\t"
"lock; cmpxchg8b %[dest]\n\t"
"movl %[scratch], %%ebx\n\t"
- "sete %[success]"
+ "sete %[success]\n\t"
#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
: "+A,A,A,A,A,A" (expected), [dest] "+m,m,m,m,m,m" (storage), [scratch] "=m,m,m,m,m,m" (scratch), [success] "=q,m,q,m,q,m" (success)
: [desired_lo] "S,S,D,D,m,m" ((uint32_t)desired), "c,c,c,c,c,c" ((uint32_t)(desired >> 32))
@@ -207,7 +240,7 @@ struct gcc_dcas_x86
__asm__ __volatile__
(
"lock; cmpxchg8b %[dest]\n\t"
- "sete %[success]"
+ "sete %[success]\n\t"
#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
: "+A,A" (expected), [dest] "+m,m" (storage), [success] "=q,m" (success)
: "b,b" ((uint32_t)desired), "c,c" ((uint32_t)(desired >> 32))
@@ -227,6 +260,97 @@ struct gcc_dcas_x86
return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
}
+ static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+ {
+#if defined(__clang__)
+ // Clang cannot allocate eax:edx register pairs but it has sync intrinsics
+ storage_type old_val = storage;
+ while (true)
+ {
+ storage_type val = __sync_val_compare_and_swap(&storage, old_val, v);
+ if (val == old_val)
+ return val;
+ old_val = val;
+ }
+#elif !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+#if defined(__PIC__)
+ uint32_t scratch;
+ __asm__ __volatile__
+ (
+ "movl %%ebx, %[scratch]\n\t"
+ "movl %%eax, %%ebx\n\t"
+ "movl %%edx, %%ecx\n\t"
+ "movl %[dest], %%eax\n\t"
+ "movl 4+%[dest], %%edx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg8b %[dest]\n\t"
+ "jne 1b\n\t"
+ "movl %[scratch], %%ebx\n\t"
+ : "+A" (v), [scratch] "=m" (scratch), [dest] "+o" (storage)
+ :
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "ecx", "memory"
+ );
+ return v;
+#else // defined(__PIC__)
+ __asm__ __volatile__
+ (
+ "movl %[dest], %%eax\n\t"
+ "movl 4+%[dest], %%edx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg8b %[dest]\n\t"
+ "jne 1b\n\t"
+ : "=A" (v), [dest] "+o" (storage)
+ : "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32))
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+ );
+ return v;
+#endif // defined(__PIC__)
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+#if defined(__PIC__)
+ uint32_t scratch;
+ __asm__ __volatile__
+ (
+ "movl %%ebx, %[scratch]\n\t"
+ "movl %%eax, %%ebx\n\t"
+ "movl %%edx, %%ecx\n\t"
+ "movl 0(%[dest]), %%eax\n\t"
+ "movl 4(%[dest]), %%edx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg8b 0(%[dest])\n\t"
+ "jne 1b\n\t"
+ "movl %[scratch], %%ebx\n\t"
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+ : "+A,A" (v), [scratch] "=m,m" (scratch)
+ : [dest] "D,S" (&storage)
+#else
+ : "+A" (v), [scratch] "=m" (scratch)
+ : [dest] "D" (&storage)
+#endif
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "ecx", "memory"
+ );
+ return v;
+#else // defined(__PIC__)
+ __asm__ __volatile__
+ (
+ "movl 0(%[dest]), %%eax\n\t"
+ "movl 4(%[dest]), %%edx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg8b 0(%[dest])\n\t"
+ "jne 1b\n\t"
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
+ : "=A,A" (v)
+ : "b,b" ((uint32_t)v), "c,c" ((uint32_t)(v >> 32)), [dest] "D,S" (&storage)
+#else
+ : "=A" (v)
+ : "b" ((uint32_t)v), "c" ((uint32_t)(v >> 32)), [dest] "D" (&storage)
+#endif
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+ );
+ return v;
+#endif // defined(__PIC__)
+#endif
+ }
+
static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
{
return true;
@@ -241,21 +365,36 @@ template< bool Signed >
struct gcc_dcas_x86_64
{
typedef typename make_storage_type< 16u, Signed >::type storage_type;
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
uint64_t const* p_value = (uint64_t const*)&v;
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq %[dest], %%rax\n\t"
+ "movq 8+%[dest], %%rdx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg16b %[dest]\n\t"
+ "jne 1b\n\t"
+ : [dest] "=o" (storage)
+ : "b" (p_value[0]), "c" (p_value[1])
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "rax", "rdx", "memory"
+ );
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
__asm__ __volatile__
(
"movq 0(%[dest]), %%rax\n\t"
"movq 8(%[dest]), %%rdx\n\t"
".align 16\n\t"
"1: lock; cmpxchg16b 0(%[dest])\n\t"
- "jne 1b"
+ "jne 1b\n\t"
:
: "b" (p_value[0]), "c" (p_value[1]), [dest] "r" (&storage)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "rax", "rdx", "memory"
);
+#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
}
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
@@ -264,16 +403,49 @@ struct gcc_dcas_x86_64
// Clang cannot allocate rax:rdx register pairs but it has sync intrinsics
storage_type value = storage_type();
return __sync_val_compare_and_swap(&storage, value, value);
-#else
+#elif defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)
+ // GCC 4.4 can't allocate rax:rdx register pair either but it also doesn't support 128-bit __sync_val_compare_and_swap
storage_type value;
// We don't care for comparison result here; the previous value will be stored into value anyway.
// Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
__asm__ __volatile__
(
"movq %%rbx, %%rax\n\t"
"movq %%rcx, %%rdx\n\t"
- "lock; cmpxchg16b %[storage]"
+ "lock; cmpxchg16b %[storage]\n\t"
+ "movq %%rax, %[value]\n\t"
+ "movq %%rdx, 8+%[value]\n\t"
+ : [value] "=o" (value)
+ : [storage] "m" (storage)
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory", "rax", "rdx"
+ );
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq %%rbx, %%rax\n\t"
+ "movq %%rcx, %%rdx\n\t"
+ "lock; cmpxchg16b %[storage]\n\t"
+ "movq %%rax, 0(%[value])\n\t"
+ "movq %%rdx, 8(%[value])\n\t"
+ :
+ : [storage] "m" (storage), [value] "r" (&value)
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory", "rax", "rdx"
+ );
+#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+
+ return value;
+#else // defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)
+ storage_type value;
+
+ // We don't care for comparison result here; the previous value will be stored into value anyway.
+ // Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.
+ __asm__ __volatile__
+ (
+ "movq %%rbx, %%rax\n\t"
+ "movq %%rcx, %%rdx\n\t"
+ "lock; cmpxchg16b %[storage]\n\t"
: "=&A" (value)
: [storage] "m" (storage)
: BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
@@ -291,13 +463,46 @@ struct gcc_dcas_x86_64
storage_type old_expected = expected;
expected = __sync_val_compare_and_swap(&storage, old_expected, desired);
return expected == old_expected;
-#else
+#elif defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)
+ // GCC 4.4 can't allocate rax:rdx register pair either but it also doesn't support 128-bit __sync_val_compare_and_swap
+ uint64_t const* p_desired = (uint64_t const*)&desired;
+ bool success;
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq %[expected], %%rax\n\t"
+ "movq 8+%[expected], %%rdx\n\t"
+ "lock; cmpxchg16b %[dest]\n\t"
+ "sete %[success]\n\t"
+ "movq %%rax, %[expected]\n\t"
+ "movq %%rdx, 8+%[expected]\n\t"
+ : [dest] "+m" (storage), [expected] "+o" (expected), [success] "=q" (success)
+ : "b" (p_desired[0]), "c" (p_desired[1])
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory", "rax", "rdx"
+ );
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq 0(%[expected]), %%rax\n\t"
+ "movq 8(%[expected]), %%rdx\n\t"
+ "lock; cmpxchg16b %[dest]\n\t"
+ "sete %[success]\n\t"
+ "movq %%rax, 0(%[expected])\n\t"
+ "movq %%rdx, 8(%[expected])\n\t"
+ : [dest] "+m" (storage), [success] "=q" (success)
+ : "b" (p_desired[0]), "c" (p_desired[1]), [expected] "r" (&expected)
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory", "rax", "rdx"
+ );
+#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+
+ return success;
+#else // defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)
uint64_t const* p_desired = (uint64_t const*)&desired;
bool success;
__asm__ __volatile__
(
"lock; cmpxchg16b %[dest]\n\t"
- "sete %[success]"
+ "sete %[success]\n\t"
#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)
: "+A,A" (expected), [dest] "+m,m" (storage), [success] "=q,m" (success)
: "b,b" (p_desired[0]), "c,c" (p_desired[1])
@@ -317,6 +522,85 @@ struct gcc_dcas_x86_64
return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
}
+ static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+ {
+#if defined(__clang__)
+ // Clang cannot allocate eax:edx register pairs but it has sync intrinsics
+ storage_type old_val = storage;
+ while (true)
+ {
+ storage_type val = __sync_val_compare_and_swap(&storage, old_val, v);
+ if (val == old_val)
+ return val;
+ old_val = val;
+ }
+#elif defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)
+ // GCC 4.4 can't allocate rax:rdx register pair either but it also doesn't support 128-bit __sync_val_compare_and_swap
+ storage_type old_value;
+ uint64_t const* p_value = (uint64_t const*)&v;
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq %[dest], %%rax\n\t"
+ "movq 8+%[dest], %%rdx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg16b %[dest]\n\t"
+ "jne 1b\n\t"
+ "movq %%rax, %[old_value]\n\t"
+ "movq %%rdx, 8+%[old_value]\n\t"
+ : [dest] "+o" (storage), [old_value] "=o" (old_value)
+ : "b" (p_value[0]), "c" (p_value[1])
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory", "rax", "rdx"
+ );
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq 0(%[dest]), %%rax\n\t"
+ "movq 8(%[dest]), %%rdx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg16b 0(%[dest])\n\t"
+ "jne 1b\n\t"
+ "movq %%rax, 0(%[old_value])\n\t"
+ "movq %%rdx, 8(%[old_value])\n\t"
+ :
+ : "b" (p_value[0]), "c" (p_value[1]), [dest] "r" (&storage), [old_value] "r" (&old_value)
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory", "rax", "rdx"
+ );
+#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+
+ return old_value;
+#else // defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)
+ uint64_t const* p_value = (uint64_t const*)&v;
+#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq %[dest], %%rax\n\t"
+ "movq 8+%[dest], %%rdx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg16b %[dest]\n\t"
+ "jne 1b\n\t"
+ : "=&A" (v), [dest] "+o" (storage)
+ : "b" (p_value[0]), "c" (p_value[1])
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+ );
+#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+ __asm__ __volatile__
+ (
+ "movq 0(%[dest]), %%rax\n\t"
+ "movq 8(%[dest]), %%rdx\n\t"
+ ".align 16\n\t"
+ "1: lock; cmpxchg16b 0(%[dest])\n\t"
+ "jne 1b\n\t"
+ : "=&A" (v)
+ : "b" (p_value[0]), "c" (p_value[1]), [dest] "r" (&storage)
+ : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA "memory"
+ );
+#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)
+
+ return v;
+#endif
+ }
+
static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
{
return true;
diff --git a/boost/atomic/detail/ops_linux_arm.hpp b/boost/atomic/detail/ops_linux_arm.hpp
index 25167b1974..41713a35f5 100644
--- a/boost/atomic/detail/ops_linux_arm.hpp
+++ b/boost/atomic/detail/ops_linux_arm.hpp
@@ -87,6 +87,7 @@ struct linux_arm_cas :
public linux_arm_cas_base
{
typedef typename make_storage_type< 4u, Signed >::type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -142,19 +143,19 @@ struct linux_arm_cas :
template< bool Signed >
struct operations< 1u, Signed > :
- public extending_cas_based_operations< cas_based_operations< linux_arm_cas< Signed > >, 1u, Signed >
+ public extending_cas_based_operations< cas_based_operations< cas_based_exchange< linux_arm_cas< Signed > > >, 1u, Signed >
{
};
template< bool Signed >
struct operations< 2u, Signed > :
- public extending_cas_based_operations< cas_based_operations< linux_arm_cas< Signed > >, 2u, Signed >
+ public extending_cas_based_operations< cas_based_operations< cas_based_exchange< linux_arm_cas< Signed > > >, 2u, Signed >
{
};
template< bool Signed >
struct operations< 4u, Signed > :
- public cas_based_operations< linux_arm_cas< Signed > >
+ public cas_based_operations< cas_based_exchange< linux_arm_cas< Signed > > >
{
};
diff --git a/boost/atomic/detail/ops_msvc_arm.hpp b/boost/atomic/detail/ops_msvc_arm.hpp
index 349f7a5ae8..ff953d67e3 100644
--- a/boost/atomic/detail/ops_msvc_arm.hpp
+++ b/boost/atomic/detail/ops_msvc_arm.hpp
@@ -135,6 +135,7 @@ struct operations< 1u, Signed > :
{
typedef msvc_arm_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -300,6 +301,7 @@ struct operations< 2u, Signed > :
{
typedef msvc_arm_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -465,6 +467,7 @@ struct operations< 4u, Signed > :
{
typedef msvc_arm_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -630,6 +633,7 @@ struct operations< 8u, Signed > :
{
typedef msvc_arm_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
diff --git a/boost/atomic/detail/ops_msvc_x86.hpp b/boost/atomic/detail/ops_msvc_x86.hpp
index 501d9c622d..589c029864 100644
--- a/boost/atomic/detail/ops_msvc_x86.hpp
+++ b/boost/atomic/detail/ops_msvc_x86.hpp
@@ -166,6 +166,7 @@ struct operations< 4u, Signed > :
{
typedef msvc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -237,6 +238,7 @@ struct operations< 1u, Signed > :
{
typedef msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -281,6 +283,7 @@ struct operations< 1u, Signed > :
{
typedef msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -421,6 +424,7 @@ struct operations< 2u, Signed > :
{
typedef msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -465,6 +469,7 @@ struct operations< 2u, Signed > :
{
typedef msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
@@ -604,6 +609,7 @@ template< bool Signed >
struct msvc_dcas_x86
{
typedef typename make_storage_type< 8u, Signed >::type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
// Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A, 8.1.1. Guaranteed Atomic Operations:
//
@@ -611,10 +617,12 @@ struct msvc_dcas_x86
// * Reading or writing a quadword aligned on a 64-bit boundary
//
// Luckily, the memory is almost always 8-byte aligned in our case because atomic<> uses 64 bit native types for storage and dynamic memory allocations
- // have at least 8 byte alignment. The only unfortunate case is when atomic is placeod on the stack and it is not 8-byte aligned (like on 32 bit Windows).
+ // have at least 8 byte alignment. The only unfortunate case is when atomic is placed on the stack and it is not 8-byte aligned (like on 32 bit Windows).
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
storage_type volatile* p = &storage;
if (((uint32_t)p & 0x00000007) == 0)
{
@@ -661,10 +669,14 @@ struct msvc_dcas_x86
mov ebx, backup
};
}
+
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
}
static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT
{
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
storage_type const volatile* p = &storage;
storage_type value;
@@ -710,18 +722,23 @@ struct msvc_dcas_x86
};
}
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
return value;
}
static BOOST_FORCEINLINE bool compare_exchange_strong(
storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT
{
+ // MSVC-11 in 32-bit mode sometimes generates messed up code without compiler barriers,
+ // even though the _InterlockedCompareExchange64 intrinsic already provides one.
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
storage_type volatile* p = &storage;
#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64)
const storage_type old_val = (storage_type)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(p, desired, expected);
const bool result = (old_val == expected);
expected = old_val;
- return result;
#else
bool result;
int backup;
@@ -740,8 +757,10 @@ struct msvc_dcas_x86
mov ebx, backup
sete result
};
- return result;
#endif
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+ return result;
}
static BOOST_FORCEINLINE bool compare_exchange_weak(
@@ -750,6 +769,34 @@ struct msvc_dcas_x86
return compare_exchange_strong(storage, expected, desired, success_order, failure_order);
}
+ static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
+ {
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+ storage_type volatile* p = &storage;
+ int backup;
+ __asm
+ {
+ mov backup, ebx
+ mov edi, p
+ mov ebx, dword ptr [v]
+ mov ecx, dword ptr [v + 4]
+ mov eax, dword ptr [edi]
+ mov edx, dword ptr [edi + 4]
+ align 16
+ again:
+ lock cmpxchg8b qword ptr [edi]
+ jne again
+ mov ebx, backup
+ mov dword ptr [v], eax
+ mov dword ptr [v + 4], edx
+ };
+
+ BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();
+
+ return v;
+ }
+
static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT
{
return true;
@@ -770,6 +817,7 @@ struct operations< 8u, Signed > :
{
typedef msvc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -814,6 +862,7 @@ template< bool Signed >
struct msvc_dcas_x86_64
{
typedef typename make_storage_type< 16u, Signed >::type storage_type;
+ typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT
{
@@ -848,7 +897,7 @@ struct msvc_dcas_x86_64
template< bool Signed >
struct operations< 16u, Signed > :
- public cas_based_operations< msvc_dcas_x86_64< Signed > >
+ public cas_based_operations< cas_based_exchange< msvc_dcas_x86_64< Signed > > >
{
};
diff --git a/boost/atomic/detail/ops_windows.hpp b/boost/atomic/detail/ops_windows.hpp
index 1b4b04c8bc..191eb84d0a 100644
--- a/boost/atomic/detail/ops_windows.hpp
+++ b/boost/atomic/detail/ops_windows.hpp
@@ -110,6 +110,7 @@ struct operations< 4u, Signed > :
{
typedef windows_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;
typedef typename base_type::storage_type storage_type;
+ typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;
static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT
{
diff --git a/boost/atomic/detail/platform.hpp b/boost/atomic/detail/platform.hpp
index 76ad4ebb8f..b6c48ef0f9 100644
--- a/boost/atomic/detail/platform.hpp
+++ b/boost/atomic/detail/platform.hpp
@@ -24,7 +24,13 @@
#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)
// Compiler-based backends
-#if ((defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 407)) ||\
+#if (defined(__ibmxl__) || defined(__IBMCPP__)) && defined(__PPC__)
+
+// IBM XL C++ Compiler has to be checked before GCC/Clang as it pretends to be one but does not support __atomic* intrinsics.
+// It does support GCC inline assembler though.
+#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_ppc
+
+#elif ((defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 407)) ||\
(defined(BOOST_CLANG) && ((__clang_major__ * 100 + __clang_minor__) >= 302))) &&\
(\
(__GCC_ATOMIC_BOOL_LOCK_FREE + 0) == 2 ||\
diff --git a/boost/atomic/detail/storage_type.hpp b/boost/atomic/detail/storage_type.hpp
index a024f1d327..63a7cef581 100644
--- a/boost/atomic/detail/storage_type.hpp
+++ b/boost/atomic/detail/storage_type.hpp
@@ -16,9 +16,12 @@
#ifndef BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_
#define BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_
-#include <cstring>
+#include <cstddef>
#include <boost/cstdint.hpp>
#include <boost/atomic/detail/config.hpp>
+#if !defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP) || !defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY)
+#include <cstring>
+#endif
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
@@ -28,84 +31,163 @@ namespace boost {
namespace atomics {
namespace detail {
-template< unsigned int Size >
+template< typename T >
+BOOST_FORCEINLINE void non_atomic_load(T const volatile& from, T& to) BOOST_NOEXCEPT
+{
+ to = from;
+}
+
+template< std::size_t Size >
struct buffer_storage
{
- unsigned char data[Size];
+ BOOST_ALIGNMENT(16) unsigned char data[Size];
BOOST_FORCEINLINE bool operator! () const BOOST_NOEXCEPT
{
- bool result = true;
- for (unsigned int i = 0; i < Size && result; ++i)
- {
- result &= data[i] == 0;
- }
- return result;
+ return (data[0] == 0u && BOOST_ATOMIC_DETAIL_MEMCMP(data, data + 1, Size - 1) == 0);
}
BOOST_FORCEINLINE bool operator== (buffer_storage const& that) const BOOST_NOEXCEPT
{
- return std::memcmp(data, that.data, Size) == 0;
+ return BOOST_ATOMIC_DETAIL_MEMCMP(data, that.data, Size) == 0;
}
BOOST_FORCEINLINE bool operator!= (buffer_storage const& that) const BOOST_NOEXCEPT
{
- return std::memcmp(data, that.data, Size) != 0;
+ return BOOST_ATOMIC_DETAIL_MEMCMP(data, that.data, Size) != 0;
}
};
-template< unsigned int Size, bool Signed >
+template< std::size_t Size >
+BOOST_FORCEINLINE void non_atomic_load(buffer_storage< Size > const volatile& from, buffer_storage< Size >& to) BOOST_NOEXCEPT
+{
+ BOOST_ATOMIC_DETAIL_MEMCPY(to.data, const_cast< unsigned char const* >(from.data), Size);
+}
+
+template< std::size_t Size, bool Signed >
struct make_storage_type
{
typedef buffer_storage< Size > type;
+
+ struct aligned
+ {
+ type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type const& v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 1u, false >
{
typedef boost::uint8_t type;
+
+ struct aligned
+ {
+ type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 1u, true >
{
typedef boost::int8_t type;
+
+ struct aligned
+ {
+ type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 2u, false >
{
typedef boost::uint16_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(2) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 2u, true >
{
typedef boost::int16_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(2) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 4u, false >
{
typedef boost::uint32_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(4) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 4u, true >
{
typedef boost::int32_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(4) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 8u, false >
{
typedef boost::uint64_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(8) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 8u, true >
{
typedef boost::int64_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(8) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
#if defined(BOOST_HAS_INT128)
@@ -114,17 +196,33 @@ template< >
struct make_storage_type< 16u, false >
{
typedef boost::uint128_type type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(16) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
template< >
struct make_storage_type< 16u, true >
{
typedef boost::int128_type type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(16) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}
+ };
};
#elif !defined(BOOST_NO_ALIGNMENT)
-struct BOOST_ALIGNMENT(16) storage128_t
+struct storage128_t
{
boost::uint64_t data[2];
@@ -143,10 +241,24 @@ BOOST_FORCEINLINE bool operator!= (storage128_t const& left, storage128_t const&
return !(left == right);
}
+BOOST_FORCEINLINE void non_atomic_load(storage128_t const volatile& from, storage128_t& to) BOOST_NOEXCEPT
+{
+ to.data[0] = from.data[0];
+ to.data[1] = from.data[1];
+}
+
template< bool Signed >
struct make_storage_type< 16u, Signed >
{
typedef storage128_t type;
+
+ struct aligned
+ {
+ BOOST_ALIGNMENT(16) type value;
+
+ BOOST_DEFAULTED_FUNCTION(aligned(), {})
+ BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type const& v) BOOST_NOEXCEPT : value(v) {}
+ };
};
#endif
diff --git a/boost/bind.hpp b/boost/bind.hpp
index fd3421ea5a..450120c7a7 100644
--- a/boost/bind.hpp
+++ b/boost/bind.hpp
@@ -10,7 +10,7 @@
//
// bind.hpp - binds function objects to arguments
//
-// Copyright (c) 2009 Peter Dimov
+// Copyright (c) 2009, 2015 Peter Dimov
//
// Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at
@@ -21,4 +21,21 @@
#include <boost/bind/bind.hpp>
+#ifndef BOOST_BIND_NO_PLACEHOLDERS
+
+#if defined(BOOST_CLANG)
+# pragma clang diagnostic push
+# if __has_warning("-Wheader-hygiene")
+# pragma clang diagnostic ignored "-Wheader-hygiene"
+# endif
+#endif
+
+using namespace boost::placeholders;
+
+#if defined(BOOST_CLANG)
+# pragma clang diagnostic pop
+#endif
+
+#endif // #ifndef BOOST_BIND_NO_PLACEHOLDERS
+
#endif // #ifndef BOOST_BIND_HPP_INCLUDED
diff --git a/boost/bind/arg.hpp b/boost/bind/arg.hpp
index c879bb408b..a74b8298be 100644
--- a/boost/bind/arg.hpp
+++ b/boost/bind/arg.hpp
@@ -28,17 +28,17 @@ namespace boost
template< int I > struct arg
{
- arg()
+ BOOST_CONSTEXPR arg()
{
}
- template< class T > arg( T const & /* t */ )
+ template< class T > BOOST_CONSTEXPR arg( T const & /* t */ )
{
BOOST_STATIC_ASSERT( I == is_placeholder<T>::value );
}
};
-template< int I > bool operator==( arg<I> const &, arg<I> const & )
+template< int I > BOOST_CONSTEXPR bool operator==( arg<I> const &, arg<I> const & )
{
return true;
}
diff --git a/boost/bind/bind.hpp b/boost/bind/bind.hpp
index fd05131236..f793551d1a 100644
--- a/boost/bind/bind.hpp
+++ b/boost/bind/bind.hpp
@@ -32,6 +32,10 @@
#include <boost/core/enable_if.hpp>
#include <boost/core/is_same.hpp>
+#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
+#include <utility> // std::forward
+#endif
+
// Borland-specific bug, visit_each() silently fails to produce code
#if defined(__BORLANDC__)
@@ -863,14 +867,337 @@ public:
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
-template< class A > struct list_add_cref
+template< class A1 > class rrlist1
+{
+private:
+
+ A1 & a1_; // not A1&& because of msvc-10.0
+
+public:
+
+ explicit rrlist1( A1 & a1 ): a1_( a1 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); } // not static_cast because of g++ 4.9
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2 > class rrlist2
{
- typedef A const & type;
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+
+public:
+
+ rrlist2( A1 & a1, A2 & a2 ): a1_( a1 ), a2_( a2 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2, class A3 > class rrlist3
+{
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+
+public:
+
+ rrlist3( A1 & a1, A2 & a2, A3 & a3 ): a1_( a1 ), a2_( a2 ), a3_( a3 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
};
-template< class A > struct list_add_cref< A& >
+template< class A1, class A2, class A3, class A4 > class rrlist4
{
- typedef A & type;
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+ A4 & a4_;
+
+public:
+
+ rrlist4( A1 & a1, A2 & a2, A3 & a3, A4 & a4 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2, class A3, class A4, class A5 > class rrlist5
+{
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+ A4 & a4_;
+ A5 & a5_;
+
+public:
+
+ rrlist5( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2, class A3, class A4, class A5, class A6 > class rrlist6
+{
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+ A4 & a4_;
+ A5 & a5_;
+ A6 & a6_;
+
+public:
+
+ rrlist6( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2, class A3, class A4, class A5, class A6, class A7 > class rrlist7
+{
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+ A4 & a4_;
+ A5 & a5_;
+ A6 & a6_;
+ A7 & a7_;
+
+public:
+
+ rrlist7( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
+ A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
+ A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class rrlist8
+{
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+ A4 & a4_;
+ A5 & a5_;
+ A6 & a6_;
+ A7 & a7_;
+ A8 & a8_;
+
+public:
+
+ rrlist8( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ), a8_( a8 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
+ A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
+ A8 && operator[] (boost::arg<8>) const { return std::forward<A8>( a8_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
+ A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
+ A8 && operator[] (boost::arg<8> (*) ()) const { return std::forward<A8>( a8_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
+};
+
+template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > class rrlist9
+{
+private:
+
+ A1 & a1_;
+ A2 & a2_;
+ A3 & a3_;
+ A4 & a4_;
+ A5 & a5_;
+ A6 & a6_;
+ A7 & a7_;
+ A8 & a8_;
+ A9 & a9_;
+
+public:
+
+ rrlist9( A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9 ): a1_( a1 ), a2_( a2 ), a3_( a3 ), a4_( a4 ), a5_( a5 ), a6_( a6 ), a7_( a7 ), a8_( a8 ), a9_( a9 ) {}
+
+ A1 && operator[] (boost::arg<1>) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2>) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3>) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4>) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5>) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6>) const { return std::forward<A6>( a6_ ); }
+ A7 && operator[] (boost::arg<7>) const { return std::forward<A7>( a7_ ); }
+ A8 && operator[] (boost::arg<8>) const { return std::forward<A8>( a8_ ); }
+ A9 && operator[] (boost::arg<9>) const { return std::forward<A9>( a9_ ); }
+
+ A1 && operator[] (boost::arg<1> (*) ()) const { return std::forward<A1>( a1_ ); }
+ A2 && operator[] (boost::arg<2> (*) ()) const { return std::forward<A2>( a2_ ); }
+ A3 && operator[] (boost::arg<3> (*) ()) const { return std::forward<A3>( a3_ ); }
+ A4 && operator[] (boost::arg<4> (*) ()) const { return std::forward<A4>( a4_ ); }
+ A5 && operator[] (boost::arg<5> (*) ()) const { return std::forward<A5>( a5_ ); }
+ A6 && operator[] (boost::arg<6> (*) ()) const { return std::forward<A6>( a6_ ); }
+ A7 && operator[] (boost::arg<7> (*) ()) const { return std::forward<A7>( a7_ ); }
+ A8 && operator[] (boost::arg<8> (*) ()) const { return std::forward<A8>( a8_ ); }
+ A9 && operator[] (boost::arg<9> (*) ()) const { return std::forward<A9>( a9_ ); }
+
+ template<class T> T & operator[] ( _bi::value<T> & v ) const { return v.get(); }
+
+ template<class T> T const & operator[] ( _bi::value<T> const & v ) const { return v.get(); }
+
+ template<class T> T & operator[] (reference_wrapper<T> const & v) const { return v.get(); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> & b) const { return b.eval(*this); }
+
+ template<class R, class F, class L> typename result_traits<R, F>::type operator[] (bind_t<R, F, L> const & b) const { return b.eval(*this); }
};
template<class R, class F, class L> class bind_t
@@ -903,221 +1230,109 @@ public:
template<class A1> result_type operator()( A1 && a1 )
{
- list1< typename list_add_cref<A1>::type > a( a1 );
+ rrlist1< A1 > a( a1 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1> result_type operator()( A1 && a1 ) const
{
- list1< typename list_add_cref<A1>::type > a( a1 );
+ rrlist1< A1 > a( a1 );
return l_(type<result_type>(), f_, a, 0);
}
template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 )
{
- list2< typename list_add_cref<A1>::type, typename list_add_cref<A2>::type > a( a1, a2 );
+ rrlist2< A1, A2 > a( a1, a2 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2> result_type operator()( A1 && a1, A2 && a2 ) const
{
- list2< typename list_add_cref<A1>::type, typename list_add_cref<A2>::type > a( a1, a2 );
+ rrlist2< A1, A2 > a( a1, a2 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 )
{
- list3<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type
- > a( a1, a2, a3 );
-
+ rrlist3< A1, A2, A3 > a( a1, a2, a3 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3> result_type operator()( A1 && a1, A2 && a2, A3 && a3 ) const
{
- list3<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type
- > a( a1, a2, a3 );
-
+ rrlist3< A1, A2, A3 > a( a1, a2, a3 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 )
{
- list4<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type
- > a( a1, a2, a3, a4 );
-
+ rrlist4< A1, A2, A3, A4 > a( a1, a2, a3, a4 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4 ) const
{
- list4<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type
- > a( a1, a2, a3, a4 );
-
+ rrlist4< A1, A2, A3, A4 > a( a1, a2, a3, a4 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 )
{
- list5<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type
- > a( a1, a2, a3, a4, a5 );
-
+ rrlist5< A1, A2, A3, A4, A5 > a( a1, a2, a3, a4, a5 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5 ) const
{
- list5<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type
- > a( a1, a2, a3, a4, a5 );
-
+ rrlist5< A1, A2, A3, A4, A5 > a( a1, a2, a3, a4, a5 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 )
{
- list6<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type
- > a( a1, a2, a3, a4, a5, a6 );
-
+ rrlist6< A1, A2, A3, A4, A5, A6 > a( a1, a2, a3, a4, a5, a6 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6 ) const
{
- list6<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type
- > a( a1, a2, a3, a4, a5, a6 );
-
+ rrlist6< A1, A2, A3, A4, A5, A6 > a( a1, a2, a3, a4, a5, a6 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 )
{
- list7<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type,
- typename list_add_cref<A7>::type
- > a( a1, a2, a3, a4, a5, a6, a7 );
-
+ rrlist7< A1, A2, A3, A4, A5, A6, A7 > a( a1, a2, a3, a4, a5, a6, a7 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7 ) const
{
- list7<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type,
- typename list_add_cref<A7>::type
- > a( a1, a2, a3, a4, a5, a6, a7 );
-
+ rrlist7< A1, A2, A3, A4, A5, A6, A7 > a( a1, a2, a3, a4, a5, a6, a7 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 )
{
- list8<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type,
- typename list_add_cref<A7>::type,
- typename list_add_cref<A8>::type
- > a( a1, a2, a3, a4, a5, a6, a7, a8 );
-
+ rrlist8< A1, A2, A3, A4, A5, A6, A7, A8 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8 ) const
{
- list8<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type,
- typename list_add_cref<A7>::type,
- typename list_add_cref<A8>::type
- > a( a1, a2, a3, a4, a5, a6, a7, a8 );
-
+ rrlist8< A1, A2, A3, A4, A5, A6, A7, A8 > a( a1, a2, a3, a4, a5, a6, a7, a8 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 )
{
- list9<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type,
- typename list_add_cref<A7>::type,
- typename list_add_cref<A8>::type,
- typename list_add_cref<A9>::type
- > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
-
+ rrlist9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
return l_( type<result_type>(), f_, a, 0 );
}
template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 && a9 ) const
{
- list9<
- typename list_add_cref<A1>::type,
- typename list_add_cref<A2>::type,
- typename list_add_cref<A3>::type,
- typename list_add_cref<A4>::type,
- typename list_add_cref<A5>::type,
- typename list_add_cref<A6>::type,
- typename list_add_cref<A7>::type,
- typename list_add_cref<A8>::type,
- typename list_add_cref<A9>::type
- > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
-
+ rrlist9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > a( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
return l_( type<result_type>(), f_, a, 0 );
}
diff --git a/boost/bind/placeholders.hpp b/boost/bind/placeholders.hpp
index 3b098b14f8..b819ef4c46 100644
--- a/boost/bind/placeholders.hpp
+++ b/boost/bind/placeholders.hpp
@@ -11,10 +11,11 @@
// bind/placeholders.hpp - _N definitions
//
// Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+// Copyright 2015 Peter Dimov
//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
//
// See http://www.boost.org/libs/bind/bind.html for documentation.
//
@@ -22,48 +23,40 @@
#include <boost/bind/arg.hpp>
#include <boost/config.hpp>
-namespace
+namespace boost
{
-#if defined(__BORLANDC__) || defined(__GNUC__) && (__GNUC__ < 4)
-
-static inline boost::arg<1> _1() { return boost::arg<1>(); }
-static inline boost::arg<2> _2() { return boost::arg<2>(); }
-static inline boost::arg<3> _3() { return boost::arg<3>(); }
-static inline boost::arg<4> _4() { return boost::arg<4>(); }
-static inline boost::arg<5> _5() { return boost::arg<5>(); }
-static inline boost::arg<6> _6() { return boost::arg<6>(); }
-static inline boost::arg<7> _7() { return boost::arg<7>(); }
-static inline boost::arg<8> _8() { return boost::arg<8>(); }
-static inline boost::arg<9> _9() { return boost::arg<9>(); }
+namespace placeholders
+{
-#elif defined(BOOST_MSVC) || (defined(__DECCXX_VER) && __DECCXX_VER <= 60590031) || defined(__MWERKS__) || \
- defined(__GNUC__) && (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
+#if defined(__BORLANDC__) || defined(__GNUC__) && (__GNUC__ < 4)
-static boost::arg<1> _1;
-static boost::arg<2> _2;
-static boost::arg<3> _3;
-static boost::arg<4> _4;
-static boost::arg<5> _5;
-static boost::arg<6> _6;
-static boost::arg<7> _7;
-static boost::arg<8> _8;
-static boost::arg<9> _9;
+inline boost::arg<1> _1() { return boost::arg<1>(); }
+inline boost::arg<2> _2() { return boost::arg<2>(); }
+inline boost::arg<3> _3() { return boost::arg<3>(); }
+inline boost::arg<4> _4() { return boost::arg<4>(); }
+inline boost::arg<5> _5() { return boost::arg<5>(); }
+inline boost::arg<6> _6() { return boost::arg<6>(); }
+inline boost::arg<7> _7() { return boost::arg<7>(); }
+inline boost::arg<8> _8() { return boost::arg<8>(); }
+inline boost::arg<9> _9() { return boost::arg<9>(); }
#else
-boost::arg<1> _1;
-boost::arg<2> _2;
-boost::arg<3> _3;
-boost::arg<4> _4;
-boost::arg<5> _5;
-boost::arg<6> _6;
-boost::arg<7> _7;
-boost::arg<8> _8;
-boost::arg<9> _9;
+BOOST_STATIC_CONSTEXPR boost::arg<1> _1;
+BOOST_STATIC_CONSTEXPR boost::arg<2> _2;
+BOOST_STATIC_CONSTEXPR boost::arg<3> _3;
+BOOST_STATIC_CONSTEXPR boost::arg<4> _4;
+BOOST_STATIC_CONSTEXPR boost::arg<5> _5;
+BOOST_STATIC_CONSTEXPR boost::arg<6> _6;
+BOOST_STATIC_CONSTEXPR boost::arg<7> _7;
+BOOST_STATIC_CONSTEXPR boost::arg<8> _8;
+BOOST_STATIC_CONSTEXPR boost::arg<9> _9;
#endif
-} // unnamed namespace
+} // namespace placeholders
+
+} // namespace boost
#endif // #ifndef BOOST_BIND_PLACEHOLDERS_HPP_INCLUDED
diff --git a/boost/chrono/detail/inlined/mac/chrono.hpp b/boost/chrono/detail/inlined/mac/chrono.hpp
index bf20ae924b..5c32a8e176 100644
--- a/boost/chrono/detail/inlined/mac/chrono.hpp
+++ b/boost/chrono/detail/inlined/mac/chrono.hpp
@@ -39,7 +39,7 @@ system_clock::now(system::error_code & ec)
{
timeval tv;
gettimeofday(&tv, 0);
- if (!BOOST_CHRONO_IS_THROWS(ec))
+ if (!BOOST_CHRONO_IS_THROWS(ec))
{
ec.clear();
}
@@ -88,7 +88,7 @@ BOOST_CHRONO_STATIC
steady_clock::rep
steady_simplified_ec(system::error_code & ec)
{
- if (!BOOST_CHRONO_IS_THROWS(ec))
+ if (!BOOST_CHRONO_IS_THROWS(ec))
{
ec.clear();
}
@@ -112,9 +112,9 @@ BOOST_CHRONO_STATIC
steady_clock::rep
steady_full()
{
- static kern_return_t err;
- static const double factor = chrono_detail::compute_steady_factor(err);
- if (err != 0)
+ kern_return_t err;
+ const double factor = chrono_detail::compute_steady_factor(err);
+ if (err != 0)
{
BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
}
@@ -126,25 +126,25 @@ BOOST_CHRONO_STATIC
steady_clock::rep
steady_full_ec(system::error_code & ec)
{
- static kern_return_t err;
- static const double factor = chrono_detail::compute_steady_factor(err);
- if (err != 0)
+ kern_return_t err;
+ const double factor = chrono_detail::compute_steady_factor(err);
+ if (err != 0)
{
if (BOOST_CHRONO_IS_THROWS(ec))
{
boost::throw_exception(
- system::system_error(
- err,
- BOOST_CHRONO_SYSTEM_CATEGORY,
+ system::system_error(
+ err,
+ BOOST_CHRONO_SYSTEM_CATEGORY,
"chrono::steady_clock" ));
- }
+ }
else
{
ec.assign( errno, BOOST_CHRONO_SYSTEM_CATEGORY );
return steady_clock::rep();
}
}
- if (!BOOST_CHRONO_IS_THROWS(ec))
+ if (!BOOST_CHRONO_IS_THROWS(ec))
{
ec.clear();
}
@@ -163,7 +163,7 @@ init_steady_clock(kern_return_t & err)
{
mach_timebase_info_data_t MachInfo;
err = mach_timebase_info(&MachInfo);
- if ( err != 0 )
+ if ( err != 0 )
{
return 0;
}
@@ -182,12 +182,12 @@ init_steady_clock_ec(kern_return_t & err)
{
mach_timebase_info_data_t MachInfo;
err = mach_timebase_info(&MachInfo);
- if ( err != 0 )
+ if ( err != 0 )
{
return 0;
}
- if (MachInfo.numer == MachInfo.denom)
+ if (MachInfo.numer == MachInfo.denom)
{
return &chrono_detail::steady_simplified_ec;
}
@@ -199,10 +199,10 @@ init_steady_clock_ec(kern_return_t & err)
steady_clock::time_point
steady_clock::now() BOOST_NOEXCEPT
{
- static kern_return_t err;
- static chrono_detail::FP fp = chrono_detail::init_steady_clock(err);
- if ( err != 0 )
- {
+ kern_return_t err;
+ chrono_detail::FP fp = chrono_detail::init_steady_clock(err);
+ if ( err != 0 )
+ {
BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
}
return time_point(duration(fp()));
@@ -212,16 +212,16 @@ steady_clock::now() BOOST_NOEXCEPT
steady_clock::time_point
steady_clock::now(system::error_code & ec)
{
- static kern_return_t err;
- static chrono_detail::FP_ec fp = chrono_detail::init_steady_clock_ec(err);
- if ( err != 0 )
+ kern_return_t err;
+ chrono_detail::FP_ec fp = chrono_detail::init_steady_clock_ec(err);
+ if ( err != 0 )
{
if (BOOST_CHRONO_IS_THROWS(ec))
{
boost::throw_exception(
- system::system_error(
- err,
- BOOST_CHRONO_SYSTEM_CATEGORY,
+ system::system_error(
+ err,
+ BOOST_CHRONO_SYSTEM_CATEGORY,
"chrono::steady_clock" ));
}
else
@@ -230,7 +230,7 @@ steady_clock::now(system::error_code & ec)
return time_point();
}
}
- if (!BOOST_CHRONO_IS_THROWS(ec))
+ if (!BOOST_CHRONO_IS_THROWS(ec))
{
ec.clear();
}
diff --git a/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp b/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp
index 6d09e2cb3a..6e55b0f2ff 100644
--- a/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp
+++ b/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp
@@ -28,7 +28,7 @@ namespace boost
inline long tick_factor() // multiplier to convert ticks
// to nanoseconds; -1 if unknown
{
- static long factor = 0;
+ long factor = 0;
if (!factor)
{
if ((factor = ::sysconf(_SC_CLK_TCK)) <= 0)
diff --git a/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp b/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp
index 0476f590c9..feecc86792 100644
--- a/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp
+++ b/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp
@@ -25,7 +25,7 @@ namespace chrono_detail
inline nanoseconds::rep tick_factor() // multiplier to convert ticks
// to nanoseconds; -1 if unknown
{
- static long factor = 0;
+ long factor = 0;
if ( !factor )
{
if ( (factor = ::sysconf( _SC_CLK_TCK )) <= 0 )
diff --git a/boost/chrono/duration.hpp b/boost/chrono/duration.hpp
index a2110bf411..ac4cfb425b 100644
--- a/boost/chrono/duration.hpp
+++ b/boost/chrono/duration.hpp
@@ -433,7 +433,8 @@ namespace chrono {
rep rep_;
public:
-#if defined BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
+#if defined BOOST_NO_CXX11_DEFAULTED_FUNCTIONS || \
+ defined BOOST_CHRONO_DURATION_DEFAULTS_TO_ZERO
BOOST_FORCEINLINE BOOST_CONSTEXPR
duration() : rep_(duration_values<rep>::zero()) { }
#else
diff --git a/boost/chrono/io/time_point_units.hpp b/boost/chrono/io/time_point_units.hpp
index 378c112603..7aef8526da 100644
--- a/boost/chrono/io/time_point_units.hpp
+++ b/boost/chrono/io/time_point_units.hpp
@@ -24,6 +24,16 @@ namespace boost
{
namespace chrono
{
+ /**
+ * customization point to the epoch associated to the clock @c Clock
+ * The default calls @c f.do_get_epoch(Clock()). The user can overload this function.
+ * @return the string epoch associated to the @c Clock
+ */
+ template <typename CharT, typename Clock, typename TPUFacet>
+ std::basic_string<CharT> get_epoch_custom(Clock, TPUFacet& f)
+ {
+ return f.do_get_epoch(Clock());
+ }
/**
* @c time_point_units facet gives useful information about the time_point pattern,
@@ -74,7 +84,7 @@ namespace boost
template <typename Clock>
string_type get_epoch() const
{
- return do_get_epoch(Clock());
+ return get_epoch_custom<CharT>(Clock(), *this);
}
protected:
@@ -83,6 +93,7 @@ namespace boost
*/
virtual ~time_point_units() {}
+ public:
/**
*
@@ -173,7 +184,7 @@ namespace boost
return pattern;
}
- protected:
+ //protected:
/**
* @param c a dummy instance of @c system_clock.
* @return The epoch string returned by @c clock_string<system_clock,CharT>::since().
diff --git a/boost/concept_check.hpp b/boost/concept_check.hpp
index 2d6fa32332..25f118b643 100644
--- a/boost/concept_check.hpp
+++ b/boost/concept_check.hpp
@@ -19,7 +19,7 @@
# include <boost/concept/assert.hpp>
-# include <boost/iterator.hpp>
+# include <iterator>
# include <boost/type_traits/conversion_traits.hpp>
# include <utility>
# include <boost/type_traits/is_same.hpp>
@@ -27,7 +27,6 @@
# include <boost/mpl/assert.hpp>
# include <boost/mpl/bool.hpp>
# include <boost/detail/workaround.hpp>
-# include <boost/detail/iterator.hpp>
# include <boost/concept/usage.hpp>
# include <boost/concept/detail/concept_def.hpp>
@@ -504,11 +503,11 @@ namespace boost
: Assignable<TT>
, EqualityComparable<TT>
{
- typedef typename boost::detail::iterator_traits<TT>::value_type value_type;
- typedef typename boost::detail::iterator_traits<TT>::difference_type difference_type;
- typedef typename boost::detail::iterator_traits<TT>::reference reference;
- typedef typename boost::detail::iterator_traits<TT>::pointer pointer;
- typedef typename boost::detail::iterator_traits<TT>::iterator_category iterator_category;
+ typedef typename std::iterator_traits<TT>::value_type value_type;
+ typedef typename std::iterator_traits<TT>::difference_type difference_type;
+ typedef typename std::iterator_traits<TT>::reference reference;
+ typedef typename std::iterator_traits<TT>::pointer pointer;
+ typedef typename std::iterator_traits<TT>::iterator_category iterator_category;
BOOST_CONCEPT_USAGE(InputIterator)
{
@@ -617,7 +616,7 @@ namespace boost
private:
TT a, b;
TT i, j;
- typename boost::detail::iterator_traits<TT>::difference_type n;
+ typename std::iterator_traits<TT>::difference_type n;
};
BOOST_concept(Mutable_RandomAccessIterator,(TT))
@@ -630,7 +629,7 @@ namespace boost
}
private:
TT i;
- typename boost::detail::iterator_traits<TT>::difference_type n;
+ typename std::iterator_traits<TT>::difference_type n;
};
//===========================================================================
diff --git a/boost/config/compiler/clang.hpp b/boost/config/compiler/clang.hpp
index 47ea65b0a2..5481e5ee62 100644
--- a/boost/config/compiler/clang.hpp
+++ b/boost/config/compiler/clang.hpp
@@ -23,6 +23,10 @@
#define __has_extension __has_feature
#endif
+#ifndef __has_attribute
+#define __has_attribute(x) 0
+#endif
+
#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)
# define BOOST_NO_EXCEPTIONS
#endif
@@ -58,9 +62,11 @@
// even though it defines __SIZEOF_INT128__.
// See https://svn.boost.org/trac/boost/ticket/10418
// Only re-enable this for nvcc if you're absolutely sure
-// of the circumstances under which it's supported:
+// of the circumstances under which it's supported.
+// Similarly __SIZEOF_INT128__ is defined when targetting msvc
+// compatibility even though the required support functions are absent.
//
-#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__)
+#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__) && !defined(_MSC_VER)
# define BOOST_HAS_INT128
#endif
@@ -255,13 +261,15 @@
// All versions with __cplusplus above this value seem to support this:
# define BOOST_NO_CXX14_DIGIT_SEPARATORS
#endif
-
-
-// Unused attribute:
-#if defined(__GNUC__) && (__GNUC__ >= 4)
-# define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))
+//
+// __builtin_unreachable:
+#if defined(__has_builtin) && __has_builtin(__builtin_unreachable)
+#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();
#endif
+// Clang has supported the 'unused' attribute since the first release.
+#define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))
+
#ifndef BOOST_COMPILER
# define BOOST_COMPILER "Clang version " __clang_version__
#endif
diff --git a/boost/config/compiler/gcc.hpp b/boost/config/compiler/gcc.hpp
index 41705df039..d9dd59dc5f 100644
--- a/boost/config/compiler/gcc.hpp
+++ b/boost/config/compiler/gcc.hpp
@@ -143,6 +143,19 @@
#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__)
# define BOOST_HAS_INT128
#endif
+//
+// Recent GCC versions have a __float128 native type, we need to
+// include a std lib header to detect this - not ideal, but we'll
+// be including <cstddef> later anyway when we select the std lib.
+//
+#ifdef __cplusplus
+#include <cstddef>
+#else
+#include <stddef.h>
+#endif
+#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__)
+# define BOOST_HAS_FLOAT128
+#endif
// C++0x features in 4.3.n and later
//
@@ -263,7 +276,12 @@
//
// Unused attribute:
#if __GNUC__ >= 4
-# define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))
+# define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))
+#endif
+//
+// __builtin_unreachable:
+#if BOOST_GCC_VERSION >= 40800
+#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();
#endif
#ifndef BOOST_COMPILER
diff --git a/boost/config/compiler/intel.hpp b/boost/config/compiler/intel.hpp
index ecfacc5e70..7789b94464 100644
--- a/boost/config/compiler/intel.hpp
+++ b/boost/config/compiler/intel.hpp
@@ -20,6 +20,9 @@
#include <boost/config/compiler/visualc.hpp>
+#undef BOOST_MSVC
+#undef BOOST_MSVC_FULL_VER
+
#if (__INTEL_COMPILER >= 1500) && (_MSC_VER >= 1900)
//
// These appear to be supported, even though VC++ may not support them:
@@ -36,6 +39,9 @@
#include <boost/config/compiler/gcc.hpp>
+#undef BOOST_GCC_VERSION
+#undef BOOST_GCC_CXX11
+
#endif
#undef BOOST_COMPILER
diff --git a/boost/config/compiler/sunpro_cc.hpp b/boost/config/compiler/sunpro_cc.hpp
index 2fd6d3ece0..6017660cbb 100644
--- a/boost/config/compiler/sunpro_cc.hpp
+++ b/boost/config/compiler/sunpro_cc.hpp
@@ -125,19 +125,15 @@
#define BOOST_NO_CXX11_FINAL
#endif
-//
-// Issues that effect all known versions:
-//
-// Variadic templates pass our test case, but enabling this
-// causes the compiler to issue a signal 11 and bail out
-// in various libraries. The others fail our test cases.
-//
+#if (__SUNPRO_CC < 0x5140) || (__cplusplus < 201103)
#define BOOST_NO_CXX11_VARIADIC_TEMPLATES
#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX
#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS
#define BOOST_NO_CXX11_DECLTYPE_N3276
#define BOOST_NO_CXX11_USER_DEFINED_LITERALS
#define BOOST_NO_CXX11_REF_QUALIFIERS
+#endif
+
#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION
//
// C++0x features
diff --git a/boost/config/compiler/visualc.hpp b/boost/config/compiler/visualc.hpp
index 93908cea50..baaab589ef 100644
--- a/boost/config/compiler/visualc.hpp
+++ b/boost/config/compiler/visualc.hpp
@@ -55,6 +55,7 @@
# define BOOST_NO_CXX11_EXTERN_TEMPLATE
// Variadic macros do not exist for VC7.1 and lower
# define BOOST_NO_CXX11_VARIADIC_MACROS
+# define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS
#endif
#if _MSC_VER < 1500 // 140X == VC++ 8.0
diff --git a/boost/config/platform/cloudabi.hpp b/boost/config/platform/cloudabi.hpp
new file mode 100644
index 0000000000..bed7b6318d
--- /dev/null
+++ b/boost/config/platform/cloudabi.hpp
@@ -0,0 +1,18 @@
+// Copyright Nuxi, https://nuxi.nl/ 2015.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#define BOOST_PLATFORM "CloudABI"
+
+#define BOOST_HAS_DIRENT_H
+#define BOOST_HAS_STDINT_H
+#define BOOST_HAS_UNISTD_H
+
+#define BOOST_HAS_CLOCK_GETTIME
+#define BOOST_HAS_EXPM1
+#define BOOST_HAS_GETTIMEOFDAY
+#define BOOST_HAS_LOG1P
+#define BOOST_HAS_NANOSLEEP
+#define BOOST_HAS_PTHREADS
+#define BOOST_HAS_SCHED_YIELD
diff --git a/boost/config/platform/macos.hpp b/boost/config/platform/macos.hpp
index 6d876b12db..5be4e3b3da 100644
--- a/boost/config/platform/macos.hpp
+++ b/boost/config/platform/macos.hpp
@@ -47,7 +47,7 @@
# define BOOST_NO_STDC_NAMESPACE
# endif
-# if (__GNUC__ == 4)
+# if (__GNUC__ >= 4)
// Both gcc and intel require these.
# define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE
diff --git a/boost/config/platform/win32.hpp b/boost/config/platform/win32.hpp
index 60a29abe83..450158fbaa 100644
--- a/boost/config/platform/win32.hpp
+++ b/boost/config/platform/win32.hpp
@@ -74,6 +74,14 @@
# define BOOST_HAS_GETSYSTEMTIMEASFILETIME
#endif
+//
+// Windows Runtime
+//
+#if defined(WINAPI_FAMILY) && \
+ (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
+# define BOOST_NO_ANSI_APIS
+#endif
+
#ifndef BOOST_DISABLE_WIN32
// WEK: Added
#define BOOST_HAS_FTIME
diff --git a/boost/config/select_platform_config.hpp b/boost/config/select_platform_config.hpp
index acd1409ebc..62fd818b93 100644
--- a/boost/config/select_platform_config.hpp
+++ b/boost/config/select_platform_config.hpp
@@ -80,6 +80,10 @@
#elif defined(__VMS)
// VMS:
# define BOOST_PLATFORM_CONFIG "boost/config/platform/vms.hpp"
+
+#elif defined(__CloudABI__)
+// Nuxi CloudABI:
+# define BOOST_PLATFORM_CONFIG "boost/config/platform/cloudabi.hpp"
#else
# if defined(unix) \
diff --git a/boost/config/stdlib/dinkumware.hpp b/boost/config/stdlib/dinkumware.hpp
index 90c45c6c23..af8ddda528 100644
--- a/boost/config/stdlib/dinkumware.hpp
+++ b/boost/config/stdlib/dinkumware.hpp
@@ -172,10 +172,19 @@
// Bug specific to VC14,
// See https://connect.microsoft.com/VisualStudio/feedback/details/1348277/link-error-when-using-std-codecvt-utf8-utf16-char16-t
// and discussion here: http://blogs.msdn.com/b/vcblog/archive/2014/11/12/visual-studio-2015-preview-now-available.aspx?PageIndex=2
-#if _CPPLIB_VER == 650
+#if defined(_CPPLIB_VER) && (_CPPLIB_VER == 650)
# define BOOST_NO_CXX11_HDR_CODECVT
#endif
+#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 650)
+// If _HAS_AUTO_PTR_ETC is defined to 0, std::auto_ptr is not available.
+// See https://www.visualstudio.com/en-us/news/vs2015-vs.aspx#C++
+// and http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx
+# if defined(_HAS_AUTO_PTR_ETC) && (_HAS_AUTO_PTR_ETC == 0)
+# define BOOST_NO_AUTO_PTR
+# endif
+#endif
+
#ifdef _CPPLIB_VER
# define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER
#else
diff --git a/boost/config/stdlib/libstdcpp3.hpp b/boost/config/stdlib/libstdcpp3.hpp
index 7d27b0cc0c..9718bedcf2 100644
--- a/boost/config/stdlib/libstdcpp3.hpp
+++ b/boost/config/stdlib/libstdcpp3.hpp
@@ -251,6 +251,10 @@
#define BOOST_NO_CXX11_HDR_FUTURE
#define BOOST_NO_CXX11_HDR_FORWARD_LIST
#define BOOST_NO_CXX11_HDR_ATOMIC
+// shared_ptr is present, but is not convertible to bool
+// which causes all kinds of problems especially in Boost.Thread
+// but probably elsewhere as well.
+#define BOOST_NO_CXX11_SMART_PTR
#endif
#if (!defined(_GLIBCXX_HAS_GTHREADS) || !defined(_GLIBCXX_USE_C99_STDINT_TR1))
diff --git a/boost/config/suffix.hpp b/boost/config/suffix.hpp
index c0ba333918..17bf1020f5 100644
--- a/boost/config/suffix.hpp
+++ b/boost/config/suffix.hpp
@@ -444,10 +444,12 @@ namespace std {
// is defined, in which case it evaluates to return x; Use when you have a return
// statement that can never be reached.
-#ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION
-# define BOOST_UNREACHABLE_RETURN(x) return x;
-#else
-# define BOOST_UNREACHABLE_RETURN(x)
+#ifndef BOOST_UNREACHABLE_RETURN
+# ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION
+# define BOOST_UNREACHABLE_RETURN(x) return x;
+# else
+# define BOOST_UNREACHABLE_RETURN(x)
+# endif
#endif
// BOOST_DEDUCED_TYPENAME workaround ------------------------------------------//
@@ -501,6 +503,16 @@ namespace boost{
# endif
}
#endif
+// same again for __float128:
+#if defined(BOOST_HAS_FLOAT128) && defined(__cplusplus)
+namespace boost {
+# ifdef __GNUC__
+ __extension__ typedef __float128 float128_type;
+# else
+ typedef __float128 float128_type;
+# endif
+}
+#endif
// BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------//
diff --git a/boost/container/adaptive_pool.hpp b/boost/container/adaptive_pool.hpp
index 59ba37bc93..ac3d86709e 100644
--- a/boost/container/adaptive_pool.hpp
+++ b/boost/container/adaptive_pool.hpp
@@ -27,7 +27,7 @@
#include <boost/container/detail/adaptive_node_pool.hpp>
#include <boost/container/detail/multiallocation_chain.hpp>
#include <boost/container/detail/mpl.hpp>
-#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/dlmalloc.hpp>
#include <boost/container/detail/singleton.hpp>
#include <boost/container/detail/placement_new.hpp>
@@ -164,7 +164,7 @@ class adaptive_pool
return pointer(static_cast<T*>(singleton_t::instance().allocate_node()));
}
else{
- return static_cast<pointer>(boost_cont_malloc(count*sizeof(T)));
+ return static_cast<pointer>(dlmalloc_malloc(count*sizeof(T)));
}
}
@@ -180,7 +180,7 @@ class adaptive_pool
singleton_t::instance().deallocate_node(ptr);
}
else{
- boost_cont_free(ptr);
+ dlmalloc_free(ptr);
}
}
@@ -198,7 +198,7 @@ class adaptive_pool
//!Returns maximum the number of objects the previously allocated memory
//!pointed by p can hold.
size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
- { return boost_cont_size(p); }
+ { return dlmalloc_size(p); }
//!Allocates just one object. Memory allocated with this function
//!must be deallocated only with deallocate_one().
@@ -251,17 +251,17 @@ class adaptive_pool
void allocate_many(size_type elem_size, std::size_t n_elements, multiallocation_chain &chain)
{
BOOST_STATIC_ASSERT(( Version > 1 ));/*
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
- if(BOOST_UNLIKELY(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
+ if(BOOST_UNLIKELY(!dlmalloc_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
boost::container::throw_bad_alloc();
}
chain.incorporate_after(chain.before_begin()
,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );*/
- if(BOOST_UNLIKELY(!boost_cont_multialloc_nodes
- (n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain)))){
+ if(BOOST_UNLIKELY(!dlmalloc_multialloc_nodes
+ (n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<dlmalloc_memchain *>(&chain)))){
boost::container::throw_bad_alloc();
}
}
@@ -271,29 +271,29 @@ class adaptive_pool
void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain)
{
BOOST_STATIC_ASSERT(( Version > 1 ));/*
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
- if(BOOST_UNLIKELY(!boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
+ if(BOOST_UNLIKELY(!dlmalloc_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
boost::container::throw_bad_alloc();
}
chain.incorporate_after(chain.before_begin()
,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );*/
- if(BOOST_UNLIKELY(!boost_cont_multialloc_arrays
- (n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain)))){
+ if(BOOST_UNLIKELY(!dlmalloc_multialloc_arrays
+ (n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<dlmalloc_memchain *>(&chain)))){
boost::container::throw_bad_alloc();
}
}
void deallocate_many(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
{/*
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
void *beg(&*chain.begin()), *last(&*chain.last());
size_t size(chain.size());
BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&ch, beg, last, size);
- boost_cont_multidealloc(&ch);*/
- boost_cont_multidealloc(reinterpret_cast<boost_cont_memchain *>(&chain));
+ dlmalloc_multidealloc(&ch);*/
+ dlmalloc_multidealloc(reinterpret_cast<dlmalloc_memchain *>(&chain));
}
//!Deallocates all free blocks of the pool
@@ -326,7 +326,7 @@ class adaptive_pool
,size_type &prefer_in_recvd_out_size, pointer &reuse_ptr)
{
std::size_t const preferred_size = prefer_in_recvd_out_size;
- boost_cont_command_ret_t ret = {0 , 0};
+ dlmalloc_command_ret_t ret = {0 , 0};
if(BOOST_UNLIKELY(limit_size > this->max_size() || preferred_size > this->max_size())){
return pointer();
}
@@ -335,7 +335,7 @@ class adaptive_pool
std::size_t r_size;
{
void* reuse_ptr_void = reuse_ptr;
- ret = boost_cont_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
+ ret = dlmalloc_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
reuse_ptr = ret.second ? static_cast<T*>(reuse_ptr_void) : 0;
}
prefer_in_recvd_out_size = r_size/sizeof(T);
diff --git a/boost/container/allocator.hpp b/boost/container/allocator.hpp
index 9f757c73e8..2fb44b73d3 100644
--- a/boost/container/allocator.hpp
+++ b/boost/container/allocator.hpp
@@ -24,12 +24,14 @@
#include <boost/container/container_fwd.hpp>
#include <boost/container/detail/version_type.hpp>
#include <boost/container/throw_exception.hpp>
-#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/dlmalloc.hpp>
#include <boost/container/detail/multiallocation_chain.hpp>
#include <boost/static_assert.hpp>
#include <cstddef>
#include <cassert>
+//!\file
+
namespace boost {
namespace container {
@@ -86,21 +88,18 @@ class allocator<void, Version, AllocationDisableMask>
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
-//!\file
//! This class is an extended STL-compatible that offers advanced allocation mechanism
//!(in-place expansion, shrinking, burst-allocation...)
//!
//! This allocator is a wrapper around a modified DLmalloc.
-#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
-template<class T>
-#else
//! If Version is 1, the allocator is a STL conforming allocator. If Version is 2,
//! the allocator offers advanced expand in place and burst allocation capabilities.
-//
+//!
//! AllocationDisableMask works only if Version is 2 and it can be an inclusive OR
//! of allocation types the user wants to disable.
-template<class T, unsigned Version, unsigned int AllocationDisableMask>
-#endif //#ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+template< class T
+ , unsigned Version BOOST_CONTAINER_DOCONLY(=2)
+ , unsigned int AllocationDisableMask BOOST_CONTAINER_DOCONLY(=0)>
class allocator
{
typedef unsigned int allocation_type;
@@ -186,7 +185,7 @@ class allocator
(void)hint;
if(count > this->max_size())
boost::container::throw_bad_alloc();
- void *ret = boost_cont_malloc(count*sizeof(T));
+ void *ret = dlmalloc_malloc(count*sizeof(T));
if(!ret)
boost::container::throw_bad_alloc();
return static_cast<pointer>(ret);
@@ -195,7 +194,7 @@ class allocator
//!Deallocates previously allocated memory.
//!Never throws
void deallocate(pointer ptr, size_type) BOOST_NOEXCEPT_OR_NOTHROW
- { boost_cont_free(ptr); }
+ { dlmalloc_free(ptr); }
//!Returns the maximum number of elements that could be allocated.
//!Never throws
@@ -243,7 +242,7 @@ class allocator
size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
{
BOOST_STATIC_ASSERT(( Version > 1 ));
- return boost_cont_size(p);
+ return dlmalloc_size(p);
}
//!Allocates just one object. Memory allocated with this function
@@ -289,16 +288,16 @@ class allocator
void allocate_many(size_type elem_size, std::size_t n_elements, multiallocation_chain &chain)
{
BOOST_STATIC_ASSERT(( Version > 1 ));/*
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
- if(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch)){
+ if(!dlmalloc_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch)){
boost::container::throw_bad_alloc();
}
chain.incorporate_after(chain.before_begin()
,(T*)BOOST_CONTAINER_MEMCHAIN_FIRSTMEM(&ch)
,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );*/
- if(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain))){
+ if(!dlmalloc_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<dlmalloc_memchain *>(&chain))){
boost::container::throw_bad_alloc();
}
}
@@ -309,9 +308,9 @@ class allocator
void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain)
{
BOOST_STATIC_ASSERT(( Version > 1 ));
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
- if(!boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch)){
+ if(!dlmalloc_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch)){
boost::container::throw_bad_alloc();
}
chain.incorporate_after(chain.before_begin()
@@ -319,7 +318,7 @@ class allocator
,(T*)BOOST_CONTAINER_MEMCHAIN_LASTMEM(&ch)
,BOOST_CONTAINER_MEMCHAIN_SIZE(&ch) );
/*
- if(!boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<boost_cont_memchain *>(&chain))){
+ if(!dlmalloc_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, reinterpret_cast<dlmalloc_memchain *>(&chain))){
boost::container::throw_bad_alloc();
}*/
}
@@ -330,12 +329,12 @@ class allocator
void deallocate_many(multiallocation_chain &chain) BOOST_NOEXCEPT_OR_NOTHROW
{
BOOST_STATIC_ASSERT(( Version > 1 ));
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
void *beg(&*chain.begin()), *last(&*chain.last());
size_t size(chain.size());
BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&ch, beg, last, size);
- boost_cont_multidealloc(&ch);
- //boost_cont_multidealloc(reinterpret_cast<boost_cont_memchain *>(&chain));
+ dlmalloc_multidealloc(&ch);
+ //dlmalloc_multidealloc(reinterpret_cast<dlmalloc_memchain *>(&chain));
}
private:
@@ -346,7 +345,7 @@ class allocator
,pointer &reuse_ptr)
{
std::size_t const preferred_size = prefer_in_recvd_out_size;
- boost_cont_command_ret_t ret = {0 , 0};
+ dlmalloc_command_ret_t ret = {0 , 0};
if((limit_size > this->max_size()) | (preferred_size > this->max_size())){
return pointer();
}
@@ -355,7 +354,7 @@ class allocator
std::size_t r_size;
{
void* reuse_ptr_void = reuse_ptr;
- ret = boost_cont_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
+ ret = dlmalloc_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
reuse_ptr = ret.second ? static_cast<T*>(reuse_ptr_void) : 0;
}
prefer_in_recvd_out_size = r_size/sizeof(T);
diff --git a/boost/container/allocator_traits.hpp b/boost/container/allocator_traits.hpp
index 2c7900ea72..b515af6180 100644
--- a/boost/container/allocator_traits.hpp
+++ b/boost/container/allocator_traits.hpp
@@ -445,7 +445,7 @@ struct allocator_traits
template<class T>
static void priv_construct(container_detail::false_type, Allocator &, T *p, const ::boost::container::default_init_t&)
- { ::new((void*)p) T; }
+ { ::new((void*)p, boost_container_new_t()) T; }
static bool priv_storage_is_unpropagable(container_detail::true_type, const Allocator &a, pointer p)
{ return a.storage_is_unpropagable(p); }
diff --git a/boost/container/container_fwd.hpp b/boost/container/container_fwd.hpp
index a9b421c2b2..e85a6ce952 100644
--- a/boost/container/container_fwd.hpp
+++ b/boost/container/container_fwd.hpp
@@ -24,6 +24,7 @@
//! - boost::container::vector
//! - boost::container::stable_vector
//! - boost::container::static_vector
+//! - boost::container::small_vector
//! - boost::container::slist
//! - boost::container::list
//! - boost::container::set
@@ -38,11 +39,19 @@
//! - boost::container::string
//! - boost::container::wstring
//!
-//! It forward declares the following allocators:
+//! Forward declares the following allocators:
//! - boost::container::allocator
//! - boost::container::node_allocator
//! - boost::container::adaptive_pool
//!
+//! Forward declares the following polymorphic resource classes:
+//! - boost::container::pmr::memory_resource
+//! - boost::container::pmr::polymorphic_allocator
+//! - boost::container::pmr::monotonic_buffer_resource
+//! - boost::container::pmr::pool_options
+//! - boost::container::pmr::unsynchronized_pool_resource
+//! - boost::container::pmr::synchronized_pool_resource
+//!
//! And finally it defines the following types
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
@@ -54,11 +63,18 @@
namespace boost{
namespace intrusive{
+namespace detail{
//Create namespace to avoid compilation errors
-}}
+}}}
namespace boost{ namespace container{ namespace container_detail{
namespace bi = boost::intrusive;
+ namespace bid = boost::intrusive::detail;
+}}}
+
+namespace boost{ namespace container{ namespace pmr{
+ namespace bi = boost::intrusive;
+ namespace bid = boost::intrusive::detail;
}}}
#include <cstddef>
@@ -210,6 +226,26 @@ template
, std::size_t Version = 2>
class node_allocator;
+namespace pmr {
+
+class memory_resource;
+
+template<class T>
+class polymorphic_allocator;
+
+class monotonic_buffer_resource;
+
+struct pool_options;
+
+template <class Allocator>
+class resource_adaptor_imp;
+
+class unsynchronized_pool_resource;
+
+class synchronized_pool_resource;
+
+} //namespace pmr {
+
#else
//! Default options for tree-based associative containers
diff --git a/boost/container/deque.hpp b/boost/container/deque.hpp
index bdfecc1212..f53f34ae98 100644
--- a/boost/container/deque.hpp
+++ b/boost/container/deque.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -1140,7 +1140,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
reference front() BOOST_NOEXCEPT_OR_NOTHROW
- { return *this->members_.m_start; }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->members_.m_start;
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1151,7 +1154,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
const_reference front() const BOOST_NOEXCEPT_OR_NOTHROW
- { return *this->members_.m_start; }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->members_.m_start;
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1162,7 +1168,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
reference back() BOOST_NOEXCEPT_OR_NOTHROW
- { return *(end()-1); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *(end()-1);
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1173,7 +1182,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
const_reference back() const BOOST_NOEXCEPT_OR_NOTHROW
- { return *(cend()-1); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *(cend()-1);
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1184,7 +1196,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
reference operator[](size_type n) BOOST_NOEXCEPT_OR_NOTHROW
- { return this->members_.m_start[difference_type(n)]; }
+ {
+ BOOST_ASSERT(this->size() > n);
+ return this->members_.m_start[difference_type(n)];
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1195,7 +1210,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
const_reference operator[](size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
- { return this->members_.m_start[difference_type(n)]; }
+ {
+ BOOST_ASSERT(this->size() > n);
+ return this->members_.m_start[difference_type(n)];
+ }
//! <b>Requires</b>: size() >= n.
//!
@@ -1243,7 +1261,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Note</b>: Non-standard extension
size_type index_of(iterator p) BOOST_NOEXCEPT_OR_NOTHROW
- { return this->priv_index_of(p); }
+ {
+ //Range checked priv_index_of
+ return this->priv_index_of(p);
+ }
//! <b>Requires</b>: begin() <= p <= end().
//!
@@ -1256,7 +1277,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Note</b>: Non-standard extension
size_type index_of(const_iterator p) const BOOST_NOEXCEPT_OR_NOTHROW
- { return this->priv_index_of(p); }
+ {
+ //Range checked priv_index_of
+ return this->priv_index_of(p);
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1267,7 +1291,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
reference at(size_type n)
- { this->priv_range_check(n); return (*this)[n]; }
+ {
+ this->priv_throw_if_out_of_range(n);
+ return (*this)[n];
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1278,7 +1305,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Constant.
const_reference at(size_type n) const
- { this->priv_range_check(n); return (*this)[n]; }
+ {
+ this->priv_throw_if_out_of_range(n);
+ return (*this)[n];
+ }
//////////////////////////////////////////////
//
@@ -1344,6 +1374,7 @@ class deque : protected deque_base<Allocator>
template <class... Args>
iterator emplace(const_iterator p, BOOST_FWD_REF(Args)... args)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
if(p == this->cbegin()){
this->emplace_front(boost::forward<Args>(args)...);
return this->begin();
@@ -1394,6 +1425,7 @@ class deque : protected deque_base<Allocator>
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N\
iterator emplace(const_iterator p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
{\
+ BOOST_ASSERT(this->priv_in_range_or_end(p));\
if(p == this->cbegin()){\
this->emplace_front(BOOST_MOVE_FWD##N);\
return this->begin();\
@@ -1494,6 +1526,7 @@ class deque : protected deque_base<Allocator>
//! <b>Complexity</b>: Linear to n.
iterator insert(const_iterator pos, size_type n, const value_type& x)
{
+ //Range check of p is done by insert()
typedef constant_iterator<value_type, difference_type> c_it;
return this->insert(pos, c_it(x, n), c_it());
}
@@ -1519,6 +1552,7 @@ class deque : protected deque_base<Allocator>
#endif
)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(pos));
size_type n = 0;
iterator it(pos.unconst());
for(;first != last; ++first, ++n){
@@ -1541,7 +1575,10 @@ class deque : protected deque_base<Allocator>
//!
//! <b>Complexity</b>: Linear to distance [il.begin(), il.end()).
iterator insert(const_iterator pos, std::initializer_list<value_type> il)
- { return insert(pos, il.begin(), il.end()); }
+ {
+ //Range check os pos is done in insert()
+ return insert(pos, il.begin(), il.end());
+ }
#endif
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
@@ -1556,6 +1593,7 @@ class deque : protected deque_base<Allocator>
#endif
)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
container_detail::insert_range_proxy<Allocator, FwdIt, iterator> proxy(first);
return priv_insert_aux_impl(p, boost::container::iterator_distance(first, last), proxy);
}
@@ -1568,6 +1606,7 @@ class deque : protected deque_base<Allocator>
//! <b>Complexity</b>: Constant time.
void pop_front() BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(!this->empty());
if (this->members_.m_start.m_cur != this->members_.m_start.m_last - 1) {
allocator_traits_type::destroy
( this->alloc()
@@ -1586,6 +1625,7 @@ class deque : protected deque_base<Allocator>
//! <b>Complexity</b>: Constant time.
void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(!this->empty());
if (this->members_.m_finish.m_cur != this->members_.m_finish.m_first) {
--this->members_.m_finish.m_cur;
allocator_traits_type::destroy
@@ -1607,6 +1647,7 @@ class deque : protected deque_base<Allocator>
//! Constant if pos is the first or the last element.
iterator erase(const_iterator pos) BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(this->priv_in_range(pos));
iterator next = pos.unconst();
++next;
size_type index = pos - this->members_.m_start;
@@ -1631,6 +1672,8 @@ class deque : protected deque_base<Allocator>
//! if(pos is near the beginning).
iterator erase(const_iterator first, const_iterator last) BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(first == last ||
+ (first < last && this->priv_in_range(first) && this->priv_in_range_or_end(last)));
if (first == this->members_.m_start && last == this->members_.m_finish) {
this->clear();
return this->members_.m_finish;
@@ -1764,12 +1807,26 @@ class deque : protected deque_base<Allocator>
}
}
- void priv_range_check(size_type n) const
- { if (n >= this->size()) throw_out_of_range("deque::at out of range"); }
+ void priv_throw_if_out_of_range(size_type n) const
+ {
+ if (n >= this->size())
+ throw_out_of_range("deque::at out of range");
+ }
+
+ bool priv_in_range(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos < this->end());
+ }
+
+ bool priv_in_range_or_end(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos <= this->end());
+ }
template <class U>
iterator priv_insert(const_iterator p, BOOST_FWD_REF(U) x)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
if (p == cbegin()){
this->push_front(::boost::forward<U>(x));
return begin();
@@ -1994,8 +2051,7 @@ class deque : protected deque_base<Allocator>
}
template <class InIt>
- typename iterator_enable_if_tag<InIt, std::input_iterator_tag>::type
- priv_range_initialize(InIt first, InIt last)
+ void priv_range_initialize(InIt first, InIt last, typename iterator_enable_if_tag<InIt, std::input_iterator_tag>::type* =0)
{
this->priv_initialize_map(0);
BOOST_TRY {
@@ -2010,8 +2066,7 @@ class deque : protected deque_base<Allocator>
}
template <class FwdIt>
- typename iterator_disable_if_tag<FwdIt, std::input_iterator_tag>::type
- priv_range_initialize(FwdIt first, FwdIt last)
+ void priv_range_initialize(FwdIt first, FwdIt last, typename iterator_disable_if_tag<FwdIt, std::input_iterator_tag>::type* =0)
{
size_type n = 0;
n = boost::container::iterator_distance(first, last);
diff --git a/boost/container/detail/adaptive_node_pool.hpp b/boost/container/detail/adaptive_node_pool.hpp
index 4a1f07c4a8..20696100f5 100644
--- a/boost/container/detail/adaptive_node_pool.hpp
+++ b/boost/container/detail/adaptive_node_pool.hpp
@@ -23,7 +23,6 @@
#include <boost/container/detail/workaround.hpp>
#include <boost/intrusive/set.hpp>
-#include <boost/container/detail/alloc_lib_auto_link.hpp>
#include <boost/container/detail/multiallocation_chain.hpp>
#include <boost/container/detail/pool_common_alloc.hpp>
#include <boost/container/detail/mutex.hpp>
diff --git a/boost/container/detail/alloc_lib.h b/boost/container/detail/alloc_lib.h
index 4802d9d814..950ff722a5 100644
--- a/boost/container/detail/alloc_lib.h
+++ b/boost/container/detail/alloc_lib.h
@@ -15,27 +15,6 @@
#ifdef _MSC_VER
#pragma warning (push)
#pragma warning (disable : 4127)
-
-/*
- we need to import/export our code only if the user has specifically
- asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
- libraries to be dynamically linked, or BOOST_CONTAINER_DYN_LINK
- if they want just this one to be dynamically liked:
-*/
-#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
-
-/* export if this is our own source, otherwise import: */
-#ifdef BOOST_CONTAINER_SOURCE
-# define BOOST_CONTAINER_DECL __declspec(dllexport)
-#else
-# define BOOST_CONTAINER_DECL __declspec(dllimport)
-#endif /* BOOST_CONTAINER_SOURCE */
-#endif /* DYN_LINK */
-#endif /* _MSC_VER */
-
-/* if BOOST_CONTAINER_DECL isn't defined yet define it now: */
-#ifndef BOOST_CONTAINER_DECL
-#define BOOST_CONTAINER_DECL
#endif
#ifdef __cplusplus
@@ -215,14 +194,6 @@ typedef struct boost_cont_memchain_impl
}while(0)\
/**/
-BOOST_CONTAINER_DECL size_t boost_cont_size(const void *p);
-
-BOOST_CONTAINER_DECL void* boost_cont_malloc(size_t bytes);
-
-BOOST_CONTAINER_DECL void boost_cont_free(void* mem);
-
-BOOST_CONTAINER_DECL void* boost_cont_memalign(size_t bytes, size_t alignment);
-
/*!Indicates the all elements allocated by boost_cont_multialloc_nodes or boost_cont_multialloc_arrays
must be contiguous.*/
#define DL_MULTIALLOC_ALL_CONTIGUOUS ((size_t)(-1))
@@ -231,22 +202,6 @@ BOOST_CONTAINER_DECL void* boost_cont_memalign(size_t bytes, size_t alignment);
should be selected by those functions.*/
#define DL_MULTIALLOC_DEFAULT_CONTIGUOUS ((size_t)(0))
-BOOST_CONTAINER_DECL int boost_cont_multialloc_nodes
- (size_t n_elements, size_t elem_size, size_t contiguous_elements, boost_cont_memchain *pchain);
-
-BOOST_CONTAINER_DECL int boost_cont_multialloc_arrays
- (size_t n_elements, const size_t *sizes, size_t sizeof_element, size_t contiguous_elements, boost_cont_memchain *pchain);
-
-BOOST_CONTAINER_DECL void boost_cont_multidealloc(boost_cont_memchain *pchain);
-
-BOOST_CONTAINER_DECL size_t boost_cont_footprint();
-
-BOOST_CONTAINER_DECL size_t boost_cont_allocated_memory();
-
-BOOST_CONTAINER_DECL size_t boost_cont_chunksize(const void *p);
-
-BOOST_CONTAINER_DECL int boost_cont_all_deallocated();
-
typedef struct boost_cont_malloc_stats_impl
{
size_t max_system_bytes;
@@ -254,26 +209,6 @@ typedef struct boost_cont_malloc_stats_impl
size_t in_use_bytes;
} boost_cont_malloc_stats_t;
-BOOST_CONTAINER_DECL boost_cont_malloc_stats_t boost_cont_malloc_stats();
-
-BOOST_CONTAINER_DECL size_t boost_cont_in_use_memory();
-
-BOOST_CONTAINER_DECL int boost_cont_trim(size_t pad);
-
-BOOST_CONTAINER_DECL int boost_cont_mallopt
- (int parameter_number, int parameter_value);
-
-BOOST_CONTAINER_DECL int boost_cont_grow
- (void* oldmem, size_t minbytes, size_t maxbytes, size_t *received);
-
-BOOST_CONTAINER_DECL int boost_cont_shrink
- (void* oldmem, size_t minbytes, size_t maxbytes, size_t *received, int do_commit);
-
-BOOST_CONTAINER_DECL void* boost_cont_alloc
- (size_t minbytes, size_t preferred_bytes, size_t *received_bytes);
-
-BOOST_CONTAINER_DECL int boost_cont_malloc_check();
-
typedef unsigned int allocation_type;
enum
@@ -303,7 +238,50 @@ typedef struct boost_cont_command_ret_impl
int second;
}boost_cont_command_ret_t;
-BOOST_CONTAINER_DECL boost_cont_command_ret_t boost_cont_allocation_command
+size_t boost_cont_size(const void *p);
+
+void* boost_cont_malloc(size_t bytes);
+
+void boost_cont_free(void* mem);
+
+void* boost_cont_memalign(size_t bytes, size_t alignment);
+
+int boost_cont_multialloc_nodes
+ (size_t n_elements, size_t elem_size, size_t contiguous_elements, boost_cont_memchain *pchain);
+
+int boost_cont_multialloc_arrays
+ (size_t n_elements, const size_t *sizes, size_t sizeof_element, size_t contiguous_elements, boost_cont_memchain *pchain);
+
+void boost_cont_multidealloc(boost_cont_memchain *pchain);
+
+size_t boost_cont_footprint();
+
+size_t boost_cont_allocated_memory();
+
+size_t boost_cont_chunksize(const void *p);
+
+int boost_cont_all_deallocated();
+
+boost_cont_malloc_stats_t boost_cont_malloc_stats();
+
+size_t boost_cont_in_use_memory();
+
+int boost_cont_trim(size_t pad);
+
+int boost_cont_mallopt(int parameter_number, int parameter_value);
+
+int boost_cont_grow
+ (void* oldmem, size_t minbytes, size_t maxbytes, size_t *received);
+
+int boost_cont_shrink
+ (void* oldmem, size_t minbytes, size_t maxbytes, size_t *received, int do_commit);
+
+void* boost_cont_alloc
+ (size_t minbytes, size_t preferred_bytes, size_t *received_bytes);
+
+int boost_cont_malloc_check();
+
+boost_cont_command_ret_t boost_cont_allocation_command
( allocation_type command
, size_t sizeof_object
, size_t limit_objects
@@ -312,7 +290,17 @@ BOOST_CONTAINER_DECL boost_cont_command_ret_t boost_cont_allocation_command
, void *reuse_ptr
);
-BOOST_CONTAINER_DECL int boost_cont_mallopt(int param_number, int value);
+void *boost_cont_sync_create();
+
+void boost_cont_sync_destroy(void *sync);
+
+int boost_cont_sync_lock(void *sync);
+
+void boost_cont_sync_unlock(void *sync);
+
+int boost_cont_global_sync_lock();
+
+void boost_cont_global_sync_unlock();
#ifdef __cplusplus
} //extern "C" {
diff --git a/boost/container/detail/alloc_lib_auto_link.hpp b/boost/container/detail/alloc_lib_auto_link.hpp
deleted file mode 100644
index aea99a65c3..0000000000
--- a/boost/container/detail/alloc_lib_auto_link.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
-// Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//
-// See http://www.boost.org/libs/container for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-#ifndef BOOST_CONTAINER_DETAIL_BOOST_CONT_EXT_AUTO_LINK_HPP
-#define BOOST_CONTAINER_DETAIL_BOOST_CONT_EXT_AUTO_LINK_HPP
-
-#ifndef BOOST_CONFIG_HPP
-# include <boost/config.hpp>
-#endif
-
-#if defined(BOOST_HAS_PRAGMA_ONCE)
-# pragma once
-#endif
-
-#include <boost/container/detail/auto_link.hpp>
-#include <boost/container/detail/alloc_lib.h>
-
-#endif //#ifndef BOOST_CONTAINER_DETAIL_BOOST_CONT_EXT_AUTO_LINK_HPP
diff --git a/boost/container/detail/auto_link.hpp b/boost/container/detail/auto_link.hpp
index da078e8342..264b1ba112 100644
--- a/boost/container/detail/auto_link.hpp
+++ b/boost/container/detail/auto_link.hpp
@@ -18,6 +18,13 @@
# pragma once
#endif
+//Define BOOST_CONTAINER_DYNAMIC_LINKING which is independent from BOOST_*_NO_LIB
+//and is needed is some tests that need to disable some checks (like operator new replacements)
+//that don't work across DLL boundaries
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
+# define BOOST_CONTAINER_DYNAMIC_LINKING
+#endif
+
//
// Automatically link to the correct build variant where possible.
//
@@ -27,12 +34,14 @@
// once it's done with it:
//
#define BOOST_LIB_NAME boost_container
+
//
// If we're importing code from a dll, then tell auto_link.hpp about it:
//
-#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
+#if defined(BOOST_CONTAINER_DYNAMIC_LINKING)
# define BOOST_DYN_LINK
#endif
+
//
// And include the header that does the work:
//
diff --git a/boost/container/detail/block_list.hpp b/boost/container/detail/block_list.hpp
new file mode 100644
index 0000000000..1a6057cb4a
--- /dev/null
+++ b/boost/container/detail/block_list.hpp
@@ -0,0 +1,139 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_BLOCK_LIST_HEADER
+#define BOOST_CONTAINER_DETAIL_BLOCK_LIST_HEADER
+
+#ifndef BOOST_CONFIG_HPP
+# include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/throw_exception.hpp>
+#include <boost/intrusive/circular_list_algorithms.hpp>
+#include <boost/move/detail/type_traits.hpp>
+#include <boost/assert.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+struct list_node
+{
+ list_node *next;
+ list_node *previous;
+};
+
+struct list_node_traits
+{
+ typedef list_node node;
+ typedef list_node* node_ptr;
+ typedef const list_node* const_node_ptr;
+
+ static node_ptr get_next(const_node_ptr n)
+ { return n->next; }
+
+ static node_ptr get_previous(const_node_ptr n)
+ { return n->previous; }
+
+ static void set_next(const node_ptr & n, const node_ptr & next)
+ { n->next = next; }
+
+ static void set_previous(const node_ptr & n, const node_ptr & previous)
+ { n->previous = previous; }
+};
+
+struct block_list_header
+ : public list_node
+{
+ std::size_t size;
+};
+
+typedef bi::circular_list_algorithms<list_node_traits> list_algo;
+
+
+template<class DerivedFromBlockListHeader = block_list_header>
+class block_list_base
+{
+ list_node m_list;
+
+ static const std::size_t MaxAlignMinus1 = memory_resource::max_align-1u;
+
+ public:
+
+ static const std::size_t header_size = std::size_t(sizeof(DerivedFromBlockListHeader) + MaxAlignMinus1) & std::size_t(~MaxAlignMinus1);
+
+ explicit block_list_base()
+ { list_algo::init_header(&m_list); }
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ block_list_base(const block_list_base&) = delete;
+ block_list_base operator=(const block_list_base&) = delete;
+ #else
+ private:
+ block_list_base (const block_list_base&);
+ block_list_base operator=(const block_list_base&);
+ public:
+ #endif
+
+ ~block_list_base()
+ {}
+
+ void *allocate(std::size_t size, memory_resource &mr)
+ {
+ if((size_t(-1) - header_size) < size)
+ throw_bad_alloc();
+ void *p = mr.allocate(size+header_size);
+ block_list_header &mb = *::new((void*)p) DerivedFromBlockListHeader;
+ mb.size = size+header_size;
+ list_algo::link_after(&m_list, &mb);
+ return (char *)p + header_size;
+ }
+
+ void deallocate(void *p, memory_resource &mr) BOOST_NOEXCEPT
+ {
+ DerivedFromBlockListHeader *pheader = static_cast<DerivedFromBlockListHeader*>
+ (static_cast<void*>((char*)p - header_size));
+ list_algo::unlink(pheader);
+ const std::size_t size = pheader->size;
+ static_cast<DerivedFromBlockListHeader*>(pheader)->~DerivedFromBlockListHeader();
+ mr.deallocate(pheader, size, memory_resource::max_align);
+ }
+
+ void release(memory_resource &mr) BOOST_NOEXCEPT
+ {
+ list_node *n = list_algo::node_traits::get_next(&m_list);
+ while(n != &m_list){
+ DerivedFromBlockListHeader &d = static_cast<DerivedFromBlockListHeader&>(*n);
+ n = list_algo::node_traits::get_next(n);
+ std::size_t size = d.size;
+ d.~DerivedFromBlockListHeader();
+ mr.deallocate(reinterpret_cast<char*>(&d), size, memory_resource::max_align);
+ }
+ list_algo::init_header(&m_list);
+ }
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_DETAIL_BLOCK_LIST_HEADER
diff --git a/boost/container/detail/block_slist.hpp b/boost/container/detail/block_slist.hpp
new file mode 100644
index 0000000000..278e6414a7
--- /dev/null
+++ b/boost/container/detail/block_slist.hpp
@@ -0,0 +1,157 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DETAIL_BLOCK_SLIST_HEADER
+#define BOOST_CONTAINER_DETAIL_BLOCK_SLIST_HEADER
+
+#ifndef BOOST_CONFIG_HPP
+# include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
+
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/container_fwd.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/throw_exception.hpp>
+
+#include <boost/move/detail/type_traits.hpp>
+#include <boost/intrusive/linear_slist_algorithms.hpp>
+#include <boost/assert.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+struct slist_node
+{
+ slist_node *next;
+};
+
+struct slist_node_traits
+{
+ typedef slist_node node;
+ typedef slist_node* node_ptr;
+ typedef const slist_node* const_node_ptr;
+
+ static node_ptr get_next(const_node_ptr n)
+ { return n->next; }
+
+ static void set_next(const node_ptr & n, const node_ptr & next)
+ { n->next = next; }
+};
+
+struct block_slist_header
+ : public slist_node
+{
+ std::size_t size;
+};
+
+typedef bi::linear_slist_algorithms<slist_node_traits> slist_algo;
+
+template<class DerivedFromBlockSlistHeader = block_slist_header>
+class block_slist_base
+{
+ slist_node m_slist;
+
+ static const std::size_t MaxAlignMinus1 = memory_resource::max_align-1u;
+
+ public:
+
+ static const std::size_t header_size = std::size_t(sizeof(DerivedFromBlockSlistHeader) + MaxAlignMinus1) & std::size_t(~MaxAlignMinus1);
+
+ explicit block_slist_base()
+ { slist_algo::init_header(&m_slist); }
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ block_slist_base(const block_slist_base&) = delete;
+ block_slist_base operator=(const block_slist_base&) = delete;
+ #else
+ private:
+ block_slist_base (const block_slist_base&);
+ block_slist_base operator=(const block_slist_base&);
+ public:
+ #endif
+
+ ~block_slist_base()
+ {}
+
+ void *allocate(std::size_t size, memory_resource &mr)
+ {
+ if((size_t(-1) - header_size) < size)
+ throw_bad_alloc();
+ void *p = mr.allocate(size+header_size);
+ block_slist_header &mb = *::new((void*)p) DerivedFromBlockSlistHeader;
+ mb.size = size+header_size;
+ slist_algo::link_after(&m_slist, &mb);
+ return (char *)p + header_size;
+ }
+
+ void release(memory_resource &mr) BOOST_NOEXCEPT
+ {
+ slist_node *n = slist_algo::node_traits::get_next(&m_slist);
+ while(n){
+ DerivedFromBlockSlistHeader &d = static_cast<DerivedFromBlockSlistHeader&>(*n);
+ n = slist_algo::node_traits::get_next(n);
+ std::size_t size = d.block_slist_header::size;
+ d.~DerivedFromBlockSlistHeader();
+ mr.deallocate(reinterpret_cast<char*>(&d), size, memory_resource::max_align);
+ }
+ slist_algo::init_header(&m_slist);
+ }
+};
+
+class block_slist
+ : public block_slist_base<>
+{
+ memory_resource &m_upstream_rsrc;
+
+ public:
+
+ explicit block_slist(memory_resource &upstream_rsrc)
+ : block_slist_base<>(), m_upstream_rsrc(upstream_rsrc)
+ {}
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ block_slist(const block_slist&) = delete;
+ block_slist operator=(const block_slist&) = delete;
+ #else
+ private:
+ block_slist (const block_slist&);
+ block_slist operator=(const block_slist&);
+ public:
+ #endif
+
+ ~block_slist()
+ { this->release(); }
+
+ void *allocate(std::size_t size)
+ { return this->block_slist_base<>::allocate(size, m_upstream_rsrc); }
+
+ void release() BOOST_NOEXCEPT
+ { return this->block_slist_base<>::release(m_upstream_rsrc); }
+
+ memory_resource& upstream_resource() const BOOST_NOEXCEPT
+ { return m_upstream_rsrc; }
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_DETAIL_BLOCK_SLIST_HEADER
diff --git a/boost/container/detail/config_begin.hpp b/boost/container/detail/config_begin.hpp
index 3f509e320b..7e3e03fa64 100644
--- a/boost/container/detail/config_begin.hpp
+++ b/boost/container/detail/config_begin.hpp
@@ -25,6 +25,7 @@
#pragma warning (disable : 4267) // conversion from "X" to "Y", possible loss of data
#pragma warning (disable : 4275) // non DLL-interface classkey "identifier" used as base for DLL-interface classkey "identifier"
#pragma warning (disable : 4284) // odd return type for operator->
+ #pragma warning (disable : 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#pragma warning (disable : 4324) // structure was padded due to __declspec(align(
#pragma warning (disable : 4345) // behavior change: an object of POD type constructed with an initializer of the form () will be default-initialized
#pragma warning (disable : 4355) // "this" : used in base member initializer list
diff --git a/boost/container/detail/copy_move_algo.hpp b/boost/container/detail/copy_move_algo.hpp
index 23fa730838..f590a8aaf3 100644
--- a/boost/container/detail/copy_move_algo.hpp
+++ b/boost/container/detail/copy_move_algo.hpp
@@ -252,15 +252,15 @@ struct disable_if_memzero_initializable
template <typename I, typename R>
struct enable_if_trivially_destructible
- : enable_if_c < false/*container_detail::is_trivially_destructible
- <typename boost::container::iterator_traits<I>::value_type>::value*/
+ : enable_if_c < container_detail::is_trivially_destructible
+ <typename boost::container::iterator_traits<I>::value_type>::value
, R>
{};
template <typename I, typename R>
struct disable_if_trivially_destructible
- : enable_if_c <true/*!container_detail::is_trivially_destructible
- <typename boost::container::iterator_traits<I>::value_type>::value*/
+ : enable_if_c <!container_detail::is_trivially_destructible
+ <typename boost::container::iterator_traits<I>::value_type>::value
, R>
{};
diff --git a/boost/container/detail/dispatch_uses_allocator.hpp b/boost/container/detail/dispatch_uses_allocator.hpp
new file mode 100644
index 0000000000..3000f7cb27
--- /dev/null
+++ b/boost/container/detail/dispatch_uses_allocator.hpp
@@ -0,0 +1,293 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_DISPATCH_USES_ALLOCATOR_HPP
+#define BOOST_CONTAINER_DISPATCH_USES_ALLOCATOR_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+
+#include <boost/container/allocator_traits.hpp>
+#include <boost/container/uses_allocator.hpp>
+
+#include <boost/container/detail/addressof.hpp>
+#include <boost/container/detail/mpl.hpp>
+#include <boost/container/detail/pair.hpp>
+#include <boost/container/detail/type_traits.hpp>
+
+#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#include <boost/move/detail/fwd_macros.hpp>
+#endif
+#include <boost/move/utility_core.hpp>
+
+#include <boost/core/no_exceptions_support.hpp>
+
+namespace boost { namespace container {
+
+namespace container_detail {
+
+
+// Check if we can detect is_convertible using advanced SFINAE expressions
+#if !defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+ //! Code inspired by Mathias Gaunard's is_convertible.cpp found in the Boost mailing list
+ //! http://boost.2283326.n4.nabble.com/type-traits-is-constructible-when-decltype-is-supported-td3575452.html
+ //! Thanks Mathias!
+
+ //With variadic templates, we need a single class to implement the trait
+ template<class T, class ...Args>
+ struct is_constructible
+ {
+ typedef char yes_type;
+ struct no_type
+ { char padding[2]; };
+
+ template<std::size_t N>
+ struct dummy;
+
+ template<class X>
+ static decltype(X(boost::move_detail::declval<Args>()...), true_type()) test(int);
+
+ template<class X>
+ static no_type test(...);
+
+ static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
+ };
+
+ template <class T, class InnerAlloc, class ...Args>
+ struct is_constructible_with_allocator_prefix
+ : is_constructible<T, allocator_arg_t, InnerAlloc, Args...>
+ {};
+
+#else // #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+ //Without advanced SFINAE expressions, we can't use is_constructible
+ //so backup to constructible_with_allocator_xxx
+
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+ template <class T, class InnerAlloc, class ...Args>
+ struct is_constructible_with_allocator_prefix
+ : constructible_with_allocator_prefix<T>
+ {};
+
+ template <class T, class InnerAlloc, class ...Args>
+ struct is_constructible_with_allocator_suffix
+ : constructible_with_allocator_suffix<T>
+ {};
+
+ #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+ template <class T, class InnerAlloc, BOOST_MOVE_CLASSDFLT9>
+ struct is_constructible_with_allocator_prefix
+ : constructible_with_allocator_prefix<T>
+ {};
+
+ template <class T, class InnerAlloc, BOOST_MOVE_CLASSDFLT9>
+ struct is_constructible_with_allocator_suffix
+ : constructible_with_allocator_suffix<T>
+ {};
+
+ #endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+#endif // #if !defined(BOOST_NO_SFINAE_EXPR)
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , typename T
+ , class ...Args
+ >
+inline typename container_detail::enable_if_and
+ < void
+ , container_detail::is_not_pair<T>
+ , container_detail::not_< uses_allocator<T, ArgAlloc> >
+ >::type dispatch_uses_allocator
+ ( ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, T* p, BOOST_FWD_REF(Args)...args)
+{
+ (void)arg_alloc;
+ allocator_traits<ConstructAlloc>::construct(construct_alloc, p, ::boost::forward<Args>(args)...);
+}
+
+// allocator_arg_t
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , typename T
+ , class ...Args
+ >
+inline typename container_detail::enable_if_and
+ < void
+ , container_detail::is_not_pair<T>
+ , uses_allocator<T, ArgAlloc>
+ , is_constructible_with_allocator_prefix<T, ArgAlloc, Args...>
+ >::type dispatch_uses_allocator
+ ( ConstructAlloc& construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, T* p, BOOST_FWD_REF(Args) ...args)
+{
+ allocator_traits<ConstructAlloc>::construct
+ ( construct_alloc, p, allocator_arg
+ , ::boost::forward<ArgAlloc>(arg_alloc), ::boost::forward<Args>(args)...);
+}
+
+// allocator suffix
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , typename T
+ , class ...Args
+ >
+inline typename container_detail::enable_if_and
+ < void
+ , container_detail::is_not_pair<T>
+ , uses_allocator<T, ArgAlloc>
+ , container_detail::not_<is_constructible_with_allocator_prefix<T, ArgAlloc, Args...> >
+ >::type dispatch_uses_allocator
+ ( ConstructAlloc& construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, T* p, BOOST_FWD_REF(Args)...args)
+{
+ allocator_traits<ConstructAlloc>::construct
+ (construct_alloc, p, ::boost::forward<Args>(args)..., ::boost::forward<ArgAlloc>(arg_alloc));
+}
+
+#else //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+#define BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE(N) \
+ template <typename ConstructAlloc, typename ArgAlloc, typename T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
+ inline typename container_detail::enable_if_and\
+ < void\
+ , container_detail::is_not_pair<T>\
+ , container_detail::not_<uses_allocator<T, ArgAlloc> >\
+ >::type\
+ dispatch_uses_allocator\
+ (ConstructAlloc &construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
+ {\
+ (void)arg_alloc;\
+ allocator_traits<ConstructAlloc>::construct(construct_alloc, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
+ }\
+//
+BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE)
+#undef BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE
+
+#define BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE(N) \
+ template < typename ConstructAlloc, typename ArgAlloc, typename T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
+ inline typename container_detail::enable_if_and\
+ < void\
+ , container_detail::is_not_pair<T>\
+ , uses_allocator<T, ArgAlloc>\
+ , is_constructible_with_allocator_prefix<T, ArgAlloc BOOST_MOVE_I##N BOOST_MOVE_TARG##N>\
+ >::type\
+ dispatch_uses_allocator\
+ (ConstructAlloc& construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
+ {\
+ allocator_traits<ConstructAlloc>::construct\
+ (construct_alloc, p, allocator_arg, ::boost::forward<ArgAlloc>(arg_alloc) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
+ }\
+//
+BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE)
+#undef BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE
+
+#define BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE(N) \
+ template < typename ConstructAlloc, typename ArgAlloc, typename T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
+ inline typename container_detail::enable_if_and\
+ < void\
+ , container_detail::is_not_pair<T>\
+ , uses_allocator<T, ArgAlloc>\
+ , container_detail::not_<is_constructible_with_allocator_prefix<T, ArgAlloc BOOST_MOVE_I##N BOOST_MOVE_TARG##N> >\
+ >::type\
+ dispatch_uses_allocator\
+ (ConstructAlloc& construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
+ {\
+ allocator_traits<ConstructAlloc>::construct\
+ (construct_alloc, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N, ::boost::forward<ArgAlloc>(arg_alloc));\
+ }\
+//
+BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE)
+#undef BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE
+
+#endif //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , typename Pair
+ > inline
+BOOST_CONTAINER_DOC1ST(void, typename container_detail::enable_if<container_detail::is_pair<Pair> >::type)
+ dispatch_uses_allocator
+ ( ConstructAlloc & construct_alloc
+ , ArgAlloc & arg_alloc
+ , Pair* p)
+{
+ (dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->first));
+ BOOST_TRY{
+ (dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->second));
+ }
+ BOOST_CATCH(...) {
+ allocator_traits<ConstructAlloc>::destroy(construct_alloc, container_detail::addressof(p->first));
+ BOOST_RETHROW
+ }
+ BOOST_CATCH_END
+}
+
+
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , class Pair, class U, class V>
+BOOST_CONTAINER_DOC1ST(void, typename container_detail::enable_if<container_detail::is_pair<Pair> >::type)
+ dispatch_uses_allocator
+ ( ConstructAlloc & construct_alloc
+ , ArgAlloc & arg_alloc
+ , Pair* p, BOOST_FWD_REF(U) x, BOOST_FWD_REF(V) y)
+{
+ (dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->first), ::boost::forward<U>(x));
+ BOOST_TRY{
+ (dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->second), ::boost::forward<V>(y));
+ }
+ BOOST_CATCH(...){
+ allocator_traits<ConstructAlloc>::destroy(construct_alloc, container_detail::addressof(p->first));
+ BOOST_RETHROW
+ }
+ BOOST_CATCH_END
+}
+
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , class Pair, class Pair2>
+BOOST_CONTAINER_DOC1ST(void, typename container_detail::enable_if< container_detail::is_pair<Pair> >::type)
+ dispatch_uses_allocator
+ (ConstructAlloc & construct_alloc
+ , ArgAlloc & arg_alloc
+ , Pair* p, Pair2& x)
+{ (dispatch_uses_allocator)(construct_alloc, arg_alloc, p, x.first, x.second); }
+
+template < typename ConstructAlloc
+ , typename ArgAlloc
+ , class Pair, class Pair2>
+typename container_detail::enable_if_and
+ < void
+ , container_detail::is_pair<Pair>
+ , container_detail::not_<boost::move_detail::is_reference<Pair2> > >::type //This is needed for MSVC10 and ambiguous overloads
+ dispatch_uses_allocator
+ (ConstructAlloc & construct_alloc
+ , ArgAlloc & arg_alloc
+ , Pair* p, BOOST_RV_REF_BEG Pair2 BOOST_RV_REF_END x)
+{ (dispatch_uses_allocator)(construct_alloc, arg_alloc, p, ::boost::move(x.first), ::boost::move(x.second)); }
+
+//template <typename ConstructAlloc, typename ArgAlloc, class Pair, class Pair2>
+//void dispatch_uses_allocator( ConstructAlloc & construct_alloc, ArgAlloc & arg_alloc
+// , pair<T1, T2>* p, piecewise_construct_t, tuple<Args1...> x, tuple<Args2...> y);
+
+} //namespace container_detail
+
+}} // namespace boost { namespace container {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif // BOOST_CONTAINER_DISPATCH_USES_ALLOCATOR_HPP
diff --git a/boost/container/detail/dlmalloc.hpp b/boost/container/detail/dlmalloc.hpp
new file mode 100644
index 0000000000..15086c399f
--- /dev/null
+++ b/boost/container/detail/dlmalloc.hpp
@@ -0,0 +1,103 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_CONTAINER_DETAIL_ALLOC_LIB_HPP
+#define BOOST_CONTAINER_DETAIL_ALLOC_LIB_HPP
+
+#ifndef BOOST_CONFIG_HPP
+# include <boost/config.hpp>
+#endif
+
+#if defined(BOOST_HAS_PRAGMA_ONCE)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/auto_link.hpp>
+
+#include <boost/container/detail/alloc_lib.h>
+
+namespace boost{
+namespace container{
+
+typedef boost_cont_command_ret_t dlmalloc_command_ret_t;
+typedef boost_cont_memchain dlmalloc_memchain;
+typedef boost_cont_memchain_it dlmalloc_memchain_it;
+typedef boost_cont_malloc_stats_t dlmalloc_malloc_stats_t;
+
+BOOST_CONTAINER_DECL size_t dlmalloc_size(const void *p);
+
+BOOST_CONTAINER_DECL void* dlmalloc_malloc(size_t bytes);
+
+BOOST_CONTAINER_DECL void dlmalloc_free(void* mem);
+
+BOOST_CONTAINER_DECL void* dlmalloc_memalign(size_t bytes, size_t alignment);
+
+BOOST_CONTAINER_DECL int dlmalloc_multialloc_nodes
+ (size_t n_elements, size_t elem_size, size_t contiguous_elements, boost_cont_memchain *pchain);
+
+BOOST_CONTAINER_DECL int dlmalloc_multialloc_arrays
+ (size_t n_elements, const size_t *sizes, size_t sizeof_element, size_t contiguous_elements, boost_cont_memchain *pchain);
+
+BOOST_CONTAINER_DECL void dlmalloc_multidealloc(boost_cont_memchain *pchain);
+
+BOOST_CONTAINER_DECL size_t dlmalloc_footprint();
+
+BOOST_CONTAINER_DECL size_t dlmalloc_allocated_memory();
+
+BOOST_CONTAINER_DECL size_t dlmalloc_chunksize(const void *p);
+
+BOOST_CONTAINER_DECL int dlmalloc_all_deallocated();
+
+BOOST_CONTAINER_DECL boost_cont_malloc_stats_t dlmalloc_malloc_stats();
+
+BOOST_CONTAINER_DECL size_t dlmalloc_in_use_memory();
+
+BOOST_CONTAINER_DECL int dlmalloc_trim(size_t pad);
+
+BOOST_CONTAINER_DECL int dlmalloc_mallopt(int parameter_number, int parameter_value);
+
+BOOST_CONTAINER_DECL int dlmalloc_grow(void* oldmem, size_t minbytes, size_t maxbytes, size_t *received);
+
+BOOST_CONTAINER_DECL int dlmalloc_shrink(void* oldmem, size_t minbytes, size_t maxbytes, size_t *received, int do_commit);
+
+BOOST_CONTAINER_DECL void* dlmalloc_alloc(size_t minbytes, size_t preferred_bytes, size_t *received_bytes);
+
+BOOST_CONTAINER_DECL int dlmalloc_malloc_check();
+
+BOOST_CONTAINER_DECL boost_cont_command_ret_t dlmalloc_allocation_command
+ ( allocation_type command
+ , size_t sizeof_object
+ , size_t limit_objects
+ , size_t preferred_objects
+ , size_t *received_objects
+ , void *reuse_ptr
+ );
+
+BOOST_CONTAINER_DECL int dlmalloc_mallopt(int param_number, int value);
+
+BOOST_CONTAINER_DECL void *dlmalloc_sync_create();
+
+BOOST_CONTAINER_DECL void dlmalloc_sync_destroy(void *sync);
+
+BOOST_CONTAINER_DECL bool dlmalloc_sync_lock(void *sync);
+
+BOOST_CONTAINER_DECL void dlmalloc_sync_unlock(void *sync);
+
+BOOST_CONTAINER_DECL bool dlmalloc_global_sync_lock();
+
+BOOST_CONTAINER_DECL void dlmalloc_global_sync_unlock();
+
+} //namespace container{
+} //namespace boost{
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_DETAIL_ALLOC_LIB_HPP
diff --git a/boost/container/detail/flat_tree.hpp b/boost/container/detail/flat_tree.hpp
index f27421125f..4c48c8b7d3 100644
--- a/boost/container/detail/flat_tree.hpp
+++ b/boost/container/detail/flat_tree.hpp
@@ -1,6 +1,6 @@
////////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -376,35 +376,39 @@ class flat_tree
return i;
}
- iterator insert_unique(const_iterator pos, const value_type& val)
+ iterator insert_unique(const_iterator hint, const value_type& val)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(hint));
std::pair<iterator,bool> ret;
insert_commit_data data;
- return this->priv_insert_unique_prepare(pos, val, data)
+ return this->priv_insert_unique_prepare(hint, val, data)
? this->priv_insert_commit(data, val)
: iterator(vector_iterator_get_ptr(data.position));
}
- iterator insert_unique(const_iterator pos, BOOST_RV_REF(value_type) val)
+ iterator insert_unique(const_iterator hint, BOOST_RV_REF(value_type) val)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(hint));
std::pair<iterator,bool> ret;
insert_commit_data data;
- return this->priv_insert_unique_prepare(pos, val, data)
+ return this->priv_insert_unique_prepare(hint, val, data)
? this->priv_insert_commit(data, boost::move(val))
: iterator(vector_iterator_get_ptr(data.position));
}
- iterator insert_equal(const_iterator pos, const value_type& val)
+ iterator insert_equal(const_iterator hint, const value_type& val)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(hint));
insert_commit_data data;
- this->priv_insert_equal_prepare(pos, val, data);
+ this->priv_insert_equal_prepare(hint, val, data);
return this->priv_insert_commit(data, val);
}
- iterator insert_equal(const_iterator pos, BOOST_RV_REF(value_type) mval)
+ iterator insert_equal(const_iterator hint, BOOST_RV_REF(value_type) mval)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(hint));
insert_commit_data data;
- this->priv_insert_equal_prepare(pos, mval, data);
+ this->priv_insert_equal_prepare(hint, mval, data);
return this->priv_insert_commit(data, boost::move(mval));
}
@@ -524,6 +528,7 @@ class flat_tree
template <class... Args>
iterator emplace_hint_unique(const_iterator hint, BOOST_FWD_REF(Args)... args)
{
+ //hint checked in insert_unique
typename aligned_storage<sizeof(value_type), alignment_of<value_type>::value>::type v;
value_type &val = *static_cast<value_type *>(static_cast<void *>(&v));
stored_allocator_type &a = this->get_stored_allocator();
@@ -546,6 +551,7 @@ class flat_tree
template <class... Args>
iterator emplace_hint_equal(const_iterator hint, BOOST_FWD_REF(Args)... args)
{
+ //hint checked in insert_equal
typename aligned_storage<sizeof(value_type), alignment_of<value_type>::value>::type v;
value_type &val = *static_cast<value_type *>(static_cast<void *>(&v));
stored_allocator_type &a = this->get_stored_allocator();
@@ -732,6 +738,12 @@ class flat_tree
{ x.swap(y); }
private:
+
+ bool priv_in_range_or_end(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos <= this->end());
+ }
+
struct insert_commit_data
{
const_iterator position;
diff --git a/boost/container/detail/mutex.hpp b/boost/container/detail/mutex.hpp
index f8efa7fe6b..82e8810d0a 100644
--- a/boost/container/detail/mutex.hpp
+++ b/boost/container/detail/mutex.hpp
@@ -107,7 +107,7 @@
#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
/* Custom spin locks for older gcc on x86 */
- static FORCEINLINE int boost_container_x86_cas_lock(int *sl) {
+ static inline int boost_container_x86_cas_lock(int *sl) {
int ret;
int val = 1;
int cmp = 0;
@@ -118,7 +118,7 @@
return ret;
}
- static FORCEINLINE void boost_container_x86_clear_lock(int* sl) {
+ static inline void boost_container_x86_clear_lock(int* sl) {
assert(*sl != 0);
int prev = 0;
int ret;
diff --git a/boost/container/detail/pair.hpp b/boost/container/detail/pair.hpp
index 35e8846caa..17766f35cb 100644
--- a/boost/container/detail/pair.hpp
+++ b/boost/container/detail/pair.hpp
@@ -27,52 +27,12 @@
#include <boost/container/detail/mpl.hpp>
#include <boost/container/detail/type_traits.hpp>
#include <boost/container/detail/mpl.hpp>
-#include <boost/container/detail/type_traits.hpp>
+#include <boost/container/detail/std_fwd.hpp>
#include <boost/move/adl_move_swap.hpp> //swap
#include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
#include <boost/move/utility_core.hpp>
-/*
-namespace boost{
-
-template<class T1, class T2>
-inline rv< std::pair<T1, T2> > &move(std::pair<T1, T2> &r)
-{
- return reinterpret_cast< rv< std::pair<T1, T2> > &>(r);
-}
-
-template<class T1, class T2>
-inline rv< std::pair<T1, T2> > &move(rv< std::pair<T1, T2> > &r)
-{
- return r;
-}
-
-template <class T>
-inline typename ::boost::move_detail::enable_if_and
- < T &
- , boost::container::container_detail::is_std_pair<T>
- , ::boost::move_detail::is_rv<T>
- >::type
- forward(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
-{
- return const_cast<T&>(x);
-}
-
-template <class T>
-inline typename ::boost::move_detail::enable_if_and
- < const T &
- , boost::container::container_detail::is_std_pair<T>
- , ::boost::move_detail::is_not_rv<T>
- >::type
- forward(const typename ::boost::move_detail::identity<T>::type &x) BOOST_NOEXCEPT
-{
- return x;
-}
-
-} //namespace boost {
-*/
-
namespace boost {
namespace container {
namespace container_detail {
@@ -118,36 +78,6 @@ struct is_std_pair< std::pair<T1, T2> >
struct pair_nat;
-struct piecewise_construct_t { };
-static const piecewise_construct_t piecewise_construct = piecewise_construct_t();
-
-/*
-template <class T1, class T2>
-struct pair
-{
- template <class U, class V> pair(pair<U, V>&& p);
- template <class... Args1, class... Args2>
- pair(piecewise_construct_t, tuple<Args1...> first_args,
- tuple<Args2...> second_args);
-
- template <class U, class V> pair& operator=(const pair<U, V>& p);
- pair& operator=(pair&& p) noexcept(is_nothrow_move_assignable<T1>::value &&
- is_nothrow_move_assignable<T2>::value);
- template <class U, class V> pair& operator=(pair<U, V>&& p);
-
- void swap(pair& p) noexcept(noexcept(swap(first, p.first)) &&
- noexcept(swap(second, p.second)));
-};
-
-template <class T1, class T2> bool operator==(const pair<T1,T2>&, const pair<T1,T2>&);
-template <class T1, class T2> bool operator!=(const pair<T1,T2>&, const pair<T1,T2>&);
-template <class T1, class T2> bool operator< (const pair<T1,T2>&, const pair<T1,T2>&);
-template <class T1, class T2> bool operator> (const pair<T1,T2>&, const pair<T1,T2>&);
-template <class T1, class T2> bool operator>=(const pair<T1,T2>&, const pair<T1,T2>&);
-template <class T1, class T2> bool operator<=(const pair<T1,T2>&, const pair<T1,T2>&);
-*/
-
-
template <class T1, class T2>
struct pair
{
diff --git a/boost/container/detail/pool_common_alloc.hpp b/boost/container/detail/pool_common_alloc.hpp
index 72e9c8d278..3a3c80a78f 100644
--- a/boost/container/detail/pool_common_alloc.hpp
+++ b/boost/container/detail/pool_common_alloc.hpp
@@ -25,7 +25,7 @@
#include <boost/intrusive/slist.hpp>
#include <boost/container/detail/pool_common.hpp>
-#include <boost/container/detail/alloc_lib.h>
+#include <boost/container/detail/dlmalloc.hpp>
#include <cstddef>
namespace boost{
@@ -44,15 +44,15 @@ struct fake_segment_manager
typedef boost::container::container_detail::
basic_multiallocation_chain<void*> multiallocation_chain;
static void deallocate(void_pointer p)
- { boost_cont_free(p); }
+ { dlmalloc_free(p); }
static void deallocate_many(multiallocation_chain &chain)
{
std::size_t size = chain.size();
std::pair<void*, void*> ptrs = chain.extract_data();
- boost_cont_memchain dlchain;
+ dlmalloc_memchain dlchain;
BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&dlchain, ptrs.first, ptrs.second, size);
- boost_cont_multidealloc(&dlchain);
+ dlmalloc_multidealloc(&dlchain);
}
typedef std::ptrdiff_t difference_type;
@@ -60,7 +60,7 @@ struct fake_segment_manager
static void *allocate_aligned(std::size_t nbytes, std::size_t alignment)
{
- void *ret = boost_cont_memalign(nbytes, alignment);
+ void *ret = dlmalloc_memalign(nbytes, alignment);
if(!ret)
boost::container::throw_bad_alloc();
return ret;
@@ -68,7 +68,7 @@ struct fake_segment_manager
static void *allocate(std::size_t nbytes)
{
- void *ret = boost_cont_malloc(nbytes);
+ void *ret = dlmalloc_malloc(nbytes);
if(!ret)
boost::container::throw_bad_alloc();
return ret;
diff --git a/boost/container/detail/pool_resource.hpp b/boost/container/detail/pool_resource.hpp
new file mode 100644
index 0000000000..e5f59f5186
--- /dev/null
+++ b/boost/container/detail/pool_resource.hpp
@@ -0,0 +1,191 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_POOL_RESOURCE_HPP
+#define BOOST_CONTAINER_POOL_RESOURCE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/detail/block_list.hpp>
+#include <boost/container/pmr/pool_options.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+class pool_data_t;
+
+static const std::size_t pool_options_minimum_max_blocks_per_chunk = 1u;
+static const std::size_t pool_options_default_max_blocks_per_chunk = 32u;
+static const std::size_t pool_options_minimum_largest_required_pool_block =
+ memory_resource::max_align > 2*sizeof(void*) ? memory_resource::max_align : 2*sizeof(void*);
+static const std::size_t pool_options_default_largest_required_pool_block =
+ pool_options_minimum_largest_required_pool_block > 4096u
+ ? pool_options_minimum_largest_required_pool_block : 4096u;
+
+#endif //BOOST_CONTAINER_DOXYGEN_INVOKED
+
+class pool_resource
+{
+ typedef block_list_base<> block_list_base_t;
+
+ pool_options m_options;
+ memory_resource& m_upstream;
+ block_list_base_t m_oversized_list;
+ pool_data_t *m_pool_data;
+ std::size_t m_pool_count;
+
+ static void priv_limit_option(std::size_t &val, std::size_t min, std::size_t max);
+ static std::size_t priv_pool_index(std::size_t block_size);
+ static std::size_t priv_pool_block(std::size_t index);
+
+ void priv_fix_options();
+ void priv_init_pools();
+ void priv_constructor_body();
+
+ public:
+
+ //! <b>Requires</b>: `upstream` is the address of a valid memory resource.
+ //!
+ //! <b>Effects</b>: Constructs a pool resource object that will obtain memory
+ //! from upstream whenever the pool resource is unable to satisfy a memory
+ //! request from its own internal data structures. The resulting object will hold
+ //! a copy of upstream, but will not own the resource to which upstream points.
+ //! [ Note: The intention is that calls to upstream->allocate() will be
+ //! substantially fewer than calls to this->allocate() in most cases. - end note
+ //! The behavior of the pooling mechanism is tuned according to the value of
+ //! the opts argument.
+ //!
+ //! <b>Throws</b>: Nothing unless upstream->allocate() throws. It is unspecified if
+ //! or under what conditions this constructor calls upstream->allocate().
+ pool_resource(const pool_options& opts, memory_resource* upstream) BOOST_NOEXCEPT;
+
+ //! <b>Effects</b>: Same as
+ //! `pool_resource(pool_options(), get_default_resource())`.
+ pool_resource() BOOST_NOEXCEPT;
+
+ //! <b>Effects</b>: Same as
+ //! `pool_resource(pool_options(), upstream)`.
+ explicit pool_resource(memory_resource* upstream) BOOST_NOEXCEPT;
+
+ //! <b>Effects</b>: Same as
+ //! `pool_resource(opts, get_default_resource())`.
+ explicit pool_resource(const pool_options& opts) BOOST_NOEXCEPT;
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ pool_resource(const pool_resource&) = delete;
+ pool_resource operator=(const pool_resource&) = delete;
+ #else
+ private:
+ pool_resource (const pool_resource&);
+ pool_resource operator=(const pool_resource&);
+ public:
+ #endif
+
+ //! <b>Effects</b>: Calls
+ //! `this->release()`.
+ virtual ~pool_resource();
+
+ //! <b>Effects</b>: Calls Calls `upstream_resource()->deallocate()` as necessary
+ //! to release all allocated memory. [ Note: memory is released back to
+ //! `upstream_resource()` even if deallocate has not been called for some
+ //! of the allocated blocks. - end note ]
+ void release();
+
+ //! <b>Returns</b>: The value of the upstream argument provided to the
+ //! constructor of this object.
+ memory_resource* upstream_resource() const;
+
+ //! <b>Returns</b>: The options that control the pooling behavior of this resource.
+ //! The values in the returned struct may differ from those supplied to the pool
+ //! resource constructor in that values of zero will be replaced with
+ //! implementation-defined defaults and sizes may be rounded to unspecified granularity.
+ pool_options options() const;
+
+ public: //public so that [un]synchronized_pool_resource can use them
+
+ //! <b>Returns</b>: A pointer to allocated storage with a size of at least `bytes`.
+ //! The size and alignment of the allocated memory shall meet the requirements for
+ //! a class derived from `memory_resource`.
+ //!
+ //! <b>Effects</b>: If the pool selected for a block of size bytes is unable to
+ //! satisfy the memory request from its own internal data structures, it will call
+ //! `upstream_resource()->allocate()` to obtain more memory. If `bytes` is larger
+ //! than that which the largest pool can handle, then memory will be allocated
+ //! using `upstream_resource()->allocate()`.
+ //!
+ //! <b>Throws</b>: Nothing unless `upstream_resource()->allocate()` throws.
+ virtual void* do_allocate(std::size_t bytes, std::size_t alignment);
+
+ //! <b>Effects</b>: Return the memory at p to the pool. It is unspecified if or under
+ //! what circumstances this operation will result in a call to
+ //! `upstream_resource()->deallocate()`.
+ //!
+ //! <b>Throws</b>: Nothing.
+ virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment);
+
+ //! <b>Returns</b>:
+ //! `this == dynamic_cast<const pool_resource*>(&other)`.
+ virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT;
+
+ //Non-standard observers
+ public:
+ //! <b>Returns</b>: The number of pools that will be used in the pool resource.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_count() const;
+
+ //! <b>Returns</b>: The index of the pool that will be used to serve the allocation of `bytes`.
+ //! from the pool specified by `pool_index`. Returns `pool_count()` if `bytes` is bigger
+ //! than `options().largest_required_pool_block` (no pool will be used to serve this).
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_index(std::size_t bytes) const;
+
+ //! <b>Requires</b>: `pool_idx < pool_index()`
+ //!
+ //! <b>Returns</b>: The number blocks that will be allocated in the next chunk
+ //! from the pool specified by `pool_idx`.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_next_blocks_per_chunk(std::size_t pool_idx) const;
+
+ //! <b>Requires</b>: `pool_idx < pool_index()`
+ //!
+ //! <b>Returns</b>: The number of bytes of the block that the specified `pool_idx` pool manages.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_block(std::size_t pool_idx) const;
+
+ //! <b>Requires</b>: `pool_idx < pool_index()`
+ //!
+ //! <b>Returns</b>: The number of blocks that the specified `pool_idx` pool has cached
+ //! and will be served without calling the upstream_allocator.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_cached_blocks(std::size_t pool_idx) const;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_POOL_RESOURCE_HPP
diff --git a/boost/container/detail/std_fwd.hpp b/boost/container/detail/std_fwd.hpp
index 1277df071f..09678123ff 100644
--- a/boost/container/detail/std_fwd.hpp
+++ b/boost/container/detail/std_fwd.hpp
@@ -23,26 +23,8 @@
// Standard predeclarations
//////////////////////////////////////////////////////////////////////////////
-#if defined(_LIBCPP_VERSION)
- #define BOOST_CONTAINER_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic push
- #if defined(__clang__)
- #pragma GCC diagnostic ignored "-Wc++11-extensions"
- #endif
- #define BOOST_CONTAINER_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
- #define BOOST_CONTAINER_STD_NS_END _LIBCPP_END_NAMESPACE_STD
-#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION) //GCC >= 4.6
- #define BOOST_CONTAINER_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION
- #define BOOST_CONTAINER_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION } // namespace
-#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE) //GCC >= 4.2
- #define BOOST_CONTAINER_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
- #define BOOST_CONTAINER_STD_NS_END _GLIBCXX_END_NAMESPACE
-#else
- #define BOOST_CONTAINER_STD_NS_BEG namespace std{
- #define BOOST_CONTAINER_STD_NS_END }
-#endif
-
-BOOST_CONTAINER_STD_NS_BEG
+#include <boost/move/detail/std_ns_begin.hpp>
+BOOST_MOVE_STD_NS_BEG
template<class T>
class allocator;
@@ -66,11 +48,9 @@ class insert_iterator;
struct allocator_arg_t;
-BOOST_CONTAINER_STD_NS_END
+struct piecewise_construct_t;
-#ifdef BOOST_CONTAINER_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic pop
- #undef BOOST_CONTAINER_CLANG_INLINE_STD_NS
-#endif //BOOST_CONTAINER_CLANG_INLINE_STD_NS
+BOOST_MOVE_STD_NS_END
+#include <boost/move/detail/std_ns_end.hpp>
#endif //#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
diff --git a/boost/container/detail/tree.hpp b/boost/container/detail/tree.hpp
index c90202973a..c2d6b1d17d 100644
--- a/boost/container/detail/tree.hpp
+++ b/boost/container/detail/tree.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -413,8 +413,11 @@ struct key_node_compare
{ return node.get_data(); }
template<class T>
- typename enable_if_c<!is_node<T>::value, const T &>::type
- key_forward(const T &key) const
+ #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ const T &key_forward(const T &key, typename enable_if_c<!is_node<T>::value>::type* =0) const
+ #else
+ typename enable_if_c<!is_node<T>::value, const T &>::type key_forward(const T &key) const
+ #endif
{ return key; }
template<class KeyType, class KeyType2>
@@ -811,6 +814,7 @@ class tree
std::pair<iterator,bool> insert_unique_check
(const_iterator hint, const key_type& key, insert_commit_data &data)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
std::pair<iiterator, bool> ret =
this->icont().insert_unique_check(hint.get(), key, KeyNodeCompare(value_comp()), data);
return std::pair<iterator, bool>(iterator(ret.first), ret.second);
@@ -861,6 +865,15 @@ class tree
private:
+ bool priv_is_linked(const_iterator const position) const
+ {
+ iiterator const cur(position.get());
+ return cur == this->icont().end() ||
+ cur == this->icont().root() ||
+ iiterator(cur).go_parent().go_left() == cur ||
+ iiterator(cur).go_parent().go_right() == cur;
+ }
+
template<class MovableConvertible>
void push_back_impl(BOOST_FWD_REF(MovableConvertible) v)
{
@@ -888,6 +901,7 @@ class tree
iterator emplace_unique_hint_impl(const_iterator hint, NodePtr p)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
value_type &v = p->get_data();
insert_commit_data data;
std::pair<iterator,bool> ret =
@@ -924,6 +938,7 @@ class tree
template <class... Args>
iterator emplace_hint_equal(const_iterator hint, BOOST_FWD_REF(Args)... args)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
NodePtr tmp(AllocHolder::create_node(boost::forward<Args>(args)...));
scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
iterator ret(this->icont().insert_equal(hint.get(), *tmp));
@@ -955,6 +970,7 @@ class tree
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
iterator emplace_hint_equal(const_iterator hint BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
{\
+ BOOST_ASSERT((priv_is_linked)(hint));\
NodePtr tmp(AllocHolder::create_node(BOOST_MOVE_FWD##N));\
scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());\
iterator ret(this->icont().insert_equal(hint.get(), *tmp));\
@@ -969,6 +985,7 @@ class tree
iterator insert_unique(const_iterator hint, const value_type& v)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
insert_commit_data data;
std::pair<iterator,bool> ret =
this->insert_unique_check(hint, KeyOfValue()(v), data);
@@ -980,6 +997,7 @@ class tree
template<class MovableConvertible>
iterator insert_unique(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
insert_commit_data data;
std::pair<iterator,bool> ret =
this->insert_unique_check(hint, KeyOfValue()(v), data);
@@ -1016,6 +1034,7 @@ class tree
iterator insert_equal(const_iterator hint, const value_type& v)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
NodePtr tmp(AllocHolder::create_node(v));
scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
iterator ret(this->icont().insert_equal(hint.get(), *tmp));
@@ -1026,6 +1045,7 @@ class tree
template<class MovableConvertible>
iterator insert_equal(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
{
+ BOOST_ASSERT((priv_is_linked)(hint));
NodePtr tmp(AllocHolder::create_node(boost::forward<MovableConvertible>(v)));
scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
iterator ret(this->icont().insert_equal(hint.get(), *tmp));
@@ -1041,13 +1061,20 @@ class tree
}
iterator erase(const_iterator position)
- { return iterator(this->icont().erase_and_dispose(position.get(), Destroyer(this->node_alloc()))); }
+ {
+ BOOST_ASSERT(position != this->cend() && (priv_is_linked)(position));
+ return iterator(this->icont().erase_and_dispose(position.get(), Destroyer(this->node_alloc())));
+ }
size_type erase(const key_type& k)
{ return AllocHolder::erase_key(k, KeyNodeCompare(value_comp()), alloc_version()); }
iterator erase(const_iterator first, const_iterator last)
- { return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version())); }
+ {
+ BOOST_ASSERT(first == last || (first != this->cend() && (priv_is_linked)(first)));
+ BOOST_ASSERT(first == last || (priv_is_linked)(last));
+ return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version()));
+ }
void clear()
{ AllocHolder::clear(alloc_version()); }
diff --git a/boost/container/detail/type_traits.hpp b/boost/container/detail/type_traits.hpp
index e02709ac6e..e1453a6594 100644
--- a/boost/container/detail/type_traits.hpp
+++ b/boost/container/detail/type_traits.hpp
@@ -30,6 +30,8 @@ namespace boost {
namespace container {
namespace container_detail {
+using ::boost::move_detail::enable_if;
+using ::boost::move_detail::enable_if_and;
using ::boost::move_detail::is_same;
using ::boost::move_detail::is_different;
using ::boost::move_detail::is_pointer;
diff --git a/boost/container/detail/variadic_templates_tools.hpp b/boost/container/detail/variadic_templates_tools.hpp
index ec8b8ceef0..d8c8443038 100644
--- a/boost/container/detail/variadic_templates_tools.hpp
+++ b/boost/container/detail/variadic_templates_tools.hpp
@@ -54,7 +54,7 @@ class tuple<Head, Tail...>
// Construct tuple from another tuple.
template<typename... VValues>
tuple(const tuple<VValues...>& other)
- : m_head(other.head()), inherited(other.tail())
+ : inherited(other.tail()), m_head(other.head())
{}
template<typename... VValues>
diff --git a/boost/container/detail/workaround.hpp b/boost/container/detail/workaround.hpp
index 026e65d6bb..e1f6156964 100644
--- a/boost/container/detail/workaround.hpp
+++ b/boost/container/detail/workaround.hpp
@@ -19,8 +19,6 @@
# pragma once
#endif
-#include <boost/container/detail/config_begin.hpp>
-
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)\
&& !defined(BOOST_INTERPROCESS_DISABLE_VARIADIC_TMPL)
#define BOOST_CONTAINER_PERFECT_FORWARDING
@@ -59,6 +57,23 @@
#define BOOST_CONTAINER_DOCIGN(T) T
#define BOOST_CONTAINER_DOCONLY(T)
-#include <boost/container/detail/config_end.hpp>
+/*
+ we need to import/export our code only if the user has specifically
+ asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+ libraries to be dynamically linked, or BOOST_CONTAINER_DYN_LINK
+ if they want just this one to be dynamically liked:
+*/
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_CONTAINER_DYN_LINK)
+
+ /* export if this is our own source, otherwise import: */
+ #ifdef BOOST_CONTAINER_SOURCE
+ # define BOOST_CONTAINER_DECL BOOST_SYMBOL_EXPORT
+ #else
+ # define BOOST_CONTAINER_DECL BOOST_SYMBOL_IMPORT
+
+ #endif /* BOOST_CONTAINER_SOURCE */
+#else
+ #define BOOST_CONTAINER_DECL
+#endif /* DYN_LINK */
#endif //#ifndef BOOST_CONTAINER_DETAIL_WORKAROUND_HPP
diff --git a/boost/container/flat_map.hpp b/boost/container/flat_map.hpp
index ef0e1cb252..afd5a52d33 100644
--- a/boost/container/flat_map.hpp
+++ b/boost/container/flat_map.hpp
@@ -593,9 +593,12 @@ class flat_map
//!
//! Complexity: Logarithmic.
mapped_type &operator[](key_type &&k) ;
-
+ #elif defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ //in compilers like GCC 3.4, we can't catch temporaries
+ mapped_type& operator[](const key_type &k) { return this->priv_subscript(k); }
+ mapped_type& operator[](BOOST_RV_REF(key_type) k) { return this->priv_subscript(::boost::move(k)); }
#else
- BOOST_MOVE_CONVERSION_AWARE_CATCH( operator[] , key_type, mapped_type&, this->priv_subscript)
+ BOOST_MOVE_CONVERSION_AWARE_CATCH( operator[] , key_type, mapped_type&, this->priv_subscript)
#endif
//! @copydoc ::boost::container::flat_set::nth(size_type)
@@ -958,7 +961,7 @@ class flat_map
//! <b>Returns</b>: A const_iterator pointing to an element with the key
//! equivalent to x, or end() if such an element is not found.
//!
- //! <b>Complexity</b>: Logarithmic.s
+ //! <b>Complexity</b>: Logarithmic.
const_iterator find(const key_type& x) const
{ return container_detail::force_copy<const_iterator>(m_flat_tree.find(x)); }
@@ -971,40 +974,40 @@ class flat_map
//! <b>Returns</b>: An iterator pointing to the first element with key not less
//! than k, or a.end() if such an element is not found.
//!
- //! <b>Complexity</b>: Logarithmic
+ //! <b>Complexity</b>: Logarithmic.
iterator lower_bound(const key_type& x)
{ return container_detail::force_copy<iterator>(m_flat_tree.lower_bound(x)); }
//! <b>Returns</b>: A const iterator pointing to the first element with key not
//! less than k, or a.end() if such an element is not found.
//!
- //! <b>Complexity</b>: Logarithmic
+ //! <b>Complexity</b>: Logarithmic.
const_iterator lower_bound(const key_type& x) const
{ return container_detail::force_copy<const_iterator>(m_flat_tree.lower_bound(x)); }
//! <b>Returns</b>: An iterator pointing to the first element with key not less
//! than x, or end() if such an element is not found.
//!
- //! <b>Complexity</b>: Logarithmic
+ //! <b>Complexity</b>: Logarithmic.
iterator upper_bound(const key_type& x)
{ return container_detail::force_copy<iterator>(m_flat_tree.upper_bound(x)); }
//! <b>Returns</b>: A const iterator pointing to the first element with key not
//! less than x, or end() if such an element is not found.
//!
- //! <b>Complexity</b>: Logarithmic
+ //! <b>Complexity</b>: Logarithmic.
const_iterator upper_bound(const key_type& x) const
{ return container_detail::force_copy<const_iterator>(m_flat_tree.upper_bound(x)); }
//! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), this->upper_bound(k)).
//!
- //! <b>Complexity</b>: Logarithmic
+ //! <b>Complexity</b>: Logarithmic.
std::pair<iterator,iterator> equal_range(const key_type& x)
{ return container_detail::force_copy<std::pair<iterator,iterator> >(m_flat_tree.lower_bound_range(x)); }
//! <b>Effects</b>: Equivalent to std::make_pair(this->lower_bound(k), this->upper_bound(k)).
//!
- //! <b>Complexity</b>: Logarithmic
+ //! <b>Complexity</b>: Logarithmic.
std::pair<const_iterator,const_iterator> equal_range(const key_type& x) const
{ return container_detail::force_copy<std::pair<const_iterator,const_iterator> >(m_flat_tree.lower_bound_range(x)); }
diff --git a/boost/container/flat_set.hpp b/boost/container/flat_set.hpp
index 8f592798d2..a99e70786a 100644
--- a/boost/container/flat_set.hpp
+++ b/boost/container/flat_set.hpp
@@ -968,17 +968,17 @@ class flat_multiset
: base_t(static_cast<const base_t&>(x))
{}
- //! @copydoc ::boost::container::flat_set(flat_set &&)
+ //! @copydoc ::boost::container::flat_set::flat_set(flat_set &&)
flat_multiset(BOOST_RV_REF(flat_multiset) x)
: base_t(boost::move(static_cast<base_t&>(x)))
{}
- //! @copydoc ::boost::container::flat_set(const flat_set &, const allocator_type &)
+ //! @copydoc ::boost::container::flat_set::flat_set(const flat_set &, const allocator_type &)
flat_multiset(const flat_multiset& x, const allocator_type &a)
: base_t(static_cast<const base_t&>(x), a)
{}
- //! @copydoc ::boost::container::flat_set(flat_set &&, const allocator_type &)
+ //! @copydoc ::boost::container::flat_set::flat_set(flat_set &&, const allocator_type &)
flat_multiset(BOOST_RV_REF(flat_multiset) x, const allocator_type &a)
: base_t(BOOST_MOVE_BASE(base_t, x), a)
{}
diff --git a/boost/container/list.hpp b/boost/container/list.hpp
index 5135eaecee..8236ff7939 100644
--- a/boost/container/list.hpp
+++ b/boost/container/list.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -651,7 +651,10 @@ class list
//!
//! <b>Complexity</b>: Constant.
reference front() BOOST_NOEXCEPT_OR_NOTHROW
- { return *this->begin(); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->begin();
+ }
//! <b>Requires</b>: !empty()
//!
@@ -662,7 +665,10 @@ class list
//!
//! <b>Complexity</b>: Constant.
const_reference front() const BOOST_NOEXCEPT_OR_NOTHROW
- { return *this->begin(); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->begin();
+ }
//! <b>Requires</b>: !empty()
//!
@@ -673,7 +679,10 @@ class list
//!
//! <b>Complexity</b>: Constant.
reference back() BOOST_NOEXCEPT_OR_NOTHROW
- { return *(--this->end()); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *(--this->end());
+ }
//! <b>Requires</b>: !empty()
//!
@@ -684,7 +693,10 @@ class list
//!
//! <b>Complexity</b>: Constant.
const_reference back() const BOOST_NOEXCEPT_OR_NOTHROW
- { return *(--this->end()); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *(--this->end());
+ }
//////////////////////////////////////////////
//
@@ -724,10 +736,11 @@ class list
//!
//! <b>Complexity</b>: Constant
template <class... Args>
- iterator emplace(const_iterator p, BOOST_FWD_REF(Args)... args)
+ iterator emplace(const_iterator position, BOOST_FWD_REF(Args)... args)
{
+ BOOST_ASSERT((priv_is_linked)(position));
NodePtr pnode(AllocHolder::create_node(boost::forward<Args>(args)...));
- return iterator(this->icont().insert(p.get(), *pnode));
+ return iterator(this->icont().insert(position.get(), *pnode));
}
#else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
@@ -742,10 +755,11 @@ class list
{ this->emplace(this->cbegin() BOOST_MOVE_I##N BOOST_MOVE_FWD##N);}\
\
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
- iterator emplace(const_iterator p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
+ iterator emplace(const_iterator position BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
{\
+ BOOST_ASSERT(position == this->cend() || (--(++position) == position) );\
NodePtr pnode (AllocHolder::create_node(BOOST_MOVE_FWD##N));\
- return iterator(this->icont().insert(p.get(), *pnode));\
+ return iterator(this->icont().insert(position.get(), *pnode));\
}\
//
BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_LIST_EMPLACE_CODE)
@@ -828,10 +842,11 @@ class list
//! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
//!
//! <b>Complexity</b>: Linear to n.
- iterator insert(const_iterator p, size_type n, const T& x)
+ iterator insert(const_iterator position, size_type n, const T& x)
{
+ //range check is done by insert
typedef constant_iterator<value_type, difference_type> cvalue_iterator;
- return this->insert(p, cvalue_iterator(x, n), cvalue_iterator());
+ return this->insert(position, cvalue_iterator(x, n), cvalue_iterator());
}
//! <b>Requires</b>: p must be a valid iterator of *this.
@@ -856,6 +871,7 @@ class list
#endif
)
{
+ BOOST_ASSERT((priv_is_linked)(p));
const typename Icont::iterator ipos(p.get());
iterator ret_it(ipos);
if(first != last){
@@ -870,7 +886,7 @@ class list
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
template <class FwdIt>
- iterator insert(const_iterator p, FwdIt first, FwdIt last
+ iterator insert(const_iterator position, FwdIt first, FwdIt last
, typename container_detail::enable_if_c
< !container_detail::is_convertible<FwdIt, size_type>::value
&& !(container_detail::is_input_iterator<FwdIt>::value
@@ -879,9 +895,10 @@ class list
>::type * = 0
)
{
+ BOOST_ASSERT((priv_is_linked)(position));
//Optimized allocation and construction
- insertion_functor func(this->icont(), p.get());
- iterator before_p(p.get());
+ insertion_functor func(this->icont(), position.get());
+ iterator before_p(position.get());
--before_p;
this->allocate_many_and_construct(first, boost::container::iterator_distance(first, last), func);
return ++before_p;
@@ -900,7 +917,10 @@ class list
//!
//! <b>Complexity</b>: Linear to distance [il.begin(), il.end()).
iterator insert(const_iterator p, std::initializer_list<value_type> il)
- { return insert(p, il.begin(), il.end()); }
+ {
+ //position range check is done by insert()
+ return insert(p, il.begin(), il.end());
+ }
#endif
//! <b>Effects</b>: Removes the first element from the list.
@@ -909,7 +929,10 @@ class list
//!
//! <b>Complexity</b>: Amortized constant time.
void pop_front() BOOST_NOEXCEPT_OR_NOTHROW
- { this->erase(this->cbegin()); }
+ {
+ BOOST_ASSERT(!this->empty());
+ this->erase(this->cbegin());
+ }
//! <b>Effects</b>: Removes the last element from the list.
//!
@@ -917,7 +940,11 @@ class list
//!
//! <b>Complexity</b>: Amortized constant time.
void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
- { const_iterator tmp = this->cend(); this->erase(--tmp); }
+ {
+ BOOST_ASSERT(!this->empty());
+ const_iterator tmp = this->cend();
+ this->erase(--tmp);
+ }
//! <b>Requires</b>: p must be a valid iterator of *this.
//!
@@ -927,7 +954,10 @@ class list
//!
//! <b>Complexity</b>: Amortized constant time.
iterator erase(const_iterator p) BOOST_NOEXCEPT_OR_NOTHROW
- { return iterator(this->icont().erase_and_dispose(p.get(), Destroyer(this->node_alloc()))); }
+ {
+ BOOST_ASSERT(p != this->cend() && (priv_is_linked)(p));
+ return iterator(this->icont().erase_and_dispose(p.get(), Destroyer(this->node_alloc())));
+ }
//! <b>Requires</b>: first and last must be valid iterator to elements in *this.
//!
@@ -937,7 +967,11 @@ class list
//!
//! <b>Complexity</b>: Linear to the distance between first and last.
iterator erase(const_iterator first, const_iterator last) BOOST_NOEXCEPT_OR_NOTHROW
- { return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version())); }
+ {
+ BOOST_ASSERT(first == last || (first != this->cend() && (priv_is_linked)(first)));
+ BOOST_ASSERT(first == last || (priv_is_linked)(last));
+ return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version()));
+ }
//! <b>Effects</b>: Swaps the contents of *this and x.
//!
@@ -947,7 +981,12 @@ class list
void swap(list& x)
BOOST_NOEXCEPT_IF(allocator_traits_type::propagate_on_container_swap::value
|| allocator_traits_type::is_always_equal::value)
- { AllocHolder::swap(x); }
+ {
+ BOOST_ASSERT(allocator_traits_type::propagate_on_container_swap::value ||
+ allocator_traits_type::is_always_equal::value ||
+ this->get_stored_allocator() == x.get_stored_allocator());
+ AllocHolder::swap(x);
+ }
//! <b>Effects</b>: Erases all the elements of the list.
//!
@@ -977,6 +1016,7 @@ class list
//! this list. Iterators of this list and all the references are not invalidated.
void splice(const_iterator p, list& x) BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT((priv_is_linked)(p));
BOOST_ASSERT(this != &x);
BOOST_ASSERT(this->node_alloc() == x.node_alloc());
this->icont().splice(p.get(), x.icont());
@@ -995,7 +1035,10 @@ class list
//! <b>Note</b>: Iterators of values obtained from list x now point to elements of
//! this list. Iterators of this list and all the references are not invalidated.
void splice(const_iterator p, BOOST_RV_REF(list) x) BOOST_NOEXCEPT_OR_NOTHROW
- { this->splice(p, static_cast<list&>(x)); }
+ {
+ //Checks done in splice
+ this->splice(p, static_cast<list&>(x));
+ }
//! <b>Requires</b>: p must point to an element contained
//! by this list. i must point to an element contained in list x.
@@ -1013,7 +1056,7 @@ class list
//! list. Iterators of this list and all the references are not invalidated.
void splice(const_iterator p, list &x, const_iterator i) BOOST_NOEXCEPT_OR_NOTHROW
{
- //BOOST_ASSERT(this != &x);
+ BOOST_ASSERT((priv_is_linked)(p));
BOOST_ASSERT(this->node_alloc() == x.node_alloc());
this->icont().splice(p.get(), x.icont(), i.get());
}
@@ -1033,7 +1076,11 @@ class list
//! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
//! list. Iterators of this list and all the references are not invalidated.
void splice(const_iterator p, BOOST_RV_REF(list) x, const_iterator i) BOOST_NOEXCEPT_OR_NOTHROW
- { this->splice(p, static_cast<list&>(x), i); }
+ {
+ BOOST_ASSERT(this != &x);
+ //Additional checks done in splice()
+ this->splice(p, static_cast<list&>(x), i);
+ }
//! <b>Requires</b>: p must point to an element contained
//! by this list. first and last must point to elements contained in list x.
@@ -1050,6 +1097,9 @@ class list
//! list. Iterators of this list and all the references are not invalidated.
void splice(const_iterator p, list &x, const_iterator first, const_iterator last) BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT((priv_is_linked)(p));
+ BOOST_ASSERT(first == last || (first != x.cend() && x.priv_is_linked(first)));
+ BOOST_ASSERT(first == last || x.priv_is_linked(last));
BOOST_ASSERT(this->node_alloc() == x.node_alloc());
this->icont().splice(p.get(), x.icont(), first.get(), last.get());
}
@@ -1068,7 +1118,11 @@ class list
//! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
//! list. Iterators of this list and all the references are not invalidated.
void splice(const_iterator p, BOOST_RV_REF(list) x, const_iterator first, const_iterator last) BOOST_NOEXCEPT_OR_NOTHROW
- { this->splice(p, static_cast<list&>(x), first, last); }
+ {
+ BOOST_ASSERT(this != &x);
+ //Additional checks done in splice()
+ this->splice(p, static_cast<list&>(x), first, last);
+ }
//! <b>Requires</b>: p must point to an element contained
//! by this list. first and last must point to elements contained in list x.
@@ -1318,6 +1372,13 @@ class list
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
private:
+ static bool priv_is_linked(const_iterator const position)
+ {
+ const_iterator cur(position);
+ //This list is circular including end nodes
+ return (--(++cur)) == position && (++(--cur)) == position;
+ }
+
bool priv_try_shrink(size_type new_size)
{
const size_type len = this->size();
@@ -1348,12 +1409,14 @@ class list
iterator priv_insert(const_iterator p, const T &x)
{
+ BOOST_ASSERT((priv_is_linked)(p));
NodePtr tmp = AllocHolder::create_node(x);
return iterator(this->icont().insert(p.get(), *tmp));
}
iterator priv_insert(const_iterator p, BOOST_RV_REF(T) x)
{
+ BOOST_ASSERT((priv_is_linked)(p));
NodePtr tmp = AllocHolder::create_node(boost::move(x));
return iterator(this->icont().insert(p.get(), *tmp));
}
diff --git a/boost/container/map.hpp b/boost/container/map.hpp
index 4dc6096e1e..8173181221 100644
--- a/boost/container/map.hpp
+++ b/boost/container/map.hpp
@@ -481,8 +481,12 @@ class map
//!
//! Complexity: Logarithmic.
mapped_type& operator[](key_type &&k);
+ #elif defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ //in compilers like GCC 3.4, we can't catch temporaries
+ mapped_type& operator[](const key_type &k) { return this->priv_subscript(k); }
+ mapped_type& operator[](BOOST_RV_REF(key_type) k) { return this->priv_subscript(::boost::move(k)); }
#else
- BOOST_MOVE_CONVERSION_AWARE_CATCH( operator[] , key_type, mapped_type&, this->priv_subscript)
+ BOOST_MOVE_CONVERSION_AWARE_CATCH( operator[] , key_type, mapped_type&, this->priv_subscript)
#endif
//! Returns: A reference to the element whose key is equivalent to x.
diff --git a/boost/container/new_allocator.hpp b/boost/container/new_allocator.hpp
index 1ac15d8a25..6a1d8c76e3 100644
--- a/boost/container/new_allocator.hpp
+++ b/boost/container/new_allocator.hpp
@@ -29,6 +29,8 @@
namespace boost {
namespace container {
+/// @cond
+
template<bool Value>
struct new_allocator_bool
{ static const bool value = Value; };
@@ -36,6 +38,8 @@ struct new_allocator_bool
template<class T>
class new_allocator;
+/// @endcond
+
//! Specialization of new_allocator for void types
template<>
class new_allocator<void>
diff --git a/boost/container/node_allocator.hpp b/boost/container/node_allocator.hpp
index c3d809078f..d92577e741 100644
--- a/boost/container/node_allocator.hpp
+++ b/boost/container/node_allocator.hpp
@@ -26,7 +26,7 @@
#include <boost/container/detail/node_pool.hpp>
#include <boost/container/detail/mpl.hpp>
#include <boost/container/detail/multiallocation_chain.hpp>
-#include <boost/container/detail/alloc_lib_auto_link.hpp>
+#include <boost/container/detail/dlmalloc.hpp>
#include <boost/container/detail/singleton.hpp>
#include <boost/assert.hpp>
@@ -157,7 +157,7 @@ class node_allocator
return pointer(static_cast<T*>(singleton_t::instance().allocate_node()));
}
else{
- void *ret = boost_cont_malloc(count*sizeof(T));
+ void *ret = dlmalloc_malloc(count*sizeof(T));
if(BOOST_UNLIKELY(!ret))
boost::container::throw_bad_alloc();
return static_cast<pointer>(ret);
@@ -176,7 +176,7 @@ class node_allocator
singleton_t::instance().deallocate_node(ptr);
}
else{
- boost_cont_free(ptr);
+ dlmalloc_free(ptr);
}
}
@@ -204,7 +204,7 @@ class node_allocator
size_type size(pointer p) const BOOST_NOEXCEPT_OR_NOTHROW
{
BOOST_STATIC_ASSERT(( Version > 1 ));
- return boost_cont_size(p);
+ return dlmalloc_size(p);
}
//!Allocates just one object. Memory allocated with this function
@@ -259,9 +259,9 @@ class node_allocator
void allocate_many(size_type elem_size, std::size_t n_elements, multiallocation_chain &chain)
{
BOOST_STATIC_ASSERT(( Version > 1 ));
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
BOOST_CONTAINER_MEMCHAIN_INIT(&ch);
- if(BOOST_UNLIKELY(!boost_cont_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
+ if(BOOST_UNLIKELY(!dlmalloc_multialloc_nodes(n_elements, elem_size*sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch))){
boost::container::throw_bad_alloc();
}
chain.incorporate_after( chain.before_begin()
@@ -275,8 +275,8 @@ class node_allocator
void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain)
{
BOOST_STATIC_ASSERT(( Version > 1 ));
- boost_cont_memchain ch;
- boost_cont_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch);
+ dlmalloc_memchain ch;
+ dlmalloc_multialloc_arrays(n_elements, elem_sizes, sizeof(T), DL_MULTIALLOC_DEFAULT_CONTIGUOUS, &ch);
if(BOOST_UNLIKELY(BOOST_CONTAINER_MEMCHAIN_EMPTY(&ch))){
boost::container::throw_bad_alloc();
}
@@ -292,9 +292,9 @@ class node_allocator
void *first = &*chain.begin();
void *last = &*chain.last();
size_t num = chain.size();
- boost_cont_memchain ch;
+ dlmalloc_memchain ch;
BOOST_CONTAINER_MEMCHAIN_INIT_FROM(&ch, first, last, num);
- boost_cont_multidealloc(&ch);
+ dlmalloc_multidealloc(&ch);
}
//!Swaps allocators. Does not throw. If each allocator is placed in a
@@ -319,7 +319,7 @@ class node_allocator
,pointer &reuse)
{
std::size_t const preferred_size = prefer_in_recvd_out_size;
- boost_cont_command_ret_t ret = {0 , 0};
+ dlmalloc_command_ret_t ret = {0 , 0};
if((limit_size > this->max_size()) | (preferred_size > this->max_size())){
return pointer();
}
@@ -328,7 +328,7 @@ class node_allocator
std::size_t r_size;
{
void* reuse_ptr_void = reuse;
- ret = boost_cont_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
+ ret = dlmalloc_allocation_command(command, sizeof(T), l_size, p_size, &r_size, reuse_ptr_void);
reuse = static_cast<T*>(reuse_ptr_void);
}
prefer_in_recvd_out_size = r_size/sizeof(T);
diff --git a/boost/container/pmr/deque.hpp b/boost/container/pmr/deque.hpp
new file mode 100644
index 0000000000..744758606c
--- /dev/null
+++ b/boost/container/pmr/deque.hpp
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_DEQUE_HPP
+#define BOOST_CONTAINER_PMR_DEQUE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/deque.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class T>
+using deque = boost::container::deque<T, polymorphic_allocator<T>>;
+
+#endif
+
+template<class T>
+struct deque_of
+{
+ typedef boost::container::deque
+ < T, polymorphic_allocator<T> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_DEQUE_HPP
diff --git a/boost/container/pmr/flat_map.hpp b/boost/container/pmr/flat_map.hpp
new file mode 100644
index 0000000000..786c190b05
--- /dev/null
+++ b/boost/container/pmr/flat_map.hpp
@@ -0,0 +1,63 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_FLAT_MAP_HPP
+#define BOOST_CONTAINER_PMR_FLAT_MAP_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/flat_map.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using flat_map = boost::container::flat_map<Key, T, Compare, polymorphic_allocator<std::pair<Key, T> > >;
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using flat_multimap = boost::container::flat_multimap<Key, T, Compare, polymorphic_allocator<std::pair<Key, T> > >;
+
+#endif
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct flat_map_of
+{
+ typedef boost::container::flat_map<Key, T, Compare, polymorphic_allocator<std::pair<Key, T> > > type;
+};
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct flat_multimap_of
+{
+ typedef boost::container::flat_multimap<Key, T, Compare, polymorphic_allocator<std::pair<Key, T> > > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_FLAT_MAP_HPP
diff --git a/boost/container/pmr/flat_set.hpp b/boost/container/pmr/flat_set.hpp
new file mode 100644
index 0000000000..5c3ad1e09e
--- /dev/null
+++ b/boost/container/pmr/flat_set.hpp
@@ -0,0 +1,59 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_SET_HPP
+#define BOOST_CONTAINER_PMR_SET_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/flat_set.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using flat_set = boost::container::flat_set<Key, Compare, polymorphic_allocator<Key> >;
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using flat_multiset = boost::container::flat_multiset<Key, Compare, polymorphic_allocator<Key> >;
+
+#endif
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct flat_set_of
+{
+ typedef boost::container::flat_set<Key, Compare, polymorphic_allocator<Key> > type;
+};
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct flat_multiset_of
+{
+ typedef boost::container::flat_multiset<Key, Compare, polymorphic_allocator<Key> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_SET_HPP
diff --git a/boost/container/pmr/global_resource.hpp b/boost/container/pmr/global_resource.hpp
new file mode 100644
index 0000000000..219309b072
--- /dev/null
+++ b/boost/container/pmr/global_resource.hpp
@@ -0,0 +1,66 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_GLOBAL_RESOURCE_HPP
+#define BOOST_CONTAINER_PMR_GLOBAL_RESOURCE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/auto_link.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+/// @cond
+class memory_resource;
+/// @endcond
+
+//! <b>Returns</b>: A pointer to a static-duration object of a type derived from
+//! memory_resource that can serve as a resource for allocating memory using
+//! global `operator new` and global `operator delete`. The same value is returned every time this function
+//! is called. For return value p and memory resource r, p->is_equal(r) returns &r == p.
+BOOST_CONTAINER_DECL memory_resource* new_delete_resource() BOOST_NOEXCEPT;
+
+//! <b>Returns</b>: A pointer to a static-duration object of a type derived from
+//! memory_resource for which allocate() always throws bad_alloc and for which
+//! deallocate() has no effect. The same value is returned every time this function
+//! is called. For return value p and memory resource r, p->is_equal(r) returns &r == p.
+BOOST_CONTAINER_DECL memory_resource* null_memory_resource() BOOST_NOEXCEPT;
+
+//! <b>Effects</b>: If r is non-null, sets the value of the default memory resource
+//! pointer to r, otherwise sets the default memory resource pointer to new_delete_resource().
+//!
+//! <b>Postconditions</b>: get_default_resource() == r.
+//!
+//! <b>Returns</b>: The previous value of the default memory resource pointer.
+//!
+//! <b>Remarks</b>: Calling the set_default_resource and get_default_resource functions shall
+//! not incur a data race. A call to the set_default_resource function shall synchronize
+//! with subsequent calls to the set_default_resource and get_default_resource functions.
+BOOST_CONTAINER_DECL memory_resource* set_default_resource(memory_resource* r) BOOST_NOEXCEPT;
+
+//! <b>Returns</b>: The current value of the default
+//! memory resource pointer.
+BOOST_CONTAINER_DECL memory_resource* get_default_resource() BOOST_NOEXCEPT;
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_PMR_GLOBAL_RESOURCE_HPP
diff --git a/boost/container/pmr/list.hpp b/boost/container/pmr/list.hpp
new file mode 100644
index 0000000000..5967f452be
--- /dev/null
+++ b/boost/container/pmr/list.hpp
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_LIST_HPP
+#define BOOST_CONTAINER_PMR_LIST_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/list.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class T>
+using list = boost::container::list<T, polymorphic_allocator<T>>;
+
+#endif
+
+template<class T>
+struct list_of
+{
+ typedef boost::container::list
+ < T, polymorphic_allocator<T> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_VECTOR_HPP
diff --git a/boost/container/pmr/map.hpp b/boost/container/pmr/map.hpp
new file mode 100644
index 0000000000..fdada0e420
--- /dev/null
+++ b/boost/container/pmr/map.hpp
@@ -0,0 +1,63 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_MAP_HPP
+#define BOOST_CONTAINER_PMR_MAP_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/map.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using map = boost::container::map<Key, T, Compare, polymorphic_allocator<std::pair<const Key, T> >, Options>;
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using multimap = boost::container::multimap<Key, T, Compare, polymorphic_allocator<std::pair<const Key, T> >, Options>;
+
+#endif
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct map_of
+{
+ typedef boost::container::map<Key, T, Compare, polymorphic_allocator<std::pair<const Key, T> >, Options> type;
+};
+
+template <class Key
+ ,class T
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct multimap_of
+{
+ typedef boost::container::multimap<Key, T, Compare, polymorphic_allocator<std::pair<const Key, T> >, Options> type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_MAP_HPP
diff --git a/boost/container/pmr/memory_resource.hpp b/boost/container/pmr/memory_resource.hpp
new file mode 100644
index 0000000000..72338a7559
--- /dev/null
+++ b/boost/container/pmr/memory_resource.hpp
@@ -0,0 +1,101 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_MEMORY_RESOURCE_HPP
+#define BOOST_CONTAINER_PMR_MEMORY_RESOURCE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/move/detail/type_traits.hpp>
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! The memory_resource class is an abstract interface to an
+//! unbounded set of classes encapsulating memory resources.
+class memory_resource
+{
+ public:
+ // For exposition only
+ static BOOST_CONSTEXPR_OR_CONST std::size_t max_align =
+ boost::move_detail::alignment_of<boost::move_detail::max_align_t>::value;
+
+ //! <b>Effects</b>: Destroys
+ //! this memory_resource.
+ virtual ~memory_resource(){}
+
+ //! <b>Effects</b>: Equivalent to
+ //! `return do_allocate(bytes, alignment);`
+ void* allocate(std::size_t bytes, std::size_t alignment = max_align)
+ { return this->do_allocate(bytes, alignment); }
+
+ //! <b>Effects</b>: Equivalent to
+ //! `return do_deallocate(bytes, alignment);`
+ void deallocate(void* p, std::size_t bytes, std::size_t alignment = max_align)
+ { return this->do_deallocate(p, bytes, alignment); }
+
+ //! <b>Effects</b>: Equivalent to
+ //! `return return do_is_equal(other);`
+ bool is_equal(const memory_resource& other) const BOOST_NOEXCEPT
+ { return this->do_is_equal(other); }
+
+ //! <b>Returns</b>:
+ //! `&a == &b || a.is_equal(b)`.
+ friend bool operator==(const memory_resource& a, const memory_resource& b) BOOST_NOEXCEPT
+ { return &a == &b || a.is_equal(b); }
+
+ //! <b>Returns</b>:
+ //! !(a == b).
+ friend bool operator!=(const memory_resource& a, const memory_resource& b) BOOST_NOEXCEPT
+ { return !(a == b); }
+
+ protected:
+ //! <b>Requires</b>: Alignment shall be a power of two.
+ //!
+ //! <b>Returns</b>: A derived class shall implement this function to return a pointer
+ //! to allocated storage with a size of at least bytes. The returned storage is
+ //! aligned to the specified alignment, if such alignment is supported; otherwise
+ //! it is aligned to max_align.
+ //!
+ //! <b>Throws</b>: A derived class implementation shall throw an appropriate exception if
+ //! it is unable to allocate memory with the requested size and alignment.
+ virtual void* do_allocate(std::size_t bytes, std::size_t alignment) = 0;
+
+ //! <b>Requires</b>: p shall have been returned from a prior call to
+ //! `allocate(bytes, alignment)` on a memory resource equal to *this, and the storage
+ //! at p shall not yet have been deallocated.
+ //!
+ //! <b>Effects</b>: A derived class shall implement this function to dispose of allocated storage.
+ //!
+ //! <b>Throws</b>: Nothing.
+ virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) = 0;
+
+ //! <b>Returns</b>: A derived class shall implement this function to return true if memory
+ //! allocated from this can be deallocated from other and vice-versa; otherwise it shall
+ //! return false. <i>[Note: The most-derived type of other might not match the type of this.
+ //! For a derived class, D, a typical implementation of this function will compute
+ //! `dynamic_cast<const D*>(&other)` and go no further (i.e., return false)
+ //! if it returns nullptr. - end note]</i>.
+ virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT = 0;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_PMR_MEMORY_RESOURCE_HPP
diff --git a/boost/container/pmr/monotonic_buffer_resource.hpp b/boost/container/pmr/monotonic_buffer_resource.hpp
new file mode 100644
index 0000000000..dfffe87dc3
--- /dev/null
+++ b/boost/container/pmr/monotonic_buffer_resource.hpp
@@ -0,0 +1,180 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_MONOTONIC_BUFFER_RESOURCE_HPP
+#define BOOST_CONTAINER_PMR_MONOTONIC_BUFFER_RESOURCE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/auto_link.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/detail/block_slist.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! A monotonic_buffer_resource is a special-purpose memory resource intended for
+//! very fast memory allocations in situations where memory is used to build up a
+//! few objects and then is released all at once when the memory resource object
+//! is destroyed. It has the following qualities:
+//!
+//! - A call to deallocate has no effect, thus the amount of memory consumed
+//! increases monotonically until the resource is destroyed.
+//!
+//! - The program can supply an initial buffer, which the allocator uses to satisfy
+//! memory requests.
+//!
+//! - When the initial buffer (if any) is exhausted, it obtains additional buffers
+//! from an upstream memory resource supplied at construction. Each additional
+//! buffer is larger than the previous one, following a geometric progression.
+//!
+//! - It is intended for access from one thread of control at a time. Specifically,
+//! calls to allocate and deallocate do not synchronize with one another.
+//!
+//! - It owns the allocated memory and frees it on destruction, even if deallocate has
+//! not been called for some of the allocated blocks.
+class BOOST_CONTAINER_DECL monotonic_buffer_resource
+ : public memory_resource
+{
+ block_slist m_memory_blocks;
+ void* m_current_buffer;
+ std::size_t m_current_buffer_size;
+ std::size_t m_next_buffer_size;
+
+ /// @cond
+ void increase_next_buffer();
+ void increase_next_buffer_at_least_to(std::size_t minimum_size);
+ void *allocate_from_current(std::size_t aligner, std::size_t bytes);
+ /// @endcond
+
+ public:
+
+ //! The number of bytes that will be requested by the default in the first call
+ //! to the upstream allocator
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ static const std::size_t initial_next_buffer_size = 32u*sizeof(void*);
+
+ //! <b>Requires</b>: `upstream` shall be the address of a valid memory resource or `nullptr`
+ //!
+ //! <b>Effects</b>: If `upstream` is not nullptr, sets the internal resource to `upstream`,
+ //! to get_default_resource() otherwise.
+ //! Sets the internal `current_buffer` to `nullptr` and the internal `next_buffer_size` to an
+ //! implementation-defined size.
+ explicit monotonic_buffer_resource(memory_resource* upstream = 0) BOOST_NOEXCEPT;
+
+ //! <b>Requires</b>: `upstream` shall be the address of a valid memory resource or `nullptr`
+ //! and `initial_size` shall be greater than zero.
+ //!
+ //! <b>Effects</b>: If `upstream` is not nullptr, sets the internal resource to `upstream`,
+ //! to get_default_resource() otherwise. Sets the internal `current_buffer` to `nullptr` and
+ //! `next_buffer_size` to at least `initial_size`.
+ explicit monotonic_buffer_resource(std::size_t initial_size, memory_resource* upstream = 0) BOOST_NOEXCEPT;
+
+ //! <b>Requires</b>: `upstream` shall be the address of a valid memory resource or `nullptr`,
+ //! `buffer_size` shall be no larger than the number of bytes in buffer.
+ //!
+ //! <b>Effects</b>: If `upstream` is not nullptr, sets the internal resource to `upstream`,
+ //! to get_default_resource() otherwise. Sets the internal `current_buffer` to `buffer`,
+ //! and `next_buffer_size` to `buffer_size` (but not less than an implementation-defined size),
+ //! then increases `next_buffer_size` by an implementation-defined growth factor (which need not be integral).
+ monotonic_buffer_resource(void* buffer, std::size_t buffer_size, memory_resource* upstream = 0) BOOST_NOEXCEPT;
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ monotonic_buffer_resource(const monotonic_buffer_resource&) = delete;
+ monotonic_buffer_resource operator=(const monotonic_buffer_resource&) = delete;
+ #else
+ private:
+ monotonic_buffer_resource (const monotonic_buffer_resource&);
+ monotonic_buffer_resource operator=(const monotonic_buffer_resource&);
+ public:
+ #endif
+
+ //! <b>Effects</b>: Calls
+ //! `this->release()`.
+ virtual ~monotonic_buffer_resource();
+
+ //! <b>Effects</b>: `upstream_resource()->deallocate()` as necessary to release all allocated memory.
+ //! [Note: memory is released back to `upstream_resource()` even if some blocks that were allocated
+ //! from this have not been deallocated from this. - end note]
+ void release() BOOST_NOEXCEPT;
+
+ //! <b>Returns</b>: The value of
+ //! the internal resource.
+ memory_resource* upstream_resource() const BOOST_NOEXCEPT;
+
+ //! <b>Returns</b>:
+ //! The number of bytes of storage available for the specified alignment and
+ //! the number of bytes wasted due to the requested alignment.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t remaining_storage(std::size_t alignment, std::size_t &wasted_due_to_alignment) const BOOST_NOEXCEPT;
+
+ //! <b>Returns</b>:
+ //! The number of bytes of storage available for the specified alignment.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t remaining_storage(std::size_t alignment = 1u) const BOOST_NOEXCEPT;
+
+ //! <b>Returns</b>:
+ //! The number of bytes of storage available for the specified alignment.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ const void *current_buffer() const BOOST_NOEXCEPT;
+
+ //! <b>Returns</b>:
+ //! The number of bytes that will be requested for the next buffer once the
+ //! current one is exhausted.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t next_buffer_size() const BOOST_NOEXCEPT;
+
+ protected:
+
+ //! <b>Returns</b>: A pointer to allocated storage with a size of at least `bytes`. The size
+ //! and alignment of the allocated memory shall meet the requirements for a class derived
+ //! from `memory_resource`.
+ //!
+ //! <b>Effects</b>: If the unused space in the internal `current_buffer` can fit a block with the specified
+ //! bytes and alignment, then allocate the return block from the internal `current_buffer`; otherwise sets
+ //! the internal `current_buffer` to `upstream_resource()->allocate(n, m)`, where `n` is not less than
+ //! `max(bytes, next_buffer_size)` and `m` is not less than alignment, and increase
+ //! `next_buffer_size` by an implementation-defined growth factor (which need not be integral),
+ //! then allocate the return block from the newly-allocated internal `current_buffer`.
+ //!
+ //! <b>Throws</b>: Nothing unless `upstream_resource()->allocate()` throws.
+ virtual void* do_allocate(std::size_t bytes, std::size_t alignment);
+
+ //! <b>Effects</b>: None
+ //!
+ //! <b>Throws</b>: Nothing
+ //!
+ //! <b>Remarks</b>: Memory used by this resource increases monotonically until its destruction.
+ virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) BOOST_NOEXCEPT;
+
+ //! <b>Returns</b>:
+ //! `this == dynamic_cast<const monotonic_buffer_resource*>(&other)`.
+ virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_PMR_MONOTONIC_BUFFER_RESOURCE_HPP
diff --git a/boost/container/pmr/polymorphic_allocator.hpp b/boost/container/pmr/polymorphic_allocator.hpp
new file mode 100644
index 0000000000..d189b3a311
--- /dev/null
+++ b/boost/container/pmr/polymorphic_allocator.hpp
@@ -0,0 +1,166 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_POLYMORPHIC_ALLOCATOR_HPP
+#define BOOST_CONTAINER_PMR_POLYMORPHIC_ALLOCATOR_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/move/detail/type_traits.hpp>
+#include <boost/move/utility_core.hpp>
+#include <boost/container/detail/dispatch_uses_allocator.hpp>
+#include <boost/container/new_allocator.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/pmr/global_resource.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! A specialization of class template `polymorphic_allocator` conforms to the Allocator requirements.
+//! Constructed with different memory resources, different instances of the same specialization of
+//! `polymorphic_allocator` can exhibit entirely different allocation behavior. This runtime
+//! polymorphism allows objects that use polymorphic_allocator to behave as if they used different
+//! allocator types at run time even though they use the same static allocator type.
+template <class T>
+class polymorphic_allocator
+{
+ public:
+ typedef T value_type;
+
+ //! <b>Effects</b>: Sets m_resource to
+ //! `get_default_resource()`.
+ polymorphic_allocator() BOOST_NOEXCEPT
+ : m_resource(::boost::container::pmr::get_default_resource())
+ {}
+
+ //! <b>Requires</b>: r is non-null.
+ //!
+ //! <b>Effects</b>: Sets m_resource to r.
+ //!
+ //! <b>Throws</b>: Nothing
+ //!
+ //! <b>Notes</b>: This constructor provides an implicit conversion from memory_resource*.
+ //! Non-standard extension: if r is null m_resource is set to get_default_resource().
+ polymorphic_allocator(memory_resource* r)
+ : m_resource(r ? r : ::boost::container::pmr::get_default_resource())
+ {}
+
+ //! <b>Effects</b>: Sets m_resource to
+ //! other.resource().
+ polymorphic_allocator(const polymorphic_allocator& other)
+ : m_resource(other.m_resource)
+ {}
+
+ //! <b>Effects</b>: Sets m_resource to
+ //! other.resource().
+ template <class U>
+ polymorphic_allocator(const polymorphic_allocator<U>& other) BOOST_NOEXCEPT
+ : m_resource(other.resource())
+ {}
+
+ //! <b>Effects</b>: Sets m_resource to
+ //! other.resource().
+ polymorphic_allocator& operator=(const polymorphic_allocator& other)
+ { m_resource = other.m_resource; return *this; }
+
+ //! <b>Returns</b>: Equivalent to
+ //! `static_cast<T*>(m_resource->allocate(n * sizeof(T), alignof(T)))`.
+ T* allocate(size_t n)
+ { return static_cast<T*>(m_resource->allocate(n*sizeof(T), ::boost::move_detail::alignment_of<T>::value)); }
+
+ //! <b>Requires</b>: p was allocated from a memory resource, x, equal to *m_resource,
+ //! using `x.allocate(n * sizeof(T), alignof(T))`.
+ //!
+ //! <b>Effects</b>: Equivalent to m_resource->deallocate(p, n * sizeof(T), alignof(T)).
+ //!
+ //! <b>Throws</b>: Nothing.
+ void deallocate(T* p, size_t n)
+ { m_resource->deallocate(p, n*sizeof(T), ::boost::move_detail::alignment_of<T>::value); }
+
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ //! <b>Requires</b>: Uses-allocator construction of T with allocator
+ //! `this->resource()` and constructor arguments `std::forward<Args>(args)...`
+ //! is well-formed. [Note: uses-allocator construction is always well formed for
+ //! types that do not use allocators. - end note]
+ //!
+ //! <b>Effects</b>: Construct a T object at p by uses-allocator construction with allocator
+ //! `this->resource()` and constructor arguments `std::forward<Args>(args)...`.
+ //!
+ //! <b>Throws</b>: Nothing unless the constructor for T throws.
+ template < typename U, class ...Args>
+ void construct(U* p, BOOST_FWD_REF(Args)...args)
+ {
+ new_allocator<U> na;
+ container_detail::dispatch_uses_allocator
+ (na, this->resource(), p, ::boost::forward<Args>(args)...);
+ }
+
+ #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+ //Disable this overload if the first argument is pair as some compilers have
+ //overload selection problems when the first parameter is a pair.
+ #define BOOST_CONTAINER_PMR_POLYMORPHIC_ALLOCATOR_CONSTRUCT_CODE(N) \
+ template < typename U BOOST_MOVE_I##N BOOST_MOVE_CLASSQ##N >\
+ void construct(U* p BOOST_MOVE_I##N BOOST_MOVE_UREFQ##N)\
+ {\
+ new_allocator<U> na;\
+ container_detail::dispatch_uses_allocator\
+ (na, this->resource(), p BOOST_MOVE_I##N BOOST_MOVE_FWDQ##N);\
+ }\
+ //
+ BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_PMR_POLYMORPHIC_ALLOCATOR_CONSTRUCT_CODE)
+ #undef BOOST_CONTAINER_PMR_POLYMORPHIC_ALLOCATOR_CONSTRUCT_CODE
+
+ #endif //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+ //! <b>Effects</b>:
+ //! p->~U().
+ template <class U>
+ void destroy(U* p)
+ { (void)p; p->~U(); }
+
+ //! <b>Returns</b>: Equivalent to
+ //! `polymorphic_allocator()`.
+ polymorphic_allocator select_on_container_copy_construction() const
+ { return polymorphic_allocator(); }
+
+ //! <b>Returns</b>:
+ //! m_resource.
+ memory_resource* resource() const
+ { return m_resource; }
+
+ private:
+ memory_resource* m_resource;
+};
+
+//! <b>Returns</b>:
+//! `*a.resource() == *b.resource()`.
+template <class T1, class T2>
+bool operator==(const polymorphic_allocator<T1>& a, const polymorphic_allocator<T2>& b) BOOST_NOEXCEPT
+{ return *a.resource() == *b.resource(); }
+
+
+//! <b>Returns</b>:
+//! `! (a == b)`.
+template <class T1, class T2>
+bool operator!=(const polymorphic_allocator<T1>& a, const polymorphic_allocator<T2>& b) BOOST_NOEXCEPT
+{ return *a.resource() != *b.resource(); }
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_POLYMORPHIC_ALLOCATOR_HPP
diff --git a/boost/container/pmr/pool_options.hpp b/boost/container/pmr/pool_options.hpp
new file mode 100644
index 0000000000..e9f72896b1
--- /dev/null
+++ b/boost/container/pmr/pool_options.hpp
@@ -0,0 +1,52 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_POOL_OPTIONS_HPP
+#define BOOST_CONTAINER_PMR_POOL_OPTIONS_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! The members of pool_options comprise a set of constructor options for pool resources.
+//! The effect of each option on the pool resource behavior is described below:
+//!
+//! - `std::size_t max_blocks_per_chunk`: The maximum number of blocks that will be allocated
+//! at once from the upstream memory resource to replenish a pool. If the value of
+//! `max_blocks_per_chunk` is zero or is greater than an implementation-defined limit,
+//! that limit is used instead. The implementation may choose to use a smaller value
+//! than is specified in this field and may use different values for different pools.
+//!
+//! - `std::size_t largest_required_pool_block`: The largest allocation size that is required
+//! to be fulfilled using the pooling mechanism. Attempts to allocate a single block
+//! larger than this threshold will be allocated directly from the upstream memory
+//! resource. If largest_required_pool_block is zero or is greater than an
+//! implementation-defined limit, that limit is used instead. The implementation may
+//! choose a pass-through threshold larger than specified in this field.
+struct pool_options
+{
+ pool_options()
+ : max_blocks_per_chunk(0u), largest_required_pool_block(0u)
+ {}
+ std::size_t max_blocks_per_chunk;
+ std::size_t largest_required_pool_block;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_POOL_OPTIONS_HPP
diff --git a/boost/container/pmr/resource_adaptor.hpp b/boost/container/pmr/resource_adaptor.hpp
new file mode 100644
index 0000000000..deece632e8
--- /dev/null
+++ b/boost/container/pmr/resource_adaptor.hpp
@@ -0,0 +1,193 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_RESOURCE_ADAPTOR_HPP
+#define BOOST_CONTAINER_PMR_RESOURCE_ADAPTOR_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/allocator_traits.hpp>
+#include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/move/utility_core.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! An instance of resource_adaptor<Allocator> is an adaptor that wraps a memory_resource interface
+//! around Allocator. In order that resource_adaptor<X<T>> and resource_adaptor<X<U>> are the same
+//! type for any allocator template X and types T and U, resource_adaptor<Allocator> is rendered as
+//! an alias to this class template such that Allocator is rebound to a char value type in every
+//! specialization of the class template. The requirements on this class template are defined below.
+//! In addition to the Allocator requirements, the parameter to resource_adaptor shall meet
+//! the following additional requirements:
+//!
+//! - `typename allocator_traits<Allocator>:: pointer` shall be identical to
+//! `typename allocator_traits<Allocator>:: value_type*`.
+//!
+//! - `typename allocator_traits<Allocator>:: const_pointer` shall be identical to
+//! `typename allocator_traits<Allocator>:: value_type const*`.
+//!
+//! - `typename allocator_traits<Allocator>:: void_pointer` shall be identical to `void*`.
+//!
+//! - `typename allocator_traits<Allocator>:: const_void_pointer` shall be identical to `void const*`.
+template <class Allocator>
+class resource_adaptor_imp
+ : public memory_resource
+ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+ , private ::boost::intrusive::detail::ebo_functor_holder<Allocator>
+ #endif
+{
+ #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
+ Allocator m_alloc;
+ #else
+ BOOST_COPYABLE_AND_MOVABLE(resource_adaptor_imp)
+ typedef ::boost::intrusive::detail::ebo_functor_holder<Allocator> ebo_alloc_t;
+ void static_assert_if_not_char_allocator() const
+ {
+ //This class can only be used with allocators type char
+ BOOST_STATIC_ASSERT((container_detail::is_same<typename Allocator::value_type, char>::value));
+ }
+ #endif
+
+ public:
+ typedef Allocator allocator_type;
+
+ //! <b>Effects</b>: Default constructs
+ //! m_alloc.
+ resource_adaptor_imp()
+ { this->static_assert_if_not_char_allocator(); }
+
+ //! <b>Effects</b>: Copy constructs
+ //! m_alloc.
+ resource_adaptor_imp(const resource_adaptor_imp &other)
+ : ebo_alloc_t(other.ebo_alloc_t::get())
+ {}
+
+ //! <b>Effects</b>: Move constructs
+ //! m_alloc.
+ resource_adaptor_imp(BOOST_RV_REF(resource_adaptor_imp) other)
+ : ebo_alloc_t(::boost::move(other.get()))
+ {}
+
+ //! <b>Effects</b>: Initializes m_alloc with
+ //! a2.
+ explicit resource_adaptor_imp(const Allocator& a2)
+ : ebo_alloc_t(a2)
+ { this->static_assert_if_not_char_allocator(); }
+
+ //! <b>Effects</b>: Initializes m_alloc with
+ //! a2.
+ explicit resource_adaptor_imp(BOOST_RV_REF(Allocator) a2)
+ : ebo_alloc_t(::boost::move(a2))
+ { this->static_assert_if_not_char_allocator(); }
+
+ //! <b>Effects</b>: Copy assigns
+ //! m_alloc.
+ resource_adaptor_imp& operator=(BOOST_COPY_ASSIGN_REF(resource_adaptor_imp) other)
+ { this->ebo_alloc_t::get() = other.ebo_alloc_t::get(); return *this; }
+
+ //! <b>Effects</b>: Move assigns
+ //! m_alloc.
+ resource_adaptor_imp& operator=(BOOST_RV_REF(resource_adaptor_imp) other)
+ { this->ebo_alloc_t::get() = ::boost::move(other.ebo_alloc_t::get()); return *this; }
+
+ //! <b>Effects</b>: Returns m_alloc.
+ allocator_type &get_allocator()
+ { return this->ebo_alloc_t::get(); }
+
+ //! <b>Effects</b>: Returns m_alloc.
+ const allocator_type &get_allocator() const
+ { return this->ebo_alloc_t::get(); }
+
+ protected:
+ //! <b>Returns</b>: Allocated memory obtained by calling m_alloc.allocate. The size and alignment
+ //! of the allocated memory shall meet the requirements for a class derived from memory_resource.
+ virtual void* do_allocate(size_t bytes, size_t alignment)
+ { (void)alignment; return this->ebo_alloc_t::get().allocate(bytes); }
+
+ //! <b>Requires</b>: p was previously allocated using A.allocate, where A == m_alloc, and not
+ //! subsequently deallocated.
+ //!
+ //! <b>Effects</b>: Returns memory to the allocator using m_alloc.deallocate().
+ virtual void do_deallocate(void* p, size_t bytes, size_t alignment)
+ { (void)alignment; this->ebo_alloc_t::get().deallocate((char*)p, bytes); }
+
+ //! Let p be dynamic_cast<const resource_adaptor_imp*>(&other).
+ //!
+ //! <b>Returns</b>: false if p is null, otherwise the value of m_alloc == p->m_alloc.
+ virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT
+ {
+ const resource_adaptor_imp* p = dynamic_cast<const resource_adaptor_imp*>(&other);
+ return p && p->ebo_alloc_t::get() == this->ebo_alloc_t::get();
+ }
+};
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+
+//! `resource_adaptor<Allocator>` is rendered as an alias to resource_adaptor_imp class template
+//! such that Allocator is rebound to a char value type.
+template <class Allocator>
+using resource_adaptor = resource_adaptor_imp
+ <typename allocator_traits<Allocator>::template rebind_alloc<char> >;
+
+#else
+
+template <class Allocator>
+class resource_adaptor
+ : public resource_adaptor_imp
+ <typename allocator_traits<Allocator>::template portable_rebind_alloc<char>::type>
+{
+ typedef resource_adaptor_imp
+ <typename allocator_traits<Allocator>::template portable_rebind_alloc<char>::type> base_t;
+
+ BOOST_COPYABLE_AND_MOVABLE(resource_adaptor)
+
+ public:
+ resource_adaptor()
+ : base_t()
+ {}
+
+ resource_adaptor(const resource_adaptor &other)
+ : base_t(other)
+ {}
+
+ resource_adaptor(BOOST_RV_REF(resource_adaptor) other)
+ : base_t(BOOST_MOVE_BASE(base_t, other))
+ {}
+
+ explicit resource_adaptor(const Allocator& a2)
+ : base_t(a2)
+ {}
+
+ explicit resource_adaptor(BOOST_RV_REF(Allocator) a2)
+ : base_t(BOOST_MOVE_BASE(base_t, a2))
+ {}
+
+ resource_adaptor& operator=(BOOST_COPY_ASSIGN_REF(resource_adaptor) other)
+ { return static_cast<resource_adaptor&>(this->base_t::operator=(other)); }
+
+ resource_adaptor& operator=(BOOST_RV_REF(resource_adaptor) other)
+ { return static_cast<resource_adaptor&>(this->base_t::operator=(BOOST_MOVE_BASE(base_t, other))); }
+
+ //get_allocator and protected functions are properly inherited
+};
+
+#endif
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_RESOURCE_ADAPTOR_HPP
diff --git a/boost/container/pmr/set.hpp b/boost/container/pmr/set.hpp
new file mode 100644
index 0000000000..6f2c3bfb29
--- /dev/null
+++ b/boost/container/pmr/set.hpp
@@ -0,0 +1,59 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_SET_HPP
+#define BOOST_CONTAINER_PMR_SET_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/set.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using set = boost::container::set<Key, Compare, polymorphic_allocator<Key>, Options>;
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+using multiset = boost::container::multiset<Key, Compare, polymorphic_allocator<Key>, Options>;
+
+#endif
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct set_of
+{
+ typedef boost::container::set<Key, Compare, polymorphic_allocator<Key>, Options> type;
+};
+
+template <class Key
+ ,class Compare = std::less<Key>
+ ,class Options = tree_assoc_defaults >
+struct multiset_of
+{
+ typedef boost::container::multiset<Key, Compare, polymorphic_allocator<Key>, Options> type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_SET_HPP
diff --git a/boost/container/pmr/slist.hpp b/boost/container/pmr/slist.hpp
new file mode 100644
index 0000000000..4ee76c62ef
--- /dev/null
+++ b/boost/container/pmr/slist.hpp
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_SLIST_HPP
+#define BOOST_CONTAINER_PMR_SLIST_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/slist.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class T>
+using slist = boost::container::slist<T, polymorphic_allocator<T>>;
+
+#endif
+
+template<class T>
+struct slist_of
+{
+ typedef boost::container::slist
+ < T, polymorphic_allocator<T> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_VECTOR_HPP
diff --git a/boost/container/pmr/small_vector.hpp b/boost/container/pmr/small_vector.hpp
new file mode 100644
index 0000000000..a79d5a075e
--- /dev/null
+++ b/boost/container/pmr/small_vector.hpp
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_SMALL_VECTOR_HPP
+#define BOOST_CONTAINER_PMR_SMALL_VECTOR_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/small_vector.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class T, std::size_t N>
+using small_vector = boost::container::small_vector<T, N, polymorphic_allocator<T>>;
+
+#endif
+
+template<class T, std::size_t N>
+struct small_vector_of
+{
+ typedef boost::container::small_vector
+ < T, N, polymorphic_allocator<T> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_SMALL_VECTOR_HPP
diff --git a/boost/container/pmr/stable_vector.hpp b/boost/container/pmr/stable_vector.hpp
new file mode 100644
index 0000000000..07a2059d87
--- /dev/null
+++ b/boost/container/pmr/stable_vector.hpp
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_STABLE_VECTOR_HPP
+#define BOOST_CONTAINER_PMR_STABLE_VECTOR_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/stable_vector.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class T>
+using stable_vector = boost::container::stable_vector<T, polymorphic_allocator<T>>;
+
+#endif
+
+template<class T>
+struct stable_vector_of
+{
+ typedef boost::container::stable_vector
+ < T, polymorphic_allocator<T> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_STABLE_VECTOR_HPP
diff --git a/boost/container/pmr/string.hpp b/boost/container/pmr/string.hpp
new file mode 100644
index 0000000000..2e879e3054
--- /dev/null
+++ b/boost/container/pmr/string.hpp
@@ -0,0 +1,48 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_STRING_HPP
+#define BOOST_CONTAINER_PMR_STRING_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/string.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class CharT, class Traits = std::char_traits<CharT> >
+using basic_string =
+ boost::container::basic_string<CharT, Traits, polymorphic_allocator<CharT> >;
+
+#endif
+
+template <class CharT, class Traits = std::char_traits<CharT> >
+struct basic_string_of
+{
+ typedef boost::container::basic_string
+ <CharT, Traits, polymorphic_allocator<CharT> > type;
+};
+
+typedef basic_string_of<char>::type string;
+
+typedef basic_string_of<wchar_t>::type wstring;
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_STRING_HPP
diff --git a/boost/container/pmr/synchronized_pool_resource.hpp b/boost/container/pmr/synchronized_pool_resource.hpp
new file mode 100644
index 0000000000..e4d4dd54a1
--- /dev/null
+++ b/boost/container/pmr/synchronized_pool_resource.hpp
@@ -0,0 +1,138 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_SYNCHRONIZED_POOL_RESOURCE_HPP
+#define BOOST_CONTAINER_PMR_SYNCHRONIZED_POOL_RESOURCE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/auto_link.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/detail/pool_resource.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! A synchronized_pool_resource is a general-purpose memory resources having
+//! the following qualities:
+//!
+//! - Each resource owns the allocated memory, and frees it on destruction,
+//! even if deallocate has not been called for some of the allocated blocks.
+//!
+//! - A pool resource consists of a collection of pools, serving
+//! requests for different block sizes. Each individual pool manages a
+//! collection of chunks that are in turn divided into blocks of uniform size,
+//! returned via calls to do_allocate. Each call to do_allocate(size, alignment)
+//! is dispatched to the pool serving the smallest blocks accommodating at
+//! least size bytes.
+//!
+//! - When a particular pool is exhausted, allocating a block from that pool
+//! results in the allocation of an additional chunk of memory from the upstream
+//! allocator (supplied at construction), thus replenishing the pool. With
+//! each successive replenishment, the chunk size obtained increases
+//! geometrically. [ Note: By allocating memory in chunks, the pooling strategy
+//! increases the chance that consecutive allocations will be close together
+//! in memory. - end note ]
+//!
+//! - Allocation requests that exceed the largest block size of any pool are
+//! fulfilled directly from the upstream allocator.
+//!
+//! - A pool_options struct may be passed to the pool resource constructors to
+//! tune the largest block size and the maximum chunk size.
+//!
+//! A synchronized_pool_resource may be accessed from multiple threads without
+//! external synchronization and may have thread-specific pools to reduce
+//! synchronization costs.
+class BOOST_CONTAINER_DECL synchronized_pool_resource
+ : public memory_resource
+{
+ pool_resource m_pool_resource;
+ void *m_opaque_sync;
+
+ public:
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::unsynchronized_pool_resource(const pool_options&,memory_resource*)
+ synchronized_pool_resource(const pool_options& opts, memory_resource* upstream) BOOST_NOEXCEPT;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::unsynchronized_pool_resource()
+ synchronized_pool_resource() BOOST_NOEXCEPT;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::unsynchronized_pool_resource(memory_resource*)
+ explicit synchronized_pool_resource(memory_resource* upstream) BOOST_NOEXCEPT;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::unsynchronized_pool_resource(const pool_options&)
+ explicit synchronized_pool_resource(const pool_options& opts) BOOST_NOEXCEPT;
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ synchronized_pool_resource(const synchronized_pool_resource&) = delete;
+ synchronized_pool_resource operator=(const synchronized_pool_resource&) = delete;
+ #else
+ private:
+ synchronized_pool_resource (const synchronized_pool_resource&);
+ synchronized_pool_resource operator=(const synchronized_pool_resource&);
+ public:
+ #endif
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::~unsynchronized_pool_resource()
+ virtual ~synchronized_pool_resource();
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::release()
+ void release();
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::upstream_resource()const
+ memory_resource* upstream_resource() const;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::options()const
+ pool_options options() const;
+
+ protected:
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::do_allocate()
+ virtual void* do_allocate(std::size_t bytes, std::size_t alignment);
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::do_deallocate(void*,std::size_t,std::size_t)
+ virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment);
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::do_is_equal(const memory_resource&)const
+ virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT;
+
+ //Non-standard observers
+ public:
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::pool_count()
+ std::size_t pool_count() const;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::pool_index(std::size_t)const
+ std::size_t pool_index(std::size_t bytes) const;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::pool_next_blocks_per_chunk(std::size_t)const
+ std::size_t pool_next_blocks_per_chunk(std::size_t pool_idx) const;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::pool_block(std::size_t)const
+ std::size_t pool_block(std::size_t pool_idx) const;
+
+ //! @copydoc ::boost::container::pmr::unsynchronized_pool_resource::pool_cached_blocks(std::size_t)const
+ std::size_t pool_cached_blocks(std::size_t pool_idx) const;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_PMR_SYNCHRONIZED_POOL_RESOURCE_HPP
diff --git a/boost/container/pmr/unsynchronized_pool_resource.hpp b/boost/container/pmr/unsynchronized_pool_resource.hpp
new file mode 100644
index 0000000000..21d30b1ebc
--- /dev/null
+++ b/boost/container/pmr/unsynchronized_pool_resource.hpp
@@ -0,0 +1,194 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_UNSYNCHRONIZED_POOL_RESOURCE_HPP
+#define BOOST_CONTAINER_PMR_UNSYNCHRONIZED_POOL_RESOURCE_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/detail/config_begin.hpp>
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/auto_link.hpp>
+#include <boost/container/pmr/memory_resource.hpp>
+#include <boost/container/detail/pool_resource.hpp>
+
+#include <cstddef>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+//! A unsynchronized_pool_resource is a general-purpose memory resources having
+//! the following qualities:
+//!
+//! - Each resource owns the allocated memory, and frees it on destruction,
+//! even if deallocate has not been called for some of the allocated blocks.
+//!
+//! - A pool resource consists of a collection of pools, serving
+//! requests for different block sizes. Each individual pool manages a
+//! collection of chunks that are in turn divided into blocks of uniform size,
+//! returned via calls to do_allocate. Each call to do_allocate(size, alignment)
+//! is dispatched to the pool serving the smallest blocks accommodating at
+//! least size bytes.
+//!
+//! - When a particular pool is exhausted, allocating a block from that pool
+//! results in the allocation of an additional chunk of memory from the upstream
+//! allocator (supplied at construction), thus replenishing the pool. With
+//! each successive replenishment, the chunk size obtained increases
+//! geometrically. [ Note: By allocating memory in chunks, the pooling strategy
+//! increases the chance that consecutive allocations will be close together
+//! in memory. - end note ]
+//!
+//! - Allocation requests that exceed the largest block size of any pool are
+//! fulfilled directly from the upstream allocator.
+//!
+//! - A pool_options struct may be passed to the pool resource constructors to
+//! tune the largest block size and the maximum chunk size.
+//!
+//! An unsynchronized_pool_resource class may not be accessed from multiple threads
+//! simultaneously and thus avoids the cost of synchronization entirely in
+//! single-threaded applications.
+class BOOST_CONTAINER_DECL unsynchronized_pool_resource
+ : public memory_resource
+{
+ pool_resource m_resource;
+
+ public:
+
+ //! <b>Requires</b>: `upstream` is the address of a valid memory resource.
+ //!
+ //! <b>Effects</b>: Constructs a pool resource object that will obtain memory
+ //! from upstream whenever the pool resource is unable to satisfy a memory
+ //! request from its own internal data structures. The resulting object will hold
+ //! a copy of upstream, but will not own the resource to which upstream points.
+ //! [ Note: The intention is that calls to upstream->allocate() will be
+ //! substantially fewer than calls to this->allocate() in most cases. - end note
+ //! The behavior of the pooling mechanism is tuned according to the value of
+ //! the opts argument.
+ //!
+ //! <b>Throws</b>: Nothing unless upstream->allocate() throws. It is unspecified if
+ //! or under what conditions this constructor calls upstream->allocate().
+ unsynchronized_pool_resource(const pool_options& opts, memory_resource* upstream) BOOST_NOEXCEPT;
+
+ //! <b>Effects</b>: Same as
+ //! `unsynchronized_pool_resource(pool_options(), get_default_resource())`.
+ unsynchronized_pool_resource() BOOST_NOEXCEPT;
+
+ //! <b>Effects</b>: Same as
+ //! `unsynchronized_pool_resource(pool_options(), upstream)`.
+ explicit unsynchronized_pool_resource(memory_resource* upstream) BOOST_NOEXCEPT;
+
+ //! <b>Effects</b>: Same as
+ //! `unsynchronized_pool_resource(opts, get_default_resource())`.
+ explicit unsynchronized_pool_resource(const pool_options& opts) BOOST_NOEXCEPT;
+
+ #if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ unsynchronized_pool_resource(const unsynchronized_pool_resource&) = delete;
+ unsynchronized_pool_resource operator=(const unsynchronized_pool_resource&) = delete;
+ #else
+ private:
+ unsynchronized_pool_resource (const unsynchronized_pool_resource&);
+ unsynchronized_pool_resource operator=(const unsynchronized_pool_resource&);
+ public:
+ #endif
+
+ //! <b>Effects</b>: Calls
+ //! `this->release()`.
+ virtual ~unsynchronized_pool_resource();
+
+ //! <b>Effects</b>: Calls Calls `upstream_resource()->deallocate()` as necessary
+ //! to release all allocated memory. [ Note: memory is released back to
+ //! `upstream_resource()` even if deallocate has not been called for some
+ //! of the allocated blocks. - end note ]
+ void release();
+
+ //! <b>Returns</b>: The value of the upstream argument provided to the
+ //! constructor of this object.
+ memory_resource* upstream_resource() const;
+
+ //! <b>Returns</b>: The options that control the pooling behavior of this resource.
+ //! The values in the returned struct may differ from those supplied to the pool
+ //! resource constructor in that values of zero will be replaced with
+ //! implementation-defined defaults and sizes may be rounded to unspecified granularity.
+ pool_options options() const;
+
+ protected:
+
+ //! <b>Returns</b>: A pointer to allocated storage with a size of at least `bytes`.
+ //! The size and alignment of the allocated memory shall meet the requirements for
+ //! a class derived from `memory_resource`.
+ //!
+ //! <b>Effects</b>: If the pool selected for a block of size bytes is unable to
+ //! satisfy the memory request from its own internal data structures, it will call
+ //! `upstream_resource()->allocate()` to obtain more memory. If `bytes` is larger
+ //! than that which the largest pool can handle, then memory will be allocated
+ //! using `upstream_resource()->allocate()`.
+ //!
+ //! <b>Throws</b>: Nothing unless `upstream_resource()->allocate()` throws.
+ virtual void* do_allocate(std::size_t bytes, std::size_t alignment);
+
+ //! <b>Effects</b>: Return the memory at p to the pool. It is unspecified if or under
+ //! what circumstances this operation will result in a call to
+ //! `upstream_resource()->deallocate()`.
+ //!
+ //! <b>Throws</b>: Nothing.
+ virtual void do_deallocate(void* p, std::size_t bytes, std::size_t alignment);
+
+ //! <b>Returns</b>:
+ //! `this == dynamic_cast<const unsynchronized_pool_resource*>(&other)`.
+ virtual bool do_is_equal(const memory_resource& other) const BOOST_NOEXCEPT;
+
+ //Non-standard observers
+ public:
+ //! <b>Returns</b>: The number of pools that will be used in the pool resource.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_count() const;
+
+ //! <b>Returns</b>: The index of the pool that will be used to serve the allocation of `bytes`.
+ //! Returns `pool_count()` if `bytes` is bigger
+ //! than `options().largest_required_pool_block` (no pool will be used to serve this).
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_index(std::size_t bytes) const;
+
+ //! <b>Requires</b>: `pool_idx < pool_index()`
+ //!
+ //! <b>Returns</b>: The number blocks that will be allocated in the next chunk
+ //! from the pool specified by `pool_idx`.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_next_blocks_per_chunk(std::size_t pool_idx) const;
+
+ //! <b>Requires</b>: `pool_idx < pool_index()`
+ //!
+ //! <b>Returns</b>: The number of bytes of the block that the specified `pool_idx` pool manages.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_block(std::size_t pool_idx) const;
+
+ //! <b>Requires</b>: `pool_idx < pool_index()`
+ //!
+ //! <b>Returns</b>: The number of blocks that the specified `pool_idx` pool has cached
+ //! and will be served without calling the upstream_allocator.
+ //!
+ //! <b>Note</b>: Non-standard extension.
+ std::size_t pool_cached_blocks(std::size_t pool_idx) const;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#include <boost/container/detail/config_end.hpp>
+
+#endif //BOOST_CONTAINER_PMR_UNSYNCHRONIZED_POOL_RESOURCE_HPP
diff --git a/boost/container/pmr/vector.hpp b/boost/container/pmr/vector.hpp
new file mode 100644
index 0000000000..cef6ae5b94
--- /dev/null
+++ b/boost/container/pmr/vector.hpp
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_PMR_VECTOR_HPP
+#define BOOST_CONTAINER_PMR_VECTOR_HPP
+
+#if defined (_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/container/vector.hpp>
+#include <boost/container/pmr/polymorphic_allocator.hpp>
+
+namespace boost {
+namespace container {
+namespace pmr {
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template <class T>
+using vector = boost::container::vector<T, polymorphic_allocator<T>>;
+
+#endif
+
+template<class T>
+struct vector_of
+{
+ typedef boost::container::vector
+ < T, polymorphic_allocator<T> > type;
+};
+
+} //namespace pmr {
+} //namespace container {
+} //namespace boost {
+
+#endif //BOOST_CONTAINER_PMR_VECTOR_HPP
diff --git a/boost/container/scoped_allocator.hpp b/boost/container/scoped_allocator.hpp
index 0724f948fb..6a041a653d 100644
--- a/boost/container/scoped_allocator.hpp
+++ b/boost/container/scoped_allocator.hpp
@@ -18,7 +18,7 @@
#define BOOST_CONTAINER_ALLOCATOR_SCOPED_ALLOCATOR_HPP
#if defined (_MSC_VER)
-# pragma once
+# pragma once
#endif
#include <boost/container/detail/config_begin.hpp>
@@ -26,8 +26,8 @@
#include <boost/container/allocator_traits.hpp>
#include <boost/container/scoped_allocator_fwd.hpp>
+#include <boost/container/detail/dispatch_uses_allocator.hpp>
-#include <boost/container/detail/addressof.hpp>
#include <boost/container/detail/mpl.hpp>
#include <boost/container/detail/pair.hpp>
#include <boost/container/detail/type_traits.hpp>
@@ -42,143 +42,6 @@
namespace boost { namespace container {
-//! <b>Remark</b>: if a specialization constructible_with_allocator_suffix<X>::value is true, indicates that T may be constructed
-//! with an allocator as its last constructor argument. Ideally, all constructors of T (including the
-//! copy and move constructors) should have a variant that accepts a final argument of
-//! allocator_type.
-//!
-//! <b>Requires</b>: if a specialization constructible_with_allocator_suffix<X>::value is true, T must have a nested type,
-//! allocator_type and at least one constructor for which allocator_type is the last
-//! parameter. If not all constructors of T can be called with a final allocator_type argument,
-//! and if T is used in a context where a container must call such a constructor, then the program is
-//! ill-formed.
-//!
-//! <code>
-//! template <class T, class Allocator = allocator<T> >
-//! class Z {
-//! public:
-//! typedef Allocator allocator_type;
-//!
-//! // Default constructor with optional allocator suffix
-//! Z(const allocator_type& a = allocator_type());
-//!
-//! // Copy constructor and allocator-extended copy constructor
-//! Z(const Z& zz);
-//! Z(const Z& zz, const allocator_type& a);
-//! };
-//!
-//! // Specialize trait for class template Z
-//! template <class T, class Allocator = allocator<T> >
-//! struct constructible_with_allocator_suffix<Z<T,Allocator> >
-//! { static const bool value = true; };
-//! </code>
-//!
-//! <b>Note</b>: This trait is a workaround inspired by "N2554: The Scoped A Model (Rev 2)"
-//! (Pablo Halpern, 2008-02-29) to backport the scoped allocator model to C++03, as
-//! in C++03 there is no mechanism to detect if a type can be constructed from arbitrary arguments.
-//! Applications aiming portability with several compilers should always define this trait.
-//!
-//! In conforming C++11 compilers or compilers supporting SFINAE expressions
-//! (when BOOST_NO_SFINAE_EXPR is NOT defined), this trait is ignored and C++11 rules will be used
-//! to detect if a type should be constructed with suffix or prefix allocator arguments.
-template <class T>
-struct constructible_with_allocator_suffix
-{ static const bool value = false; };
-
-//! <b>Remark</b>: if a specialization constructible_with_allocator_prefix<X>::value is true, indicates that T may be constructed
-//! with allocator_arg and T::allocator_type as its first two constructor arguments.
-//! Ideally, all constructors of T (including the copy and move constructors) should have a variant
-//! that accepts these two initial arguments.
-//!
-//! <b>Requires</b>: specialization constructible_with_allocator_prefix<X>::value is true, T must have a nested type,
-//! allocator_type and at least one constructor for which allocator_arg_t is the first
-//! parameter and allocator_type is the second parameter. If not all constructors of T can be
-//! called with these initial arguments, and if T is used in a context where a container must call such
-//! a constructor, then the program is ill-formed.
-//!
-//! <code>
-//! template <class T, class Allocator = allocator<T> >
-//! class Y {
-//! public:
-//! typedef Allocator allocator_type;
-//!
-//! // Default constructor with and allocator-extended default constructor
-//! Y();
-//! Y(allocator_arg_t, const allocator_type& a);
-//!
-//! // Copy constructor and allocator-extended copy constructor
-//! Y(const Y& yy);
-//! Y(allocator_arg_t, const allocator_type& a, const Y& yy);
-//!
-//! // Variadic constructor and allocator-extended variadic constructor
-//! template<class ...Args> Y(Args&& args...);
-//! template<class ...Args>
-//! Y(allocator_arg_t, const allocator_type& a, BOOST_FWD_REF(Args)... args);
-//! };
-//!
-//! // Specialize trait for class template Y
-//! template <class T, class Allocator = allocator<T> >
-//! struct constructible_with_allocator_prefix<Y<T,Allocator> >
-//! { static const bool value = true; };
-//!
-//! </code>
-//!
-//! <b>Note</b>: This trait is a workaround inspired by "N2554: The Scoped Allocator Model (Rev 2)"
-//! (Pablo Halpern, 2008-02-29) to backport the scoped allocator model to C++03, as
-//! in C++03 there is no mechanism to detect if a type can be constructed from arbitrary arguments.
-//! Applications aiming portability with several compilers should always define this trait.
-//!
-//! In conforming C++11 compilers or compilers supporting SFINAE expressions
-//! (when BOOST_NO_SFINAE_EXPR is NOT defined), this trait is ignored and C++11 rules will be used
-//! to detect if a type should be constructed with suffix or prefix allocator arguments.
-template <class T>
-struct constructible_with_allocator_prefix
-{ static const bool value = false; };
-
-#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
-
-namespace container_detail {
-
-template<typename T, typename Allocator>
-struct uses_allocator_imp
-{
- // Use SFINAE (Substitution Failure Is Not An Error) to detect the
- // presence of an 'allocator_type' nested type convertilble from Allocator.
- private:
- typedef char yes_type;
- struct no_type{ char dummy[2]; };
-
- // Match this function if TypeT::allocator_type exists and is
- // implicitly convertible from Allocator
- template <class U>
- static yes_type test(typename U::allocator_type);
-
- // Match this function if TypeT::allocator_type does not exist or is
- // not convertible from Allocator.
- template <typename U>
- static no_type test(...);
- static Allocator alloc; // Declared but not defined
-
- public:
- static const bool value = sizeof(test<T>(alloc)) == sizeof(yes_type);
-};
-
-} //namespace container_detail {
-
-#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
-
-//! <b>Remark</b>: Automatically detects if T has a nested allocator_type that is convertible from
-//! Allocator. Meets the BinaryTypeTrait requirements ([meta.rqmts] 20.4.1). A program may
-//! specialize this type to define uses_allocator<X>::value as true for a T of user-defined type if T does not
-//! have a nested allocator_type but is nonetheless constructible using the specified Allocator.
-//!
-//! <b>Result</b>: uses_allocator<T, Allocator>::value== true if Convertible<Allocator,T::allocator_type>,
-//! false otherwise.
-template <typename T, typename Allocator>
-struct uses_allocator
- : container_detail::uses_allocator_imp<T, Allocator>
-{};
-
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
namespace container_detail {
@@ -249,198 +112,17 @@ struct outermost_allocator
{};
template <typename Allocator>
-typename container_detail::outermost_allocator_imp<Allocator>::type &
+typename outermost_allocator<Allocator>::type &
get_outermost_allocator(Allocator &a)
-{ return container_detail::outermost_allocator_imp<Allocator>::get(a); }
+{ return outermost_allocator<Allocator>::get(a); }
template <typename Allocator>
-const typename container_detail::outermost_allocator_imp<Allocator>::type &
+const typename outermost_allocator<Allocator>::type &
get_outermost_allocator(const Allocator &a)
-{ return container_detail::outermost_allocator_imp<Allocator>::get(a); }
+{ return outermost_allocator<Allocator>::get(a); }
namespace container_detail {
-// Check if we can detect is_convertible using advanced SFINAE expressions
-#if !defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
- //! Code inspired by Mathias Gaunard's is_convertible.cpp found in the Boost mailing list
- //! http://boost.2283326.n4.nabble.com/type-traits-is-constructible-when-decltype-is-supported-td3575452.html
- //! Thanks Mathias!
-
- //With variadic templates, we need a single class to implement the trait
- template<class T, class ...Args>
- struct is_constructible
- {
- typedef char yes_type;
- struct no_type
- { char padding[2]; };
-
- template<std::size_t N>
- struct dummy;
-
- template<class X>
- static decltype(X(boost::move_detail::declval<Args>()...), true_type()) test(int);
-
- template<class X>
- static no_type test(...);
-
- static const bool value = sizeof(test<T>(0)) == sizeof(yes_type);
- };
-
- template <class T, class InnerAlloc, class ...Args>
- struct is_constructible_with_allocator_prefix
- : is_constructible<T, allocator_arg_t, InnerAlloc, Args...>
- {};
-
-#else // #if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
- //Without advanced SFINAE expressions, we can't use is_constructible
- //so backup to constructible_with_allocator_xxx
-
- #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
- template <class T, class InnerAlloc, class ...Args>
- struct is_constructible_with_allocator_prefix
- : constructible_with_allocator_prefix<T>
- {};
-
- template <class T, class InnerAlloc, class ...Args>
- struct is_constructible_with_allocator_suffix
- : constructible_with_allocator_suffix<T>
- {};
-
- #else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
- template <class T, class InnerAlloc, BOOST_MOVE_CLASSDFLT9>
- struct is_constructible_with_allocator_prefix
- : constructible_with_allocator_prefix<T>
- {};
-
- template <class T, class InnerAlloc, BOOST_MOVE_CLASSDFLT9>
- struct is_constructible_with_allocator_suffix
- : constructible_with_allocator_suffix<T>
- {};
-
- #endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-#endif // #if !defined(BOOST_NO_SFINAE_EXPR)
-
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-// allocator_arg_t
-template < typename OutermostAlloc
- , typename InnerAlloc
- , typename T
- , class ...Args
- >
-inline void dispatch_allocator_prefix_suffix
- ( true_type use_alloc_prefix, OutermostAlloc& outermost_alloc
- , InnerAlloc& inner_alloc, T* p, BOOST_FWD_REF(Args) ...args)
-{
- (void)use_alloc_prefix;
- allocator_traits<OutermostAlloc>::construct
- ( outermost_alloc, p, allocator_arg, inner_alloc, ::boost::forward<Args>(args)...);
-}
-
-// allocator suffix
-template < typename OutermostAlloc
- , typename InnerAlloc
- , typename T
- , class ...Args
- >
-inline void dispatch_allocator_prefix_suffix
- ( false_type use_alloc_prefix, OutermostAlloc& outermost_alloc
- , InnerAlloc &inner_alloc, T* p, BOOST_FWD_REF(Args)...args)
-{
- (void)use_alloc_prefix;
- allocator_traits<OutermostAlloc>::construct
- (outermost_alloc, p, ::boost::forward<Args>(args)..., inner_alloc);
-}
-
-template < typename OutermostAlloc
- , typename InnerAlloc
- , typename T
- , class ...Args
- >
-inline void dispatch_uses_allocator
- ( true_type uses_allocator, OutermostAlloc& outermost_alloc
- , InnerAlloc& inner_alloc, T* p, BOOST_FWD_REF(Args)...args)
-{
- (void)uses_allocator;
- //BOOST_STATIC_ASSERT((is_constructible_with_allocator_prefix<T, InnerAlloc, Args...>::value ||
- // is_constructible_with_allocator_suffix<T, InnerAlloc, Args...>::value ));
- dispatch_allocator_prefix_suffix
- ( bool_< is_constructible_with_allocator_prefix<T, InnerAlloc, Args...>::value>()
- , outermost_alloc, inner_alloc, p, ::boost::forward<Args>(args)...);
-}
-
-template < typename OutermostAlloc
- , typename InnerAlloc
- , typename T
- , class ...Args
- >
-inline void dispatch_uses_allocator
- ( false_type uses_allocator, OutermostAlloc & outermost_alloc
- , InnerAlloc & inner_alloc
- ,T* p, BOOST_FWD_REF(Args)...args)
-{
- (void)uses_allocator; (void)inner_alloc;
- allocator_traits<OutermostAlloc>::construct
- (outermost_alloc, p, ::boost::forward<Args>(args)...);
-}
-
-#else //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
-#define BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE(N) \
-template < typename OutermostAlloc, typename InnerAlloc, typename T\
- BOOST_MOVE_I##N BOOST_MOVE_CLASS##N > \
-inline void dispatch_allocator_prefix_suffix\
- (true_type use_alloc_prefix, OutermostAlloc& outermost_alloc,\
- InnerAlloc& inner_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
-{\
- (void)use_alloc_prefix,\
- allocator_traits<OutermostAlloc>::construct\
- (outermost_alloc, p, allocator_arg, inner_alloc BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
-}\
-\
-template < typename OutermostAlloc, typename InnerAlloc, typename T\
- BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
-inline void dispatch_allocator_prefix_suffix\
- (false_type use_alloc_prefix, OutermostAlloc& outermost_alloc,\
- InnerAlloc& inner_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
-{\
- (void)use_alloc_prefix;\
- allocator_traits<OutermostAlloc>::construct\
- (outermost_alloc, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N, inner_alloc);\
-}\
-\
-template < typename OutermostAlloc, typename InnerAlloc, typename T\
- BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
-inline void dispatch_uses_allocator\
- (true_type uses_allocator, OutermostAlloc& outermost_alloc,\
- InnerAlloc& inner_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
-{\
- (void)uses_allocator;\
- dispatch_allocator_prefix_suffix\
- ( bool_< is_constructible_with_allocator_prefix<T, InnerAlloc BOOST_MOVE_I##N BOOST_MOVE_TARG##N>::value >()\
- , outermost_alloc, inner_alloc, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
-}\
-\
-template < typename OutermostAlloc, typename InnerAlloc, typename T\
- BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
-inline void dispatch_uses_allocator\
- (false_type uses_allocator, OutermostAlloc &outermost_alloc,\
- InnerAlloc &inner_alloc, T* p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
-{\
- (void)uses_allocator; (void)inner_alloc;\
- allocator_traits<OutermostAlloc>::construct(outermost_alloc, p BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
-}\
-//
-BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE)
-#undef BOOST_CONTAINER_SCOPED_ALLOCATOR_DISPATCH_USES_ALLOCATOR_CODE
-
-#endif //#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
template <typename OuterAlloc, class ...InnerAllocs>
@@ -923,24 +605,24 @@ class scoped_allocator_adaptor
typedef typename outer_traits_type::void_pointer void_pointer;
typedef typename outer_traits_type::const_void_pointer const_void_pointer;
//! Type: A type with a constant boolean <code>value</code> == true if
- //!`allocator_traits<Allocator>::propagate_on_container_copy_assignment::value` is
+ //!`allocator_traits<Allocator>:: propagate_on_container_copy_assignment::value` is
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
typedef typename base_type::
propagate_on_container_copy_assignment propagate_on_container_copy_assignment;
//! Type: A type with a constant boolean <code>value</code> == true if
- //!`allocator_traits<Allocator>::propagate_on_container_move_assignment::value` is
+ //!`allocator_traits<Allocator>:: propagate_on_container_move_assignment::value` is
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
typedef typename base_type::
propagate_on_container_move_assignment propagate_on_container_move_assignment;
//! Type: A type with a constant boolean <code>value</code> == true if
- //! `allocator_traits<Allocator>::propagate_on_container_swap::value` is
+ //! `allocator_traits<Allocator>:: propagate_on_container_swap::value` is
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
typedef typename base_type::
propagate_on_container_swap propagate_on_container_swap;
//! Type: A type with a constant boolean <code>value</code> == true if
- //!`allocator_traits<Allocator>::is_always_equal::value` is
+ //!`allocator_traits<Allocator>:: is_always_equal::value` is
//! true for all <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
typedef typename base_type::
is_always_equal is_always_equal;
@@ -1053,12 +735,12 @@ class scoped_allocator_adaptor
#endif //BOOST_CONTAINER_DOXYGEN_INVOKED
//! <b>Returns</b>:
- //! <code>allocator_traits<OuterAlloc>::max_size(outer_allocator())</code>.
+ //! <code>allocator_traits<OuterAlloc>:: max_size(outer_allocator())</code>.
size_type max_size() const BOOST_NOEXCEPT_OR_NOTHROW
{ return outer_traits_type::max_size(this->outer_allocator()); }
//! <b>Effects</b>:
- //! calls <code>OUTERMOST_ALLOC_TRAITS(*this)::destroy(OUTERMOST(*this), p)</code>.
+ //! calls <code>OUTERMOST_ALLOC_TRAITS(*this):: destroy(OUTERMOST(*this), p)</code>.
template <class T>
void destroy(T* p) BOOST_NOEXCEPT_OR_NOTHROW
{
@@ -1099,12 +781,12 @@ class scoped_allocator_adaptor
//! <b>Effects</b>:
//! 1) If <code>uses_allocator<T, inner_allocator_type>::value</code> is false calls
- //! <code>OUTERMOST_ALLOC_TRAITS(*this)::construct
- //! (OUTERMOST(*this), p, std::forward<Args>(args)...)</code>.
+ //! <code>OUTERMOST_ALLOC_TRAITS(*this)::
+ //! construct(OUTERMOST(*this), p, std::forward<Args>(args)...)</code>.
//!
//! 2) Otherwise, if <code>uses_allocator<T, inner_allocator_type>::value</code> is true and
- //! <code>is_constructible<T, allocator_arg_t, inner_allocator_type, Args...>::value</code> is true, calls
- //! <code>OUTERMOST_ALLOC_TRAITS(*this)::construct(OUTERMOST(*this), p, allocator_arg,
+ //! <code>is_constructible<T, allocator_arg_t, inner_allocator_type, Args...>:: value</code> is true, calls
+ //! <code>OUTERMOST_ALLOC_TRAITS(*this):: construct(OUTERMOST(*this), p, allocator_arg,
//! inner_allocator(), std::forward<Args>(args)...)</code>.
//!
//! [<b>Note</b>: In compilers without advanced decltype SFINAE support, <code>is_constructible</code> can't
@@ -1112,13 +794,13 @@ class scoped_allocator_adaptor
//! constructible_with_allocator_prefix<T>::value. -end note]
//!
//! 3) Otherwise, if uses_allocator<T, inner_allocator_type>::value is true and
- //! <code>is_constructible<T, Args..., inner_allocator_type>::value</code> is true, calls
- //! <code>OUTERMOST_ALLOC_TRAITS(*this)::construct(OUTERMOST(*this), p,
+ //! <code>is_constructible<T, Args..., inner_allocator_type>:: value</code> is true, calls
+ //! <code>OUTERMOST_ALLOC_TRAITS(*this):: construct(OUTERMOST(*this), p,
//! std::forward<Args>(args)..., inner_allocator())</code>.
//!
//! [<b>Note</b>: In compilers without advanced decltype SFINAE support, <code>is_constructible</code> can't be
//! implemented so that condition will be replaced by
- //! <code>constructible_with_allocator_suffix<T>::value</code>. -end note]
+ //! <code>constructible_with_allocator_suffix<T>:: value</code>. -end note]
//!
//! 4) Otherwise, the program is ill-formed.
//!
@@ -1126,18 +808,11 @@ class scoped_allocator_adaptor
//! to true but the specific constructor does not take an allocator. This definition prevents a silent
//! failure to pass an inner allocator to a contained element. -end note]
template < typename T, class ...Args>
- #if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
- void
- #else
- typename container_detail::enable_if<container_detail::is_not_pair<T> >::type
- #endif
- construct(T* p, BOOST_FWD_REF(Args)...args)
+ void construct(T* p, BOOST_FWD_REF(Args)...args)
{
container_detail::dispatch_uses_allocator
- ( container_detail::bool_<uses_allocator<T, inner_allocator_type>::value>()
- , get_outermost_allocator(this->outer_allocator())
- , this->inner_allocator()
- , p, ::boost::forward<Args>(args)...);
+ ( (get_outermost_allocator)(this->outer_allocator())
+ , this->inner_allocator(), p, ::boost::forward<Args>(args)...);
}
#else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
@@ -1146,12 +821,10 @@ class scoped_allocator_adaptor
//overload selection problems when the first parameter is a pair.
#define BOOST_CONTAINER_SCOPED_ALLOCATOR_CONSTRUCT_CODE(N) \
template < typename T BOOST_MOVE_I##N BOOST_MOVE_CLASSQ##N >\
- typename container_detail::enable_if< container_detail::is_not_pair<T> >::type\
- construct(T* p BOOST_MOVE_I##N BOOST_MOVE_UREFQ##N)\
+ void construct(T* p BOOST_MOVE_I##N BOOST_MOVE_UREFQ##N)\
{\
container_detail::dispatch_uses_allocator\
- ( container_detail::bool_<uses_allocator<T, inner_allocator_type>::value>()\
- , get_outermost_allocator(this->outer_allocator())\
+ ( (get_outermost_allocator)(this->outer_allocator())\
, this->inner_allocator(), p BOOST_MOVE_I##N BOOST_MOVE_FWDQ##N);\
}\
//
@@ -1160,81 +833,7 @@ class scoped_allocator_adaptor
#endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
- template <class T1, class T2>
- void construct(std::pair<T1,T2>* p)
- { this->construct_pair(p); }
-
- template <class T1, class T2>
- void construct(container_detail::pair<T1,T2>* p)
- { this->construct_pair(p); }
-
- template <class T1, class T2, class U, class V>
- void construct(std::pair<T1, T2>* p, BOOST_FWD_REF(U) x, BOOST_FWD_REF(V) y)
- { this->construct_pair(p, ::boost::forward<U>(x), ::boost::forward<V>(y)); }
-
- template <class T1, class T2, class U, class V>
- void construct(container_detail::pair<T1, T2>* p, BOOST_FWD_REF(U) x, BOOST_FWD_REF(V) y)
- { this->construct_pair(p, ::boost::forward<U>(x), ::boost::forward<V>(y)); }
-
- template <class T1, class T2, class U, class V>
- void construct(std::pair<T1, T2>* p, const std::pair<U, V>& x)
- { this->construct_pair(p, x); }
-
- template <class T1, class T2, class U, class V>
- void construct( container_detail::pair<T1, T2>* p
- , const container_detail::pair<U, V>& x)
- { this->construct_pair(p, x); }
-
- template <class T1, class T2, class U, class V>
- void construct( std::pair<T1, T2>* p
- , BOOST_RV_REF_BEG std::pair<U, V> BOOST_RV_REF_END x)
- { this->construct_pair(p, ::boost::move(x)); }
-
- template <class T1, class T2, class U, class V>
- void construct( container_detail::pair<T1, T2>* p
- , BOOST_RV_REF_BEG container_detail::pair<U, V> BOOST_RV_REF_END x)
- { this->construct_pair(p, ::boost::move(x)); }
-
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
- private:
- template <class Pair>
- void construct_pair(Pair* p)
- {
- this->construct(container_detail::addressof(p->first));
- BOOST_TRY{
- this->construct(container_detail::addressof(p->second));
- }
- BOOST_CATCH(...){
- this->destroy(container_detail::addressof(p->first));
- BOOST_RETHROW
- }
- BOOST_CATCH_END
- }
-
- template <class Pair, class U, class V>
- void construct_pair(Pair* p, BOOST_FWD_REF(U) x, BOOST_FWD_REF(V) y)
- {
- this->construct(container_detail::addressof(p->first), ::boost::forward<U>(x));
- BOOST_TRY{
- this->construct(container_detail::addressof(p->second), ::boost::forward<V>(y));
- }
- BOOST_CATCH(...){
- this->destroy(container_detail::addressof(p->first));
- BOOST_RETHROW
- }
- BOOST_CATCH_END
- }
-
- template <class Pair, class Pair2>
- void construct_pair(Pair* p, const Pair2& pr)
- { this->construct_pair(p, pr.first, pr.second); }
-
- template <class Pair, class Pair2>
- void construct_pair(Pair* p, BOOST_RV_REF(Pair2) pr)
- { this->construct_pair(p, ::boost::move(pr.first), ::boost::move(pr.second)); }
-
- //template <class T1, class T2, class... Args1, class... Args2>
- //void construct(pair<T1, T2>* p, piecewise_construct_t, tuple<Args1...> x, tuple<Args2...> y);
public:
//Internal function
@@ -1246,6 +845,8 @@ class scoped_allocator_adaptor
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
};
+/// @cond
+
template<bool ZeroInner>
struct scoped_allocator_operator_equal
{
@@ -1278,6 +879,7 @@ struct scoped_allocator_operator_equal<true>
{ return true; }
};
+/// @endcond
template <typename OuterA1, typename OuterA2, BOOST_CONTAINER_SCOPEDALLOC_ALLINNERCLASS>
inline bool operator==(const scoped_allocator_adaptor<OuterA1, BOOST_CONTAINER_SCOPEDALLOC_ALLINNER>& a
diff --git a/boost/container/scoped_allocator_fwd.hpp b/boost/container/scoped_allocator_fwd.hpp
index 003ed9f7f7..cddf7fad15 100644
--- a/boost/container/scoped_allocator_fwd.hpp
+++ b/boost/container/scoped_allocator_fwd.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2011-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -13,7 +13,6 @@
//! \file
//! This header file forward declares boost::container::scoped_allocator_adaptor
-//! and defines the following types:
#ifndef BOOST_CONFIG_HPP
# include <boost/config.hpp>
@@ -26,6 +25,7 @@
#include <boost/container/detail/config_begin.hpp>
#include <boost/container/detail/workaround.hpp>
#include <boost/container/detail/std_fwd.hpp>
+#include <boost/container/uses_allocator_fwd.hpp>
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
#include <boost/move/detail/fwd_macros.hpp>
@@ -59,38 +59,11 @@ namespace boost { namespace container {
#endif
- template <int Dummy = 0>
- struct std_allocator_arg_holder
- {
- static ::std::allocator_arg_t *dummy;
- };
-
- template <int Dummy>
- ::std::allocator_arg_t *std_allocator_arg_holder<Dummy>::dummy;
#else //BOOST_CONTAINER_DOXYGEN_INVOKED
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
-//! The allocator_arg_t struct is an empty structure type used as a unique type to
-//! disambiguate constructor and function overloading. Specifically, several types
-//! have constructors with allocator_arg_t as the first argument, immediately followed
-//! by an argument of a type that satisfies Allocator requirements
-typedef const std::allocator_arg_t & allocator_arg_t;
-
-//! A instance of type allocator_arg_t
-//!
-static allocator_arg_t allocator_arg = BOOST_CONTAINER_DOC1ST(unspecified, *std_allocator_arg_holder<>::dummy);
-
-template <class T>
-struct constructible_with_allocator_suffix;
-
-template <class T>
-struct constructible_with_allocator_prefix;
-
-template <typename T, typename Allocator>
-struct uses_allocator;
-
}} // namespace boost { namespace container {
#include <boost/container/detail/config_end.hpp>
diff --git a/boost/container/set.hpp b/boost/container/set.hpp
index 79fa1aec66..ca05cac1f7 100644
--- a/boost/container/set.hpp
+++ b/boost/container/set.hpp
@@ -253,6 +253,9 @@ class set
{ return static_cast<set&>(this->base_t::operator=(BOOST_MOVE_BASE(base_t, x))); }
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
+ //! <b>Effects</b>: Copy all elements from il to *this.
+ //!
+ //! <b>Complexity</b>: Linear in il.size().
set& operator=(std::initializer_list<value_type> il)
{
this->clear();
@@ -851,17 +854,17 @@ class multiset
: base_t(static_cast<const base_t&>(x))
{}
- //! @copydoc ::boost::container::set(set &&)
+ //! @copydoc ::boost::container::set::set(set &&)
multiset(BOOST_RV_REF(multiset) x)
: base_t(BOOST_MOVE_BASE(base_t, x))
{}
- //! @copydoc ::boost::container::set(const set &, const allocator_type &)
+ //! @copydoc ::boost::container::set::set(const set &, const allocator_type &)
multiset(const multiset& x, const allocator_type &a)
: base_t(static_cast<const base_t&>(x), a)
{}
- //! @copydoc ::boost::container::set(set &&, const allocator_type &)
+ //! @copydoc ::boost::container::set::set(set &&, const allocator_type &)
multiset(BOOST_RV_REF(multiset) x, const allocator_type &a)
: base_t(BOOST_MOVE_BASE(base_t, x), a)
{}
diff --git a/boost/container/slist.hpp b/boost/container/slist.hpp
index 2b53df132f..8e7aa20030 100644
--- a/boost/container/slist.hpp
+++ b/boost/container/slist.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2004-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2004-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -684,7 +684,10 @@ class slist
//!
//! <b>Complexity</b>: Constant.
reference front()
- { return *this->begin(); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->begin();
+ }
//! <b>Requires</b>: !empty()
//!
@@ -695,7 +698,10 @@ class slist
//!
//! <b>Complexity</b>: Constant.
const_reference front() const
- { return *this->begin(); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->begin();
+ }
//////////////////////////////////////////////
//
@@ -897,7 +903,10 @@ class slist
//!
//! <b>Complexity</b>: Amortized constant time.
void pop_front()
- { this->icont().pop_front_and_dispose(Destroyer(this->node_alloc())); }
+ {
+ BOOST_ASSERT(!this->empty());
+ this->icont().pop_front_and_dispose(Destroyer(this->node_alloc()));
+ }
//! <b>Effects</b>: Erases the element after the element pointed by prev_p
//! of the list.
@@ -939,7 +948,12 @@ class slist
void swap(slist& x)
BOOST_NOEXCEPT_IF( allocator_traits_type::propagate_on_container_swap::value
|| allocator_traits_type::is_always_equal::value)
- { AllocHolder::swap(x); }
+ {
+ BOOST_ASSERT(allocator_traits_type::propagate_on_container_swap::value ||
+ allocator_traits_type::is_always_equal::value ||
+ this->get_stored_allocator() == x.get_stored_allocator());
+ AllocHolder::swap(x);
+ }
//! <b>Effects</b>: Erases all the elements of the list.
//!
@@ -1652,22 +1666,15 @@ struct has_trivial_destructor_after_move<boost::container::slist<T, Allocator> >
namespace container {
-#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
-
}} //namespace boost{ namespace container {
+#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
// Specialization of insert_iterator so that insertions will be constant
// time rather than linear time.
-#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
-
-#if defined(__clang__) && defined(_LIBCPP_VERSION)
- #define BOOST_CONTAINER_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wc++11-extensions"
-#endif
-
-BOOST_CONTAINER_STD_NS_BEG
+#include <boost/move/detail/std_ns_begin.hpp>
+BOOST_CONTAINER_DOC1ST(namespace std {, BOOST_MOVE_STD_NS_BEG)
template <class T, class Allocator>
class insert_iterator<boost::container::slist<T, Allocator> >
@@ -1700,14 +1707,8 @@ class insert_iterator<boost::container::slist<T, Allocator> >
insert_iterator<Container>& operator++(int){ return *this; }
};
-BOOST_CONTAINER_STD_NS_END
-
-#ifdef BOOST_CONTAINER_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic pop
- #undef BOOST_CONTAINER_CLANG_INLINE_STD_NS
-#endif //BOOST_CONTAINER_CLANG_INLINE_STD_NS
-
-#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+BOOST_CONTAINER_DOC1ST( }, BOOST_MOVE_STD_NS_END)
+#include <boost/move/detail/std_ns_end.hpp>
#include <boost/container/detail/config_end.hpp>
diff --git a/boost/container/small_vector.hpp b/boost/container/small_vector.hpp
index a9f7522205..4dab684764 100644
--- a/boost/container/small_vector.hpp
+++ b/boost/container/small_vector.hpp
@@ -117,9 +117,9 @@ class small_vector_allocator
typedef typename allocator_traits<Allocator>::propagate_on_container_copy_assignment propagate_on_container_copy_assignment;
typedef typename allocator_traits<Allocator>::propagate_on_container_move_assignment propagate_on_container_move_assignment;
typedef typename allocator_traits<Allocator>::propagate_on_container_swap propagate_on_container_swap;
- //! An integral constant with member `::value == false`
+ //! An integral constant with member `value == false`
typedef BOOST_CONTAINER_IMPDEF(container_detail::bool_<false>) is_always_equal;
- //! An integral constant with member `::value == true`
+ //! An integral constant with member `value == true`
typedef BOOST_CONTAINER_IMPDEF(container_detail::bool_<true>) is_partially_propagable;
BOOST_CONTAINER_DOCIGN(typedef container_detail::version_type<small_vector_allocator BOOST_CONTAINER_I 1> version;)
@@ -289,20 +289,25 @@ class small_vector_allocator
//! This class consists of common code from all small_vector<T, N> types that don't depend on the
//! "N" template parameter. This class is non-copyable and non-destructible, so this class tipically
//! used as reference argument to functions that read or write small vectors. Since `small_vector<T, N>`
-//! derives from `small_vector_base<T>`, the conversion to `small_vector_base` is implicit:
-//! <code>
+//! derives from `small_vector_base<T>`, the conversion to `small_vector_base` is implicit
+//! <pre>
//!
//! //Clients can pass any small_vector<Foo, N>.
//! void read_any_small_vector_of_foo(const small_vector_base<Foo> &in_parameter);
+//!
//! void modify_any_small_vector_of_foo(small_vector_base<Foo> &out_parameter);
-//!
+//!
//! void some_function()
//! {
+//!
//! small_vector<Foo, 8> myvector;
+//!
//! read_any_small_vector_of_foo(myvector); // Reads myvector
+//!
//! modify_any_small_vector_of_foo(myvector); // Modifies myvector
+//!
//! }
-//! </code>
+//! </pre>
//!
//! All `boost::container:vector` member functions are inherited. See `vector` documentation for details.
//!
diff --git a/boost/container/stable_vector.hpp b/boost/container/stable_vector.hpp
index 6aca69bde6..a332dbc66c 100644
--- a/boost/container/stable_vector.hpp
+++ b/boost/container/stable_vector.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2008-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2008-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -1196,7 +1196,10 @@ class stable_vector
//!
//! <b>Complexity</b>: Constant.
reference front() BOOST_NOEXCEPT_OR_NOTHROW
- { return static_cast<node_reference>(*this->index.front()).value; }
+ {
+ BOOST_ASSERT(!this->empty());
+ return static_cast<node_reference>(*this->index.front()).value;
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1207,7 +1210,10 @@ class stable_vector
//!
//! <b>Complexity</b>: Constant.
const_reference front() const BOOST_NOEXCEPT_OR_NOTHROW
- { return static_cast<const_node_reference>(*this->index.front()).value; }
+ {
+ BOOST_ASSERT(!this->empty());
+ return static_cast<const_node_reference>(*this->index.front()).value;
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1218,7 +1224,10 @@ class stable_vector
//!
//! <b>Complexity</b>: Constant.
reference back() BOOST_NOEXCEPT_OR_NOTHROW
- { return static_cast<node_reference>(*this->index[this->size()-1u]).value; }
+ {
+ BOOST_ASSERT(!this->empty());
+ return static_cast<node_reference>(*this->index[this->size()-1u]).value;
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1229,7 +1238,10 @@ class stable_vector
//!
//! <b>Complexity</b>: Constant.
const_reference back() const BOOST_NOEXCEPT_OR_NOTHROW
- { return static_cast<const_node_reference>(*this->index[this->size()-1u]).value; }
+ {
+ BOOST_ASSERT(!this->empty());
+ return static_cast<const_node_reference>(*this->index[this->size()-1u]).value;
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1241,7 +1253,7 @@ class stable_vector
//! <b>Complexity</b>: Constant.
reference operator[](size_type n) BOOST_NOEXCEPT_OR_NOTHROW
{
- BOOST_ASSERT(n < this->size());
+ BOOST_ASSERT(this->size() > n);
return static_cast<node_reference>(*this->index[n]).value;
}
@@ -1255,7 +1267,7 @@ class stable_vector
//! <b>Complexity</b>: Constant.
const_reference operator[](size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
{
- BOOST_ASSERT(n < this->size());
+ BOOST_ASSERT(this->size() > n);
return static_cast<const_node_reference>(*this->index[n]).value;
}
@@ -1386,6 +1398,7 @@ class stable_vector
template<class ...Args>
iterator emplace(const_iterator p, Args && ...args)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
size_type pos_n = p - cbegin();
typedef emplace_functor<Args...> EmplaceFunctor;
typedef emplace_iterator<value_type, EmplaceFunctor, difference_type> EmplaceIterator;
@@ -1410,6 +1423,7 @@ class stable_vector
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
iterator emplace(const_iterator p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
{\
+ BOOST_ASSERT(this->priv_in_range_or_end(p));\
typedef emplace_functor##N\
BOOST_MOVE_LT##N BOOST_MOVE_TARG##N BOOST_MOVE_GT##N EmplaceFunctor;\
typedef emplace_iterator<value_type, EmplaceFunctor, difference_type> EmplaceIterator;\
@@ -1483,6 +1497,7 @@ class stable_vector
//! <b>Complexity</b>: Linear to n.
iterator insert(const_iterator p, size_type n, const T& t)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
STABLE_VECTOR_CHECK_INVARIANT;
typedef constant_iterator<value_type, difference_type> cvalue_iterator;
return this->insert(p, cvalue_iterator(t, n), cvalue_iterator());
@@ -1499,6 +1514,7 @@ class stable_vector
//! <b>Complexity</b>: Linear to distance [il.begin(), il.end()).
iterator insert(const_iterator p, std::initializer_list<value_type> il)
{
+ //Position checks done by insert()
STABLE_VECTOR_CHECK_INVARIANT;
return insert(p, il.begin(), il.end());
}
@@ -1515,17 +1531,19 @@ class stable_vector
//!
//! <b>Complexity</b>: Linear to distance [first, last).
template <class InputIterator>
- #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
- typename container_detail::disable_if_or
- < iterator
- , container_detail::is_convertible<InputIterator, size_type>
- , container_detail::is_not_input_iterator<InputIterator>
- >::type
- #else
- iterator
- #endif
- insert(const_iterator p, InputIterator first, InputIterator last)
- {
+ iterator insert(const_iterator p, InputIterator first, InputIterator last
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
+ //Put this as argument instead of the return type as old GCC's like 3.4
+ //detect this and the next disable_if_or as overloads
+ , typename container_detail::disable_if_or
+ < void
+ , container_detail::is_convertible<InputIterator, size_type>
+ , container_detail::is_not_input_iterator<InputIterator>
+ >::type* = 0
+ #endif
+ )
+ {
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
STABLE_VECTOR_CHECK_INVARIANT;
const size_type pos_n = p - this->cbegin();
for(; first != last; ++first){
@@ -1543,6 +1561,7 @@ class stable_vector
>::type
insert(const_iterator p, FwdIt first, FwdIt last)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
const size_type num_new = static_cast<size_type>(boost::container::iterator_distance(first, last));
const size_type idx = static_cast<size_type>(p - this->cbegin());
if(num_new){
@@ -1556,12 +1575,12 @@ class stable_vector
//Prepare rollback
insert_rollback rollback(*this, it_past_newly_constructed, it_past_new);
while(first != last){
- const node_ptr p = this->priv_get_from_pool();
- BOOST_ASSERT(!!p);
+ const node_ptr n = this->priv_get_from_pool();
+ BOOST_ASSERT(!!n);
//Put it in the index so rollback can return it in pool if construct_in_place throws
- *it_past_newly_constructed = p;
+ *it_past_newly_constructed = n;
//Constructs and fixes up pointers This can throw
- this->priv_build_node_from_it(p, it_past_newly_constructed, first);
+ this->priv_build_node_from_it(n, it_past_newly_constructed, first);
++first;
++it_past_newly_constructed;
}
@@ -1581,7 +1600,10 @@ class stable_vector
//!
//! <b>Complexity</b>: Constant time.
void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
- { this->erase(--this->cend()); }
+ {
+ BOOST_ASSERT(!this->empty());
+ this->erase(--this->cend());
+ }
//! <b>Effects</b>: Erases the element at p.
//!
@@ -1591,6 +1613,7 @@ class stable_vector
//! last element. Constant if p is the last element.
iterator erase(const_iterator p) BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(this->priv_in_range(p));
STABLE_VECTOR_CHECK_INVARIANT;
const size_type d = p - this->cbegin();
index_iterator it = this->index.begin() + d;
@@ -1608,6 +1631,8 @@ class stable_vector
//! plus linear to the elements between p and the last element.
iterator erase(const_iterator first, const_iterator last) BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(first == last ||
+ (first < last && this->priv_in_range(first) && this->priv_in_range_or_end(last)));
STABLE_VECTOR_CHECK_INVARIANT;
const const_iterator cbeg(this->cbegin());
const size_type d1 = static_cast<size_type>(first - cbeg),
@@ -1641,6 +1666,9 @@ class stable_vector
BOOST_NOEXCEPT_IF( allocator_traits_type::propagate_on_container_swap::value
|| allocator_traits_type::is_always_equal::value)
{
+ BOOST_ASSERT(allocator_traits_type::propagate_on_container_swap::value ||
+ allocator_traits_type::is_always_equal::value ||
+ this->get_stored_allocator() == x.get_stored_allocator());
STABLE_VECTOR_CHECK_INVARIANT;
container_detail::bool_<allocator_traits_type::propagate_on_container_swap::value> flag;
container_detail::swap_alloc(this->priv_node_alloc(), x.priv_node_alloc(), flag);
@@ -1702,6 +1730,16 @@ class stable_vector
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
private:
+ bool priv_in_range(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos < this->end());
+ }
+
+ bool priv_in_range_or_end(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos <= this->end());
+ }
+
size_type priv_index_of(node_ptr p) const
{
//Check range
@@ -1807,12 +1845,14 @@ class stable_vector
iterator priv_insert(const_iterator p, const value_type &t)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
typedef constant_iterator<value_type, difference_type> cvalue_iterator;
return this->insert(p, cvalue_iterator(t, 1), cvalue_iterator());
}
iterator priv_insert(const_iterator p, BOOST_RV_REF(T) x)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
typedef repeat_iterator<T, difference_type> repeat_it;
typedef boost::move_iterator<repeat_it> repeat_move_it;
//Just call more general insert(p, size, value) and return iterator
diff --git a/boost/container/static_vector.hpp b/boost/container/static_vector.hpp
index c36832dfa3..69540dcc7b 100644
--- a/boost/container/static_vector.hpp
+++ b/boost/container/static_vector.hpp
@@ -48,7 +48,7 @@ class static_storage_allocator
{}
static_storage_allocator & operator=(const static_storage_allocator &) BOOST_NOEXCEPT_OR_NOTHROW
- {}
+ { return *this; }
T* internal_storage() const BOOST_NOEXCEPT_OR_NOTHROW
{ return const_cast<T*>(static_cast<const T*>(static_cast<const void*>(&storage))); }
@@ -645,7 +645,7 @@ public:
//!
//! @brief Assigns a range <tt>[il.begin(), il.end())</tt> of Values to this container.
//!
- //! @param first std::initializer_list with values used to construct new content of this container.
+ //! @param il std::initializer_list with values used to construct new content of this container.
//!
//! @par Throws
//! If Value's copy constructor or copy assignment throws,
@@ -809,7 +809,7 @@ public:
//!
//! @brief Returns the index of the element pointed by p.
//!
- //! @param i The element's index.
+ //! @param p An iterator to the element.
//!
//! @return The index of the element pointed by p.
//!
@@ -824,7 +824,7 @@ public:
//!
//! @brief Returns the index of the element pointed by p.
//!
- //! @param i The index of the element pointed by p.
+ //! @param p A const_iterator to the element.
//!
//! @return a const_iterator to the i-th element.
//!
diff --git a/boost/container/string.hpp b/boost/container/string.hpp
index 7399223904..33f5f66176 100644
--- a/boost/container/string.hpp
+++ b/boost/container/string.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2013. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -93,11 +93,11 @@ class basic_string_base
: members_()
{ init(); }
- basic_string_base(const allocator_type& a)
+ explicit basic_string_base(const allocator_type& a)
: members_(a)
{ init(); }
- basic_string_base(BOOST_RV_REF(allocator_type) a)
+ explicit basic_string_base(BOOST_RV_REF(allocator_type) a)
: members_(boost::move(a))
{ this->init(); }
@@ -108,6 +108,13 @@ class basic_string_base
this->allocate_initial_block(n);
}
+ explicit basic_string_base(size_type n)
+ : members_()
+ {
+ this->init();
+ this->allocate_initial_block(n);
+ }
+
~basic_string_base()
{
if(!this->is_short()){
@@ -647,10 +654,22 @@ class basic_string
}
}
+ //! <b>Effects</b>: Constructs a basic_string with a default-constructed allocator,
+ //! and is initialized by a specific number of characters of the s string.
+ basic_string(const basic_string& s, size_type pos, size_type n = npos)
+ : base_t()
+ {
+ this->priv_terminate_string();
+ if (pos > s.size())
+ throw_out_of_range("basic_string::basic_string out of range position");
+ else
+ this->assign
+ (s.begin() + pos, s.begin() + pos + container_detail::min_value(n, s.size() - pos));
+ }
+
//! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
//! and is initialized by a specific number of characters of the s string.
- basic_string(const basic_string& s, size_type pos, size_type n = npos,
- const allocator_type& a = allocator_type())
+ basic_string(const basic_string& s, size_type pos, size_type n, const allocator_type& a)
: base_t(a)
{
this->priv_terminate_string();
@@ -661,46 +680,93 @@ class basic_string
(s.begin() + pos, s.begin() + pos + container_detail::min_value(n, s.size() - pos));
}
+ //! <b>Effects</b>: Constructs a basic_string taking a default-constructed allocator,
+ //! and is initialized by a specific number of characters of the s c-string.
+ basic_string(const CharT* s, size_type n)
+ : base_t()
+ {
+ this->priv_terminate_string();
+ this->assign(s, s + n);
+ }
+
//! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
//! and is initialized by a specific number of characters of the s c-string.
- basic_string(const CharT* s, size_type n, const allocator_type& a = allocator_type())
+ basic_string(const CharT* s, size_type n, const allocator_type& a)
: base_t(a)
{
this->priv_terminate_string();
this->assign(s, s + n);
}
+ //! <b>Effects</b>: Constructs a basic_string with a default-constructed allocator,
+ //! and is initialized by the null-terminated s c-string.
+ basic_string(const CharT* s)
+ : base_t()
+ {
+ this->priv_terminate_string();
+ this->assign(s, s + Traits::length(s));
+ }
+
//! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
//! and is initialized by the null-terminated s c-string.
- basic_string(const CharT* s, const allocator_type& a = allocator_type())
+ basic_string(const CharT* s, const allocator_type& a)
: base_t(a)
{
this->priv_terminate_string();
this->assign(s, s + Traits::length(s));
}
+
+ //! <b>Effects</b>: Constructs a basic_string with a default-constructed allocator,
+ //! and is initialized by n copies of c.
+ basic_string(size_type n, CharT c)
+ : base_t()
+ {
+ this->priv_terminate_string();
+ this->assign(n, c);
+ }
+
//! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
//! and is initialized by n copies of c.
- basic_string(size_type n, CharT c, const allocator_type& a = allocator_type())
+ basic_string(size_type n, CharT c, const allocator_type& a)
: base_t(a)
{
this->priv_terminate_string();
this->assign(n, c);
}
+ //! <b>Effects</b>: Constructs a basic_string with a default-constructed allocator,
+ //! and is initialized by n default-initialized characters.
+ basic_string(size_type n, default_init_t)
+ : base_t(n + 1)
+ {
+ this->priv_size(n);
+ this->priv_terminate_string();
+ }
+
//! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
//! and is initialized by n default-initialized characters.
- basic_string(size_type n, default_init_t, const allocator_type& a = allocator_type())
+ basic_string(size_type n, default_init_t, const allocator_type& a)
: base_t(a, n + 1)
{
this->priv_size(n);
this->priv_terminate_string();
}
+ //! <b>Effects</b>: Constructs a basic_string with a default-constructed allocator,
+ //! and a range of iterators.
+ template <class InputIterator>
+ basic_string(InputIterator f, InputIterator l)
+ : base_t()
+ {
+ this->priv_terminate_string();
+ this->assign(f, l);
+ }
+
//! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
//! and a range of iterators.
template <class InputIterator>
- basic_string(InputIterator f, InputIterator l, const allocator_type& a = allocator_type())
+ basic_string(InputIterator f, InputIterator l, const allocator_type& a)
: base_t(a)
{
this->priv_terminate_string();
@@ -1058,6 +1124,62 @@ class basic_string
//
//////////////////////////////////////////////
+ //! <b>Requires</b>: !empty()
+ //!
+ //! <b>Effects</b>: Returns a reference to the first
+ //! element of the container.
+ //!
+ //! <b>Throws</b>: Nothing.
+ //!
+ //! <b>Complexity</b>: Constant.
+ reference front() BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->priv_addr();
+ }
+
+ //! <b>Requires</b>: !empty()
+ //!
+ //! <b>Effects</b>: Returns a const reference to the first
+ //! element of the container.
+ //!
+ //! <b>Throws</b>: Nothing.
+ //!
+ //! <b>Complexity</b>: Constant.
+ const_reference front() const BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->priv_addr();
+ }
+
+ //! <b>Requires</b>: !empty()
+ //!
+ //! <b>Effects</b>: Returns a reference to the last
+ //! element of the container.
+ //!
+ //! <b>Throws</b>: Nothing.
+ //!
+ //! <b>Complexity</b>: Constant.
+ reference back() BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ BOOST_ASSERT(!this->empty());
+ return *(this->priv_addr() + (this->size() - 1u) );
+ }
+
+ //! <b>Requires</b>: !empty()
+ //!
+ //! <b>Effects</b>: Returns a const reference to the last
+ //! element of the container.
+ //!
+ //! <b>Throws</b>: Nothing.
+ //!
+ //! <b>Complexity</b>: Constant.
+ const_reference back() const BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ BOOST_ASSERT(!this->empty());
+ return *(this->priv_addr() + (this->size() - 1u) );
+ }
+
//! <b>Requires</b>: size() > n.
//!
//! <b>Effects</b>: Returns a reference to the nth element
@@ -1067,7 +1189,10 @@ class basic_string
//!
//! <b>Complexity</b>: Constant.
reference operator[](size_type n) BOOST_NOEXCEPT_OR_NOTHROW
- { return *(this->priv_addr() + n); }
+ {
+ BOOST_ASSERT(this->size() > n);
+ return *(this->priv_addr() + n);
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1078,7 +1203,10 @@ class basic_string
//!
//! <b>Complexity</b>: Constant.
const_reference operator[](size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
- { return *(this->priv_addr() + n); }
+ {
+ BOOST_ASSERT(this->size() > n);
+ return *(this->priv_addr() + n);
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1560,6 +1688,18 @@ class basic_string
}
#endif
+ //! <b>Effects</b>: Removes the last element from the container.
+ //!
+ //! <b>Throws</b>: Nothing.
+ //!
+ //! <b>Complexity</b>: Constant time.
+ void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ BOOST_ASSERT(!this->empty());
+ iterator p = this->end();
+ this->erase(--p);
+ }
+
//! <b>Requires</b>: pos <= size()
//!
//! <b>Effects</b>: Determines the effective length xlen of the string to be removed as the smaller of n and size() - pos.
@@ -1621,18 +1761,6 @@ class basic_string
return iterator(f);
}
- //! <b>Requires</b>: !empty()
- //!
- //! <b>Throws</b>: Nothing
- //!
- //! <b>Effects</b>: Equivalent to erase(size() - 1, 1).
- void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
- {
- const size_type old_size = this->priv_size();
- Traits::assign(this->priv_addr()[old_size-1], CharT(0));
- this->priv_size(old_size-1);;
- }
-
//! <b>Effects</b>: Erases all the elements of the vector.
//!
//! <b>Throws</b>: Nothing.
diff --git a/boost/container/uses_allocator.hpp b/boost/container/uses_allocator.hpp
new file mode 100644
index 0000000000..2bcc465890
--- /dev/null
+++ b/boost/container/uses_allocator.hpp
@@ -0,0 +1,169 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2011-2013. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_USES_ALLOCATOR_HPP
+#define BOOST_CONTAINER_USES_ALLOCATOR_HPP
+
+#include <boost/container/uses_allocator_fwd.hpp>
+#include <boost/container/detail/type_traits.hpp>
+
+namespace boost {
+namespace container {
+
+//! <b>Remark</b>: if a specialization constructible_with_allocator_suffix<X>::value is true, indicates that T may be constructed
+//! with an allocator as its last constructor argument. Ideally, all constructors of T (including the
+//! copy and move constructors) should have a variant that accepts a final argument of
+//! allocator_type.
+//!
+//! <b>Requires</b>: if a specialization constructible_with_allocator_suffix<X>::value is true, T must have a nested type,
+//! allocator_type and at least one constructor for which allocator_type is the last
+//! parameter. If not all constructors of T can be called with a final allocator_type argument,
+//! and if T is used in a context where a container must call such a constructor, then the program is
+//! ill-formed.
+//!
+//! <code>
+//! template <class T, class Allocator = allocator<T> >
+//! class Z {
+//! public:
+//! typedef Allocator allocator_type;
+//!
+//! // Default constructor with optional allocator suffix
+//! Z(const allocator_type& a = allocator_type());
+//!
+//! // Copy constructor and allocator-extended copy constructor
+//! Z(const Z& zz);
+//! Z(const Z& zz, const allocator_type& a);
+//! };
+//!
+//! // Specialize trait for class template Z
+//! template <class T, class Allocator = allocator<T> >
+//! struct constructible_with_allocator_suffix<Z<T,Allocator> >
+//! { static const bool value = true; };
+//! </code>
+//!
+//! <b>Note</b>: This trait is a workaround inspired by "N2554: The Scoped A Model (Rev 2)"
+//! (Pablo Halpern, 2008-02-29) to backport the scoped allocator model to C++03, as
+//! in C++03 there is no mechanism to detect if a type can be constructed from arbitrary arguments.
+//! Applications aiming portability with several compilers should always define this trait.
+//!
+//! In conforming C++11 compilers or compilers supporting SFINAE expressions
+//! (when BOOST_NO_SFINAE_EXPR is NOT defined), this trait is ignored and C++11 rules will be used
+//! to detect if a type should be constructed with suffix or prefix allocator arguments.
+template <class T>
+struct constructible_with_allocator_suffix
+{ static const bool value = false; };
+
+//! <b>Remark</b>: if a specialization constructible_with_allocator_prefix<X>::value is true, indicates that T may be constructed
+//! with allocator_arg and T::allocator_type as its first two constructor arguments.
+//! Ideally, all constructors of T (including the copy and move constructors) should have a variant
+//! that accepts these two initial arguments.
+//!
+//! <b>Requires</b>: specialization constructible_with_allocator_prefix<X>::value is true, T must have a nested type,
+//! allocator_type and at least one constructor for which allocator_arg_t is the first
+//! parameter and allocator_type is the second parameter. If not all constructors of T can be
+//! called with these initial arguments, and if T is used in a context where a container must call such
+//! a constructor, then the program is ill-formed.
+//!
+//! <code>
+//! template <class T, class Allocator = allocator<T> >
+//! class Y {
+//! public:
+//! typedef Allocator allocator_type;
+//!
+//! // Default constructor with and allocator-extended default constructor
+//! Y();
+//! Y(allocator_arg_t, const allocator_type& a);
+//!
+//! // Copy constructor and allocator-extended copy constructor
+//! Y(const Y& yy);
+//! Y(allocator_arg_t, const allocator_type& a, const Y& yy);
+//!
+//! // Variadic constructor and allocator-extended variadic constructor
+//! template<class ...Args> Y(Args&& args...);
+//! template<class ...Args>
+//! Y(allocator_arg_t, const allocator_type& a, BOOST_FWD_REF(Args)... args);
+//! };
+//!
+//! // Specialize trait for class template Y
+//! template <class T, class Allocator = allocator<T> >
+//! struct constructible_with_allocator_prefix<Y<T,Allocator> >
+//! { static const bool value = true; };
+//!
+//! </code>
+//!
+//! <b>Note</b>: This trait is a workaround inspired by "N2554: The Scoped Allocator Model (Rev 2)"
+//! (Pablo Halpern, 2008-02-29) to backport the scoped allocator model to C++03, as
+//! in C++03 there is no mechanism to detect if a type can be constructed from arbitrary arguments.
+//! Applications aiming portability with several compilers should always define this trait.
+//!
+//! In conforming C++11 compilers or compilers supporting SFINAE expressions
+//! (when BOOST_NO_SFINAE_EXPR is NOT defined), this trait is ignored and C++11 rules will be used
+//! to detect if a type should be constructed with suffix or prefix allocator arguments.
+template <class T>
+struct constructible_with_allocator_prefix
+{ static const bool value = false; };
+
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+namespace container_detail {
+
+template<typename T, typename Allocator>
+struct uses_allocator_imp
+{
+ // Use SFINAE (Substitution Failure Is Not An Error) to detect the
+ // presence of an 'allocator_type' nested type convertilble from Allocator.
+ private:
+ typedef char yes_type;
+ struct no_type{ char dummy[2]; };
+
+ // Match this function if T::allocator_type exists and is
+ // implicitly convertible from Allocator
+ template <class U>
+ static yes_type test(typename U::allocator_type);
+
+ // Match this function if T::allocator_type exists and it's type is `erased_type`.
+ template <class U, class V>
+ static typename container_detail::enable_if
+ < container_detail::is_same<typename U::allocator_type, erased_type>
+ , yes_type
+ >::type test(const V&);
+
+ // Match this function if TypeT::allocator_type does not exist or is
+ // not convertible from Allocator.
+ template <typename U>
+ static no_type test(...);
+ static Allocator alloc; // Declared but not defined
+
+ public:
+ static const bool value = sizeof(test<T>(alloc)) == sizeof(yes_type);
+};
+
+} //namespace container_detail {
+
+#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+//! <b>Remark</b>: Automatically detects whether T has a nested allocator_type that is convertible from
+//! Allocator. Meets the BinaryTypeTrait requirements ([meta.rqmts] 20.4.1). A program may
+//! specialize this type to define uses_allocator<X>::value as true for a T of user-defined type if T does not
+//! have a nested allocator_type but is nonetheless constructible using the specified Allocator where either:
+//! the first argument of a constructor has type allocator_arg_t and the second argument has type Alloc or
+//! the last argument of a constructor has type Alloc.
+//!
+//! <b>Result</b>: uses_allocator<T, Allocator>::value== true if a type T::allocator_type
+//! exists and either is_convertible<Alloc, T::allocator_type>::value != false or T::allocator_type
+//! is an alias `erased_type`. False otherwise.
+template <typename T, typename Allocator>
+struct uses_allocator
+ : container_detail::uses_allocator_imp<T, Allocator>
+{};
+
+}} //namespace boost::container
+
+#endif //BOOST_CONTAINER_USES_ALLOCATOR_HPP
diff --git a/boost/container/uses_allocator_fwd.hpp b/boost/container/uses_allocator_fwd.hpp
new file mode 100644
index 0000000000..d8fe67fbfe
--- /dev/null
+++ b/boost/container/uses_allocator_fwd.hpp
@@ -0,0 +1,73 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2015-2015. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/container for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_CONTAINER_USES_ALLOCATOR_FWD_HPP
+#define BOOST_CONTAINER_USES_ALLOCATOR_FWD_HPP
+
+#include <boost/container/detail/workaround.hpp>
+#include <boost/container/detail/std_fwd.hpp>
+
+//! \file
+//! This header forward declares boost::container::constructible_with_allocator_prefix,
+//! boost::container::constructible_with_allocator_suffix and
+//! boost::container::uses_allocator. Also defines the following types:
+
+namespace boost {
+namespace container {
+
+#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+ template <int Dummy = 0>
+ struct std_allocator_arg_holder
+ {
+ static ::std::allocator_arg_t *dummy;
+ };
+
+ template <int Dummy>
+ ::std::allocator_arg_t *std_allocator_arg_holder<Dummy>::dummy;
+
+typedef const std::allocator_arg_t & allocator_arg_t;
+
+#else
+
+//! The allocator_arg_t struct is an empty structure type used as a unique type to
+//! disambiguate constructor and function overloading. Specifically, several types
+//! have constructors with allocator_arg_t as the first argument, immediately followed
+//! by an argument of a type that satisfies Allocator requirements
+typedef unspecified allocator_arg_t;
+
+#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
+
+//! The `erased_type` struct is an empty struct that serves as a placeholder for a type
+//! T in situations where the actual type T is determined at runtime. For example,
+//! the nested type, `allocator_type`, is an alias for `erased_type` in classes that
+//! use type-erased allocators.
+struct erased_type {};
+
+//! A instance of type
+//! allocator_arg_t
+static allocator_arg_t allocator_arg = BOOST_CONTAINER_DOC1ST(unspecified, *std_allocator_arg_holder<>::dummy);
+
+// @cond
+
+template <class T>
+struct constructible_with_allocator_suffix;
+
+template <class T>
+struct constructible_with_allocator_prefix;
+
+template <typename T, typename Allocator>
+struct uses_allocator;
+
+// @endcond
+
+}} // namespace boost { namespace container {
+
+#endif //BOOST_CONTAINER_USES_ALLOCATOR_HPP
diff --git a/boost/container/vector.hpp b/boost/container/vector.hpp
index 1cf44c8e27..e3bc1068aa 100644
--- a/boost/container/vector.hpp
+++ b/boost/container/vector.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2014. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -216,7 +216,7 @@ struct vector_merge_cursor
typedef SizeType size_type;
typedef typename iterator_traits<BiDirValueIt>::reference reference;
- vector_merge_cursor(T *pbeg, T *plast, BiDirValueIt valueit, Comp cmp)
+ vector_merge_cursor(T *pbeg, T *plast, BiDirValueIt valueit, Comp &cmp)
: m_pbeg(pbeg), m_pcur(--plast), m_valueit(valueit), m_cmp(cmp)
{}
@@ -241,7 +241,7 @@ struct vector_merge_cursor
T *const m_pbeg;
T *m_pcur;
BiDirValueIt m_valueit;
- Comp m_cmp;
+ Comp &m_cmp;
};
} //namespace container_detail {
@@ -346,18 +346,17 @@ struct vector_alloc_holder
static bool is_propagable_from(const allocator_type &from_alloc, pointer p, const allocator_type &to_alloc, bool const propagate_allocator)
{
(void)propagate_allocator; (void)p; (void)to_alloc; (void)from_alloc;
- return (!allocator_traits_type::is_partially_propagable::value ||
- !allocator_traits_type::storage_is_unpropagable(from_alloc, p)) &&
- (propagate_allocator || allocator_traits_type::equal(from_alloc, to_alloc));
+ const bool all_storage_propagable = !allocator_traits_type::is_partially_propagable::value ||
+ !allocator_traits_type::storage_is_unpropagable(from_alloc, p);
+ return all_storage_propagable && (propagate_allocator || allocator_traits_type::equal(from_alloc, to_alloc));
}
static bool are_swap_propagable(const allocator_type &l_a, pointer l_p, const allocator_type &r_a, pointer r_p, bool const propagate_allocator)
{
(void)propagate_allocator; (void)l_p; (void)r_p; (void)l_a; (void)r_a;
- return (!allocator_traits_type::is_partially_propagable::value ||
- (!allocator_traits_type::storage_is_unpropagable(r_a, r_p) &&
- !allocator_traits_type::storage_is_unpropagable(l_a, l_p))
- ) && (propagate_allocator || allocator_traits_type::equal(l_a, r_a));
+ const bool all_storage_propagable = !allocator_traits_type::is_partially_propagable::value ||
+ !(allocator_traits_type::storage_is_unpropagable(l_a, l_p) || allocator_traits_type::storage_is_unpropagable(r_a, r_p));
+ return all_storage_propagable && (propagate_allocator || allocator_traits_type::equal(l_a, r_a));
}
//Constructor, does not throw
@@ -646,7 +645,7 @@ struct vector_alloc_holder<Allocator, version_0>
this->priv_deep_swap(x);
}
- void swap_resources(vector_alloc_holder &x) BOOST_NOEXCEPT_OR_NOTHROW
+ void swap_resources(vector_alloc_holder &) BOOST_NOEXCEPT_OR_NOTHROW
{ //Containers with version 0 allocators can't be moved without moving elements one by one
throw_bad_alloc();
}
@@ -819,7 +818,7 @@ class vector
this->num_alloc += n != 0;
#endif
boost::container::uninitialized_value_init_alloc_n
- (this->m_holder.alloc(), n, container_detail::to_raw_pointer(this->m_holder.start()));
+ (this->m_holder.alloc(), n, this->priv_raw_begin());
}
//! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
@@ -838,7 +837,7 @@ class vector
this->num_alloc += n != 0;
#endif
boost::container::uninitialized_default_init_alloc_n
- (this->m_holder.alloc(), n, container_detail::to_raw_pointer(this->m_holder.start()));
+ (this->m_holder.alloc(), n, this->priv_raw_begin());
}
//! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
@@ -855,7 +854,7 @@ class vector
this->num_alloc += n != 0;
#endif
boost::container::uninitialized_value_init_alloc_n
- (this->m_holder.alloc(), n, container_detail::to_raw_pointer(this->m_holder.start()));
+ (this->m_holder.alloc(), n, this->priv_raw_begin());
}
//! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
@@ -874,7 +873,7 @@ class vector
this->num_alloc += n != 0;
#endif
boost::container::uninitialized_default_init_alloc_n
- (this->m_holder.alloc(), n, container_detail::to_raw_pointer(this->m_holder.start()));
+ (this->m_holder.alloc(), n, this->priv_raw_begin());
}
//! <b>Effects</b>: Constructs a vector
@@ -891,7 +890,7 @@ class vector
this->num_alloc += n != 0;
#endif
boost::container::uninitialized_fill_alloc_n
- (this->m_holder.alloc(), value, n, container_detail::to_raw_pointer(this->m_holder.start()));
+ (this->m_holder.alloc(), value, n, this->priv_raw_begin());
}
//! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
@@ -908,7 +907,7 @@ class vector
this->num_alloc += n != 0;
#endif
boost::container::uninitialized_fill_alloc_n
- (this->m_holder.alloc(), value, n, container_detail::to_raw_pointer(this->m_holder.start()));
+ (this->m_holder.alloc(), value, n, this->priv_raw_begin());
}
//! <b>Effects</b>: Constructs a vector
@@ -952,8 +951,8 @@ class vector
this->num_alloc += x.size() != 0;
#endif
::boost::container::uninitialized_copy_alloc_n
- ( this->m_holder.alloc(), container_detail::to_raw_pointer(x.m_holder.start())
- , x.size(), container_detail::to_raw_pointer(this->m_holder.start()));
+ ( this->m_holder.alloc(), x.priv_raw_begin()
+ , x.size(), this->priv_raw_begin());
}
//! <b>Effects</b>: Move constructor. Moves x's resources to *this.
@@ -1013,8 +1012,8 @@ class vector
this->num_alloc += x.size() != 0;
#endif
::boost::container::uninitialized_copy_alloc_n_source
- ( this->m_holder.alloc(), container_detail::to_raw_pointer(x.m_holder.start())
- , x.size(), container_detail::to_raw_pointer(this->m_holder.start()));
+ ( this->m_holder.alloc(), x.priv_raw_begin()
+ , x.size(), this->priv_raw_begin());
}
//! <b>Effects</b>: Move constructor using the specified allocator.
@@ -1038,8 +1037,8 @@ class vector
this->num_alloc += n != 0;
#endif
::boost::container::uninitialized_move_alloc_n_source
- ( this->m_holder.alloc(), container_detail::to_raw_pointer(x.m_holder.start())
- , n, container_detail::to_raw_pointer(this->m_holder.start()));
+ ( this->m_holder.alloc(), x.priv_raw_begin()
+ , n, this->priv_raw_begin());
}
}
@@ -1052,7 +1051,7 @@ class vector
~vector() BOOST_NOEXCEPT_OR_NOTHROW
{
boost::container::destroy_alloc_n
- (this->get_stored_allocator(), container_detail::to_raw_pointer(this->m_holder.start()), this->m_holder.m_size);
+ (this->get_stored_allocator(), this->priv_raw_begin(), this->m_holder.m_size);
//vector_alloc_holder deallocates the data
}
@@ -1098,6 +1097,7 @@ class vector
BOOST_NOEXCEPT_IF(allocator_traits_type::propagate_on_container_move_assignment::value
|| allocator_traits_type::is_always_equal::value)
{
+ BOOST_ASSERT(&x != this);
this->priv_move_assign(boost::move(x));
return *this;
}
@@ -1177,7 +1177,7 @@ class vector
if (first == last){
//There are no more elements in the sequence, erase remaining
- T* const end_pos = this->back_raw();
+ T* const end_pos = this->priv_raw_end();
const size_type n = static_cast<size_type>(end_pos - container_detail::iterator_to_raw_pointer(cur));
this->priv_destroy_last_n(n);
}
@@ -1513,7 +1513,10 @@ class vector
//!
//! <b>Complexity</b>: Constant.
reference front() BOOST_NOEXCEPT_OR_NOTHROW
- { return *this->m_holder.start(); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->m_holder.start();
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1524,7 +1527,10 @@ class vector
//!
//! <b>Complexity</b>: Constant.
const_reference front() const BOOST_NOEXCEPT_OR_NOTHROW
- { return *this->m_holder.start(); }
+ {
+ BOOST_ASSERT(!this->empty());
+ return *this->m_holder.start();
+ }
//! <b>Requires</b>: !empty()
//!
@@ -1536,7 +1542,7 @@ class vector
//! <b>Complexity</b>: Constant.
reference back() BOOST_NOEXCEPT_OR_NOTHROW
{
- BOOST_ASSERT(this->m_holder.m_size > 0);
+ BOOST_ASSERT(!this->empty());
return this->m_holder.start()[this->m_holder.m_size - 1];
}
@@ -1550,7 +1556,7 @@ class vector
//! <b>Complexity</b>: Constant.
const_reference back() const BOOST_NOEXCEPT_OR_NOTHROW
{
- BOOST_ASSERT(this->m_holder.m_size > 0);
+ BOOST_ASSERT(!this->empty());
return this->m_holder.start()[this->m_holder.m_size - 1];
}
@@ -1578,7 +1584,8 @@ class vector
//! <b>Complexity</b>: Constant.
const_reference operator[](size_type n) const BOOST_NOEXCEPT_OR_NOTHROW
{
- return this->m_holder.start()[n];
+ BOOST_ASSERT(this->m_holder.m_size > n);
+ return this->m_holder.start()[n];
}
//! <b>Requires</b>: size() >= n.
@@ -1627,7 +1634,10 @@ class vector
//!
//! <b>Note</b>: Non-standard extension
size_type index_of(iterator p) BOOST_NOEXCEPT_OR_NOTHROW
- { return this->priv_index_of(vector_iterator_get_ptr(p)); }
+ {
+ //Range check assert done in priv_index_of
+ return this->priv_index_of(vector_iterator_get_ptr(p));
+ }
//! <b>Requires</b>: begin() <= p <= end().
//!
@@ -1640,7 +1650,10 @@ class vector
//!
//! <b>Note</b>: Non-standard extension
size_type index_of(const_iterator p) const BOOST_NOEXCEPT_OR_NOTHROW
- { return this->priv_index_of(vector_iterator_get_ptr(p)); }
+ {
+ //Range check assert done in priv_index_of
+ return this->priv_index_of(vector_iterator_get_ptr(p));
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1651,7 +1664,10 @@ class vector
//!
//! <b>Complexity</b>: Constant.
reference at(size_type n)
- { this->priv_check_range(n); return this->m_holder.start()[n]; }
+ {
+ this->priv_throw_if_out_of_range(n);
+ return this->m_holder.start()[n];
+ }
//! <b>Requires</b>: size() > n.
//!
@@ -1662,7 +1678,10 @@ class vector
//!
//! <b>Complexity</b>: Constant.
const_reference at(size_type n) const
- { this->priv_check_range(n); return this->m_holder.start()[n]; }
+ {
+ this->priv_throw_if_out_of_range(n);
+ return this->m_holder.start()[n];
+ }
//////////////////////////////////////////////
//
@@ -1677,7 +1696,7 @@ class vector
//!
//! <b>Complexity</b>: Constant.
T* data() BOOST_NOEXCEPT_OR_NOTHROW
- { return container_detail::to_raw_pointer(this->m_holder.start()); }
+ { return this->priv_raw_begin(); }
//! <b>Returns</b>: A pointer such that [data(),data() + size()) is a valid range.
//! For a non-empty vector, data() == &front().
@@ -1686,7 +1705,7 @@ class vector
//!
//! <b>Complexity</b>: Constant.
const T * data() const BOOST_NOEXCEPT_OR_NOTHROW
- { return container_detail::to_raw_pointer(this->m_holder.start()); }
+ { return this->priv_raw_begin(); }
//////////////////////////////////////////////
//
@@ -1707,7 +1726,7 @@ class vector
{
if (BOOST_LIKELY(this->room_enough())){
//There is more memory, just construct a new object at the end
- allocator_traits_type::construct(this->m_holder.alloc(), this->back_raw(), ::boost::forward<Args>(args)...);
+ allocator_traits_type::construct(this->m_holder.alloc(), this->priv_raw_end(), ::boost::forward<Args>(args)...);
++this->m_holder.m_size;
}
else{
@@ -1731,7 +1750,7 @@ class vector
const bool is_room_enough = this->room_enough() || (alloc_version::value == 2 && this->m_holder.try_expand_fwd(1u));
if (BOOST_LIKELY(is_room_enough)){
//There is more memory, just construct a new object at the end
- allocator_traits_type::construct(this->m_holder.alloc(), this->back_raw(), ::boost::forward<Args>(args)...);
+ allocator_traits_type::construct(this->m_holder.alloc(), this->priv_raw_end(), ::boost::forward<Args>(args)...);
++this->m_holder.m_size;
}
return is_room_enough;
@@ -1750,6 +1769,7 @@ class vector
template<class ...Args>
iterator emplace(const_iterator position, BOOST_FWD_REF(Args) ...args)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(position));
//Just call more general insert(pos, size, value) and return iterator
typedef container_detail::insert_emplace_proxy<Allocator, T*, Args...> type;
return this->priv_forward_range_insert( vector_iterator_get_ptr(position), 1
@@ -1764,7 +1784,7 @@ class vector
{\
if (BOOST_LIKELY(this->room_enough())){\
allocator_traits_type::construct (this->m_holder.alloc()\
- , this->back_raw() BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
+ , this->priv_raw_end() BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
++this->m_holder.m_size;\
}\
else{\
@@ -1780,7 +1800,7 @@ class vector
const bool is_room_enough = this->room_enough() || (alloc_version::value == 2 && this->m_holder.try_expand_fwd(1u));\
if (BOOST_LIKELY(is_room_enough)){\
allocator_traits_type::construct (this->m_holder.alloc()\
- , this->back_raw() BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
+ , this->priv_raw_end() BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
++this->m_holder.m_size;\
}\
return is_room_enough;\
@@ -1789,6 +1809,7 @@ class vector
BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
iterator emplace(const_iterator pos BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
{\
+ BOOST_ASSERT(this->priv_in_range_or_end(pos));\
typedef container_detail::insert_emplace_proxy_arg##N<Allocator, T* BOOST_MOVE_I##N BOOST_MOVE_TARG##N> type;\
return this->priv_forward_range_insert(vector_iterator_get_ptr(pos), 1, type(BOOST_MOVE_FWD##N));\
}\
@@ -1854,6 +1875,7 @@ class vector
//! <b>Complexity</b>: Linear to n.
iterator insert(const_iterator p, size_type n, const T& x)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
container_detail::insert_n_copies_proxy<Allocator, T*> proxy(x);
return this->priv_forward_range_insert(vector_iterator_get_ptr(p), n, proxy);
}
@@ -1879,6 +1901,7 @@ class vector
#endif
)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(pos));
const size_type n_pos = pos - this->cbegin();
iterator it(vector_iterator_get_ptr(pos));
for(;first != last; ++first){
@@ -1898,6 +1921,7 @@ class vector
>::type * = 0
)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(pos));
container_detail::insert_range_proxy<Allocator, FwdIt, T*> proxy(first);
return this->priv_forward_range_insert(vector_iterator_get_ptr(pos), boost::container::iterator_distance(first, last), proxy);
}
@@ -1922,6 +1946,7 @@ class vector
template <class InIt>
iterator insert(const_iterator pos, size_type num, InIt first, InIt last)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(pos));
BOOST_ASSERT(container_detail::is_input_iterator<InIt>::value ||
num == static_cast<size_type>(boost::container::iterator_distance(first, last)));
(void)last;
@@ -1940,17 +1965,19 @@ class vector
//! <b>Complexity</b>: Linear to the range [il.begin(), il.end()).
iterator insert(const_iterator position, std::initializer_list<value_type> il)
{
+ //Assertion done in insert()
return this->insert(position, il.begin(), il.end());
}
#endif
- //! <b>Effects</b>: Removes the last element from the vector.
+ //! <b>Effects</b>: Removes the last element from the container.
//!
//! <b>Throws</b>: Nothing.
//!
//! <b>Complexity</b>: Constant time.
void pop_back() BOOST_NOEXCEPT_OR_NOTHROW
{
+ BOOST_ASSERT(!this->empty());
//Destroy last element
this->priv_destroy_last();
}
@@ -1963,9 +1990,10 @@ class vector
//! last element. Constant if pos is the last element.
iterator erase(const_iterator position)
{
+ BOOST_ASSERT(this->priv_in_range(position));
const pointer p = vector_iterator_get_ptr(position);
T *const pos_ptr = container_detail::to_raw_pointer(p);
- T *const beg_ptr = container_detail::to_raw_pointer(this->m_holder.start());
+ T *const beg_ptr = this->priv_raw_begin();
T *const new_end_ptr = ::boost::container::move(pos_ptr + 1, beg_ptr + this->m_holder.m_size, pos_ptr);
//Move elements forward and destroy last
this->priv_destroy_last(pos_ptr == new_end_ptr);
@@ -1980,8 +2008,10 @@ class vector
//! plus linear to the elements between pos and the last element.
iterator erase(const_iterator first, const_iterator last)
{
+ BOOST_ASSERT(first == last ||
+ (first < last && this->priv_in_range(first) && this->priv_in_range_or_end(last)));
if (first != last){
- T* const old_end_ptr = this->back_raw();
+ T* const old_end_ptr = this->priv_raw_end();
T* const first_ptr = container_detail::to_raw_pointer(vector_iterator_get_ptr(first));
T* const last_ptr = container_detail::to_raw_pointer(vector_iterator_get_ptr(last));
T* const ptr = container_detail::to_raw_pointer(boost::container::move(last_ptr, old_end_ptr, first_ptr));
@@ -2128,7 +2158,7 @@ class vector
{
const size_type old_size_pos = this->size();
this->reserve(old_size_pos + element_count);
- T* const begin_ptr = container_detail::to_raw_pointer(this->m_holder.start());
+ T* const begin_ptr = this->priv_raw_begin();
size_type insertions_left = element_count;
size_type prev_pos = old_size_pos;
size_type old_hole_size = element_count;
@@ -2184,48 +2214,55 @@ class vector
void priv_merge(UniqueBool, BidirIt first, BidirIt last, Compare comp)
{
size_type const n = static_cast<size_type>(boost::container::iterator_distance(first, last));
- if(BOOST_LIKELY(n)){
- size_type const s = this->size();
- if(BOOST_LIKELY(s)){
- size_type const c = this->capacity();
- size_type const free_c = (c - s);
- //Use a new buffer if current one is too small for new elements,
- //or there is no room for position indexes
- bool new_buffer = false;
- if(free_c < n){
- new_buffer = true;
- }
- else if(!UniqueBool::value && free_c >= n){
- typedef container_detail::vector_merge_cursor<T, size_type, BidirIt, Compare> inserter_t;
- T* const pbeg = container_detail::to_raw_pointer(m_holder.start());
- return this->priv_insert_ordered_at(n, inserter_t(pbeg, pbeg + s, last, comp));
- }
- else if(UniqueBool::value){ //Query for room to store n + 1 indexes (+1 to guarantee potential alignment overhead).
- //No need to destroy them as they are integral types, which simplifies things a lot.
- std::size_t const sz_vlt = sizeof(value_type);
- std::size_t const sz_szt = sizeof(size_type);
- new_buffer = (c-s-n)*sz_vlt/sz_szt < (n+1);
- }
-
- if(new_buffer){
- size_type const new_size = s + n;
- size_type new_cap = new_size;
- pointer p = pointer();
- p = this->m_holder.allocation_command(allocate_new, new_size, new_cap, p);
- this->priv_merge_in_new_buffer(UniqueBool(), first, n, comp, p, new_cap);
- }
- else{
- //Use trailing memory to store position offsets
+ size_type const s = this->size();
+ if(BOOST_LIKELY(s)){
+ size_type const c = this->capacity();
+ size_type const free_c = (c - s);
+ //Use a new buffer if current one is too small for new elements,
+ //or there is no room for position indexes
+ if(free_c < n){
+ size_type const new_size = s + n;
+ size_type new_cap = new_size;
+ pointer p = pointer();
+ p = this->m_holder.allocation_command(allocate_new, new_size, new_cap, p);
+ this->priv_merge_in_new_buffer(UniqueBool(), first, n, comp, p, new_cap);
+ }
+ else if(!UniqueBool::value && free_c >= n){
+ typedef container_detail::vector_merge_cursor<T, size_type, BidirIt, Compare> inserter_t;
+ T* const pbeg = this->priv_raw_begin();
+ return this->priv_insert_ordered_at(n, inserter_t(pbeg, pbeg + s, last, comp));
+ }
+ else{ //UniqueBool::value == true and free_c >= n
+ std::size_t remaining = n;
+ static const std::size_t PosCount = 64u;
+ size_type positions[PosCount];
+ size_type *indexes = 0;
+ while(remaining){
+ //Query for room to store indexes in the remaining buffer
uintptr_t const szt_align_mask = container_detail::alignment_of<size_type>::value - 1;
- boost::uintptr_t const addr = boost::uintptr_t(container_detail::to_raw_pointer(m_holder.start()) + s + n);
- //Align memory before casting to address
- size_type *const paddr = reinterpret_cast<size_type *>((addr + szt_align_mask) & ~szt_align_mask);
- this->priv_insert_ordered_range(UniqueBool(), n, first, last, paddr, comp);
+ boost::uintptr_t const addr = boost::uintptr_t(this->priv_raw_begin() + s + n);
+ boost::uintptr_t const capaddr = boost::uintptr_t(this->priv_raw_begin() + c);
+ boost::uintptr_t const aligned_addr = (addr + szt_align_mask) & ~szt_align_mask;
+ indexes = reinterpret_cast<size_type *>(aligned_addr);
+ std::size_t index_capacity = (aligned_addr >= capaddr) ? 0u : (capaddr - addr)/sizeof(size_type);
+
+ //Capacity is constant, we're not going to change it
+ if(index_capacity < PosCount){
+ indexes = positions;
+ index_capacity = PosCount;
+ }
+ if(index_capacity > remaining)
+ index_capacity = remaining;
+ BidirIt limit = first;
+ boost::container::iterator_advance(limit, index_capacity);
+ this->priv_insert_ordered_range(UniqueBool(), index_capacity, first, limit, indexes, comp);
+ first = limit;
+ remaining -= index_capacity;
}
}
- else{
- this->insert(this->cend(), n, first, last);
- }
+ }
+ else{
+ this->insert(this->cend(), n, first, last);
}
}
@@ -2245,7 +2282,7 @@ class vector
//bool const linear = !s || !n || (s <= n) || ((s+n)/n/2 < logN);
size_type const s = this->size();
size_type remaining = n;
- T* const pbeg = container_detail::to_raw_pointer(m_holder.start());
+ T* const pbeg = this->priv_raw_begin();
T* const pend = pbeg + s;
T* pcur = pbeg;
size_type *position = positions;
@@ -2284,7 +2321,7 @@ class vector
allocator_type &a = this->m_holder.alloc();
typename value_traits::ArrayDeallocator new_buffer_deallocator(new_storage, a, new_cap);
typename value_traits::ArrayDestructor new_values_destroyer(new_storage, a, 0u);
- T* pbeg = container_detail::to_raw_pointer(m_holder.start());
+ T* pbeg = this->priv_raw_begin();
size_type const old_size = this->size();
T* const pend = pbeg + old_size;
T* d_first = container_detail::to_raw_pointer(new_storage);
@@ -2338,9 +2375,6 @@ class vector
pointer back_ptr() const
{ return this->m_holder.start() + this->m_holder.m_size; }
- T* back_raw() const
- { return container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size; }
-
size_type priv_index_of(pointer p) const
{
BOOST_ASSERT(this->m_holder.start() <= p);
@@ -2357,8 +2391,8 @@ class vector
this->capacity() < x.size()){
throw_bad_alloc();
}
- T* const this_start = container_detail::to_raw_pointer(m_holder.start());
- T* const other_start = container_detail::to_raw_pointer(x.m_holder.start());
+ T* const this_start = this->priv_raw_begin();
+ T* const other_start = x.priv_raw_begin();
const size_type this_sz = m_holder.m_size;
const size_type other_sz = static_cast<size_type>(x.m_holder.m_size);
boost::container::move_assign_range_alloc_n(this->m_holder.alloc(), other_start, other_sz, this_start, this_sz);
@@ -2373,7 +2407,7 @@ class vector
, container_detail::is_different<OtherAllocator, allocator_type>
>::type * = 0)
{
- //for move constructor, no aliasing (&x != this) is assummed.
+ //for move assignment, no aliasing (&x != this) is assummed.
BOOST_ASSERT(this != &x);
allocator_type &this_alloc = this->m_holder.alloc();
allocator_type &x_alloc = x.m_holder.alloc();
@@ -2414,8 +2448,8 @@ class vector
this->capacity() < x.size()){
throw_bad_alloc();
}
- T* const this_start = container_detail::to_raw_pointer(m_holder.start());
- T* const other_start = container_detail::to_raw_pointer(x.m_holder.start());
+ T* const this_start = this->priv_raw_begin();
+ T* const other_start = x.priv_raw_begin();
const size_type this_sz = m_holder.m_size;
const size_type other_sz = static_cast<size_type>(x.m_holder.m_size);
boost::container::copy_assign_range_alloc_n(this->m_holder.alloc(), other_start, other_sz, this_start, this_sz);
@@ -2439,8 +2473,7 @@ class vector
this->shrink_to_fit();
}
container_detail::assign_alloc(this_alloc, x_alloc, flag);
- this->assign( container_detail::to_raw_pointer(x.m_holder.start())
- , container_detail::to_raw_pointer(x.m_holder.start() + x.m_holder.m_size));
+ this->assign( x.priv_raw_begin(), x.priv_raw_end() );
}
template<class Vector> //Template it to avoid it in explicit instantiations
@@ -2452,7 +2485,7 @@ class vector
{
const bool propagate_alloc = allocator_traits_type::propagate_on_container_swap::value;
if(are_swap_propagable( this->get_stored_allocator(), this->m_holder.start()
- , x.get_stored_allocator(), this->m_holder.start(), propagate_alloc)){
+ , x.get_stored_allocator(), x.m_holder.start(), propagate_alloc)){
//Just swap internals
this->m_holder.swap_resources(x.m_holder);
}
@@ -2471,6 +2504,8 @@ class vector
, boost::make_move_iterator(container_detail::iterator_to_raw_pointer(big.nth(common_elements)))
, boost::make_move_iterator(container_detail::iterator_to_raw_pointer(big.end()))
);
+ //Destroy remaining elements
+ big.erase(big.nth(common_elements), big.cend());
}
//And now swap the allocator
container_detail::swap_alloc(this->m_holder.alloc(), x.m_holder.alloc(), container_detail::bool_<propagate_alloc>());
@@ -2492,7 +2527,7 @@ class vector
pointer const p = allocator_traits_type::allocate(this->m_holder.alloc(), new_cap, this->m_holder.m_start);
//We will reuse insert code, so create a dummy input iterator
this->priv_forward_range_insert_new_allocation
- ( container_detail::to_raw_pointer(p), new_cap, this->back_raw(), 0, this->priv_dummy_empty_proxy());
+ ( container_detail::to_raw_pointer(p), new_cap, this->priv_raw_end(), 0, this->priv_dummy_empty_proxy());
}
void priv_reserve_no_capacity(size_type new_cap, version_2)
@@ -2514,7 +2549,7 @@ class vector
}
else{ //If there is no forward expansion, move objects, we will reuse insertion code
T * const new_mem = container_detail::to_raw_pointer(ret);
- T * const ins_pos = this->back_raw();
+ T * const ins_pos = this->priv_raw_end();
if(reuse){ //Backwards (and possibly forward) expansion
#ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
++this->num_expand_bwd;
@@ -2536,7 +2571,7 @@ class vector
{
(void)moved;
if(!(value_traits::trivial_dctr || (value_traits::trivial_dctr_after_move && moved))){
- value_type* const p = this->back_raw() - 1;
+ value_type* const p = this->priv_raw_end() - 1;
allocator_traits_type::destroy(this->get_stored_allocator(), p);
}
--this->m_holder.m_size;
@@ -2546,7 +2581,7 @@ class vector
{
BOOST_ASSERT(n <= this->m_holder.m_size);
if(!value_traits::trivial_dctr){
- T* const destroy_pos = container_detail::to_raw_pointer(this->m_holder.start()) + (this->m_holder.m_size-n);
+ T* const destroy_pos = this->priv_raw_begin() + (this->m_holder.m_size-n);
boost::container::destroy_alloc_n(this->get_stored_allocator(), destroy_pos, n);
}
this->m_holder.m_size -= n;
@@ -2555,7 +2590,7 @@ class vector
template<class InpIt>
void priv_uninitialized_construct_at_end(InpIt first, InpIt last)
{
- T* const old_end_pos = this->back_raw();
+ T* const old_end_pos = this->priv_raw_end();
T* const new_end_pos = boost::container::uninitialized_copy_alloc(this->m_holder.alloc(), first, last, old_end_pos);
this->m_holder.m_size += new_end_pos - old_end_pos;
}
@@ -2563,13 +2598,14 @@ class vector
void priv_destroy_all() BOOST_NOEXCEPT_OR_NOTHROW
{
boost::container::destroy_alloc_n
- (this->get_stored_allocator(), container_detail::to_raw_pointer(this->m_holder.start()), this->m_holder.m_size);
+ (this->get_stored_allocator(), this->priv_raw_begin(), this->m_holder.m_size);
this->m_holder.m_size = 0;
}
template<class U>
iterator priv_insert(const const_iterator &p, BOOST_FWD_REF(U) x)
{
+ BOOST_ASSERT(this->priv_in_range_or_end(p));
return this->priv_forward_range_insert
( vector_iterator_get_ptr(p), 1, container_detail::get_insert_value_proxy<T*, Allocator>(::boost::forward<U>(x)));
}
@@ -2586,9 +2622,7 @@ class vector
if (BOOST_LIKELY(this->room_enough())){
//There is more memory, just construct a new object at the end
allocator_traits_type::construct
- ( this->m_holder.alloc()
- , container_detail::to_raw_pointer(this->m_holder.start() + this->m_holder.m_size)
- , ::boost::forward<U>(u) );
+ ( this->m_holder.alloc(), this->priv_raw_end(), ::boost::forward<U>(u) );
++this->m_holder.m_size;
}
else{
@@ -2645,8 +2679,7 @@ class vector
#endif
this->priv_forward_range_insert_new_allocation
( container_detail::to_raw_pointer(p), sz
- , container_detail::to_raw_pointer(this->m_holder.start())
- , 0, this->priv_dummy_empty_proxy());
+ , this->priv_raw_begin(), 0, this->priv_dummy_empty_proxy());
}
}
}
@@ -2693,7 +2726,8 @@ class vector
const size_type new_cap = this->m_holder.next_capacity(n);
//Pass the hint so that allocators can take advantage of this.
- T * const new_buf = container_detail::to_raw_pointer(allocator_traits_type::allocate(this->m_holder.alloc(), new_cap, this->m_holder.m_start));
+ T * const new_buf = container_detail::to_raw_pointer
+ (allocator_traits_type::allocate(this->m_holder.alloc(), new_cap, this->m_holder.m_start));
#ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
++this->num_alloc;
#endif
@@ -2708,7 +2742,7 @@ class vector
{
//Check if we have enough memory or try to expand current memory
T *const raw_pos = container_detail::to_raw_pointer(pos);
- const size_type n_pos = raw_pos - container_detail::to_raw_pointer(this->m_holder.start());
+ const size_type n_pos = raw_pos - this->priv_raw_begin();
//There is not enough memory, allocate a new
//buffer or expand the old one.
@@ -2764,7 +2798,7 @@ class vector
else{
//Expand forward
T *const raw_pos = container_detail::to_raw_pointer(pos);
- const size_type n_pos = raw_pos - container_detail::to_raw_pointer(this->m_holder.start());
+ const size_type n_pos = raw_pos - this->priv_raw_begin();
this->priv_forward_range_insert_expand_forward(raw_pos, n, insert_range_proxy);
return iterator(this->m_holder.start() + n_pos);
}
@@ -2849,7 +2883,7 @@ class vector
BOOST_ASSERT(first_pos <= last_pos);
BOOST_ASSERT(last_pos <= limit_pos);
//
- T* const begin_ptr = container_detail::to_raw_pointer(this->m_holder.start());
+ T* const begin_ptr = this->priv_raw_begin();
T* const first_ptr = begin_ptr + first_pos;
T* const last_ptr = begin_ptr + last_pos;
@@ -2879,10 +2913,16 @@ class vector
}
private:
+ T *priv_raw_begin() const
+ { return container_detail::to_raw_pointer(m_holder.start()); }
+
+ T* priv_raw_end() const
+ { return this->priv_raw_begin() + this->m_holder.m_size; }
+
template <class InsertionProxy>
void priv_forward_range_insert_at_end_expand_forward(const size_type n, InsertionProxy insert_range_proxy)
{
- T* const old_finish = this->back_raw();
+ T* const old_finish = this->priv_raw_end();
insert_range_proxy.uninitialized_copy_n_and_update(this->m_holder.alloc(), old_finish, n);
this->m_holder.m_size += n;
}
@@ -2893,7 +2933,7 @@ class vector
//n can't be 0, because there is nothing to do in that case
if(BOOST_UNLIKELY(!n)) return;
//There is enough memory
- T* const old_finish = this->back_raw();
+ T* const old_finish = this->priv_raw_end();
const size_type elems_after = old_finish - pos;
if (!elems_after){
@@ -2944,10 +2984,10 @@ class vector
//Initialize with [begin(), pos) old buffer
//the start of the new buffer
- T * const old_buffer = container_detail::to_raw_pointer(this->m_holder.start());
+ T * const old_buffer = this->priv_raw_begin();
if(old_buffer){
new_finish = ::boost::container::uninitialized_move_alloc
- (this->m_holder.alloc(), container_detail::to_raw_pointer(this->m_holder.start()), pos, old_finish = new_finish);
+ (this->m_holder.alloc(), this->priv_raw_begin(), pos, old_finish = new_finish);
new_values_destroyer.increment_size(new_finish - old_finish);
}
//Initialize new objects, starting from previous point
@@ -2981,7 +3021,7 @@ class vector
{
//n can be zero to just expand capacity
//Backup old data
- T* const old_start = container_detail::to_raw_pointer(this->m_holder.start());
+ T* const old_start = this->priv_raw_begin();
const size_type old_size = this->m_holder.m_size;
T* const old_finish = old_start + old_size;
@@ -3291,7 +3331,7 @@ class vector
}
}
- void priv_check_range(size_type n) const
+ void priv_throw_if_out_of_range(size_type n) const
{
//If n is out of range, throw an out_of_range exception
if (n >= this->size()){
@@ -3299,6 +3339,16 @@ class vector
}
}
+ bool priv_in_range(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos < this->end());
+ }
+
+ bool priv_in_range_or_end(const_iterator pos) const
+ {
+ return (this->begin() <= pos) && (pos <= this->end());
+ }
+
#ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
public:
unsigned int num_expand_fwd;
diff --git a/boost/context/detail/config.hpp b/boost/context/detail/config.hpp
index ea23a5f9db..0d5fa757fa 100644
--- a/boost/context/detail/config.hpp
+++ b/boost/context/detail/config.hpp
@@ -50,15 +50,16 @@
#endif
#if defined(BOOST_USE_SEGMENTED_STACKS)
-# if ! ( (defined(__GNUC__) && __GNUC__ > 3 && __GNUC_MINOR__ > 6) || \
- (defined(__clang__) && __clang_major__ > 2 && __clang_minor__ > 3) )
+# if ! ( (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) ) ) || \
+ (defined(__clang__) && (__clang_major__ > 2 || ( __clang_major__ == 2 && __clang_minor__ > 3) ) ) )
# error "compiler does not support segmented_stack stacks"
# endif
# define BOOST_CONTEXT_SEGMENTS 10
#endif
#undef BOOST_CONTEXT_NO_EXECUTION_CONTEXT
-#if defined(BOOST_NO_CXX11_DECLTYPE) || \
+#if defined(BOOST_NO_CXX11_CONSTEXPR) || \
+ defined(BOOST_NO_CXX11_DECLTYPE) || \
defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || \
defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) || \
defined(BOOST_NO_CXX11_HDR_TUPLE) || \
@@ -77,5 +78,11 @@
#if _MSC_VER > 1800 // _MSC_VER == 1800 -> MS Visual Studio 2013
# undef BOOST_CONTEXT_NO_EXECUTION_CONTEXT
#endif
+// workaround: Xcode clang feature detection
+#if ! defined(__cpp_lib_integer_sequence) && __cpp_lib_integer_sequence < 201304
+# if _LIBCPP_STD_VER > 11
+# undef BOOST_CONTEXT_NO_EXECUTION_CONTEXT
+# endif
+#endif
#endif // BOOST_CONTEXT_DETAIL_CONFIG_H
diff --git a/boost/context/detail/invoke.hpp b/boost/context/detail/invoke.hpp
index aba05d5cfb..f63d22c3ff 100644
--- a/boost/context/detail/invoke.hpp
+++ b/boost/context/detail/invoke.hpp
@@ -21,22 +21,60 @@ namespace boost {
namespace context {
namespace detail {
-template< typename Fn, typename... Args >
+# if _MSC_VER > 1800
+using std::invoke;
+# else
+template< typename Fn, typename ... Args >
+typename std::enable_if<
+ ( ! std::is_member_pointer< Fn >::value &&
+ ! std::is_function< Fn >::value &&
+ ! std::is_function< typename std::remove_pointer< Fn >::type >::value
+ ),
+ typename std::result_of< Fn( Args ... ) >::type
+>::type
+invoke( Fn & fn, Args && ... args) {
+ return fn( std::forward< Args >( args) ... );
+}
+
+template< typename Fn, typename ... Args >
typename std::enable_if<
- std::is_member_pointer< typename std::decay< Fn >::type >::value,
- typename std::result_of< Fn&&( Args && ...) >::type
+ ( std::is_member_pointer< Fn >::value &&
+ ! std::is_function< Fn >::value &&
+ ! std::is_function< typename std::remove_pointer< Fn >::type >::value
+ ),
+ typename std::result_of< Fn( Args ... ) >::type
>::type
-invoke( Fn && fn, Args && ... args) {
- return std::mem_fn( fn)( std::forward< Args >( args) ...);
+invoke( Fn & fn, Args && ... args) {
+ return std::mem_fn( fn)( std::forward< Args >( args) ... );
}
template< typename Fn, typename ... Args >
typename std::enable_if<
- ! std::is_member_pointer< typename std::decay< Fn >::type >::value,
- typename std::result_of< Fn&&( Args && ...) >::type
+ ( std::is_pointer< Fn >::value &&
+ std::is_function< typename std::remove_pointer< Fn >::type >::value
+ ),
+ typename std::result_of< Fn( Args ... ) >::type
>::type
-invoke( Fn && fn, Args && ... args) {
- return std::forward< Fn >( fn)( std::forward< Args >( args) ...);
+invoke( Fn fn, Args && ... args) {
+ return fn( std::forward< Args >( args) ... );
+}
+# endif
+
+template< typename Fn, typename Tpl, std::size_t... I >
+decltype( auto) do_invoke( Fn && fn, Tpl && tpl, std::index_sequence< I ... >) {
+ return invoke( fn,
+ // std::tuple_element<> does not perfect forwarding
+ std::forward< decltype( std::get< I >( std::declval< typename std::decay< Tpl >::type >() ) ) >(
+ std::get< I >( std::forward< typename std::decay< Tpl >::type >( tpl) ) ) ... );
+}
+
+
+template< typename Fn, typename Tpl >
+decltype( auto) do_invoke( Fn && fn, Tpl && tpl) {
+ constexpr auto Size = std::tuple_size< typename std::decay< Tpl >::type >::value;
+ return do_invoke( std::forward< Fn >( fn),
+ std::forward< Tpl >( tpl),
+ std::make_index_sequence< Size >{});
}
}}}
diff --git a/boost/context/execution_context.ipp b/boost/context/execution_context.ipp
index 8832d75c20..ec5443297f 100644
--- a/boost/context/execution_context.ipp
+++ b/boost/context/execution_context.ipp
@@ -12,11 +12,13 @@
#if ! defined(BOOST_CONTEXT_NO_EXECUTION_CONTEXT)
# include <algorithm>
+# include <atomic>
# include <cstddef>
# include <cstdint>
# include <cstdlib>
# include <functional>
# include <memory>
+# include <ostream>
# include <tuple>
# include <utility>
@@ -26,6 +28,7 @@
# include <boost/intrusive_ptr.hpp>
# include <boost/context/detail/invoke.hpp>
+# include <boost/context/fixedsize_stack.hpp>
# include <boost/context/stack_context.hpp>
# include <boost/context/segmented_stack.hpp>
@@ -45,142 +48,148 @@ void __splitstack_setcontext( void * [BOOST_CONTEXT_SEGMENTS]);
namespace boost {
namespace context {
+namespace detail {
-struct preallocated {
- void * sp;
- std::size_t size;
- stack_context sctx;
+struct activation_record {
+ typedef boost::intrusive_ptr< activation_record > ptr_t;
- preallocated( void * sp_, std::size_t size_, stack_context sctx_) noexcept :
- sp( sp_), size( size_), sctx( sctx_) {
- }
-};
+ enum flag_t {
+ flag_main_ctx = 1 << 1,
+ flag_preserve_fpu = 1 << 2
+ };
-class BOOST_CONTEXT_DECL execution_context {
-private:
- struct activation_record {
- typedef boost::intrusive_ptr< activation_record > ptr_t;
-
- enum flag_t {
- flag_main_ctx = 1 << 1,
- flag_preserve_fpu = 1 << 2,
- flag_segmented_stack = 1 << 3
- };
-
- thread_local static activation_record toplevel_rec;
- thread_local static ptr_t current_rec;
-
- std::size_t use_count;
- fcontext_t fctx;
- stack_context sctx;
- int flags;
-
- // used for toplevel-context
- // (e.g. main context, thread-entry context)
- activation_record() noexcept :
- use_count( 1),
- fctx( nullptr),
- sctx(),
- flags( flag_main_ctx) {
- }
-
- activation_record( fcontext_t fctx_, stack_context sctx_, bool use_segmented_stack) noexcept :
- use_count( 0),
- fctx( fctx_),
- sctx( sctx_),
- flags( use_segmented_stack ? flag_segmented_stack : 0) {
- }
-
- virtual ~activation_record() noexcept = default;
-
- void resume( bool fpu = false) noexcept {
- // store current activation record in local variable
- activation_record * from = current_rec.get();
- // store `this` in static, thread local pointer
- // `this` will become the active (running) context
- // returned by execution_context::current()
- current_rec = this;
- // set FPU flag
- if (fpu) {
- from->flags |= flag_preserve_fpu;
- this->flags |= flag_preserve_fpu;
- } else {
- from->flags &= ~flag_preserve_fpu;
- this->flags &= ~flag_preserve_fpu;
- }
+ thread_local static ptr_t current_rec;
+
+ std::atomic< std::size_t > use_count;
+ fcontext_t fctx;
+ stack_context sctx;
+ int flags;
+
+ // used for toplevel-context
+ // (e.g. main context, thread-entry context)
+ activation_record() noexcept :
+ use_count( 0),
+ fctx( nullptr),
+ sctx(),
+ flags( flag_main_ctx) {
+ }
+
+ activation_record( fcontext_t fctx_, stack_context sctx_) noexcept :
+ use_count( 0),
+ fctx( fctx_),
+ sctx( sctx_),
+ flags( 0) {
+ }
+
+ virtual ~activation_record() noexcept = default;
+
+ void * resume( void * vp, bool fpu) noexcept {
+ // store current activation record in local variable
+ activation_record * from = current_rec.get();
+ // store `this` in static, thread local pointer
+ // `this` will become the active (running) context
+ // returned by execution_context::current()
+ current_rec = this;
+ // set FPU flag
+ if (fpu) {
+ from->flags |= flag_preserve_fpu;
+ this->flags |= flag_preserve_fpu;
+ } else {
+ from->flags &= ~flag_preserve_fpu;
+ this->flags &= ~flag_preserve_fpu;
+ }
# if defined(BOOST_USE_SEGMENTED_STACKS)
- if ( 0 != (flags & flag_segmented_stack) ) {
- // adjust segmented stack properties
- __splitstack_getcontext( from->sctx.segments_ctx);
- __splitstack_setcontext( sctx.segments_ctx);
- // context switch from parent context to `this`-context
- jump_fcontext( & from->fctx, fctx, reinterpret_cast< intptr_t >( this), fpu);
- // parent context resumed
- // adjust segmented stack properties
- __splitstack_setcontext( from->sctx.segments_ctx);
- } else {
- // context switch from parent context to `this`-context
- jump_fcontext( & from->fctx, fctx, reinterpret_cast< intptr_t >( this), fpu);
- // parent context resumed
- }
-# else
- // context switch from parent context to `this`-context
- jump_fcontext( & from->fctx, fctx, reinterpret_cast< intptr_t >( this), fpu);
- // parent context resumed
+ // adjust segmented stack properties
+ __splitstack_getcontext( from->sctx.segments_ctx);
+ __splitstack_setcontext( sctx.segments_ctx);
# endif
- }
+ // context switch from parent context to `this`-context
+ intptr_t ret = jump_fcontext( & from->fctx, fctx, reinterpret_cast< intptr_t >( vp), fpu);
+ // parent context resumed
+ return reinterpret_cast< void * >( ret);
+ }
- virtual void deallocate() {}
+ virtual void deallocate() {
+ delete this;
+ }
- friend void intrusive_ptr_add_ref( activation_record * ar) {
- ++ar->use_count;
- }
+ friend void intrusive_ptr_add_ref( activation_record * ar) {
+ ++ar->use_count;
+ }
- friend void intrusive_ptr_release( activation_record * ar) {
- BOOST_ASSERT( nullptr != ar);
+ friend void intrusive_ptr_release( activation_record * ar) {
+ BOOST_ASSERT( nullptr != ar);
- if ( 0 == --ar->use_count) {
- ar->deallocate();
- }
+ if ( 0 == --ar->use_count) {
+ ar->deallocate();
}
- };
+ }
+};
- template< typename Fn, typename StackAlloc >
- class capture_record : public activation_record {
- private:
- StackAlloc salloc_;
- Fn fn_;
-
- static void destroy( capture_record * p) {
- StackAlloc salloc( p->salloc_);
- stack_context sctx( p->sctx);
- // deallocate activation record
- p->~capture_record();
- // destroy stack with stack allocator
- salloc.deallocate( sctx);
- }
+struct activation_record_initializer {
+ activation_record_initializer();
+ ~activation_record_initializer();
+};
- public:
- explicit capture_record( stack_context sctx, StackAlloc const& salloc, fcontext_t fctx, Fn && fn, bool use_segmented_stack) noexcept :
- activation_record( fctx, sctx, use_segmented_stack),
- salloc_( salloc),
- fn_( std::forward< Fn >( fn) ) {
- }
+template< typename Fn, typename Tpl, typename StackAlloc >
+class capture_record : public activation_record {
+private:
+ StackAlloc salloc_;
+ Fn fn_;
+ Tpl tpl_;
+ activation_record * caller_;
+
+ static void destroy( capture_record * p) {
+ StackAlloc salloc( p->salloc_);
+ stack_context sctx( p->sctx);
+ // deallocate activation record
+ p->~capture_record();
+ // destroy stack with stack allocator
+ salloc.deallocate( sctx);
+ }
- void deallocate() override final {
- destroy( this);
- }
+public:
+ explicit capture_record(
+ stack_context sctx, StackAlloc const& salloc,
+ fcontext_t fctx,
+ Fn && fn, Tpl && tpl,
+ activation_record * caller) noexcept :
+ activation_record( fctx, sctx),
+ salloc_( salloc),
+ fn_( std::forward< Fn >( fn) ),
+ tpl_( std::forward< Tpl >( tpl) ),
+ caller_( caller) {
+ }
+
+ void deallocate() override final {
+ destroy( this);
+ }
- void run() noexcept {
- try {
- fn_();
- } catch (...) {
- std::terminate();
- }
- BOOST_ASSERT( 0 == (flags & flag_main_ctx) );
+ void run() noexcept {
+ try {
+ void * vp = caller_->resume( caller_, true);
+ do_invoke( fn_, std::tuple_cat( tpl_, std::tie( vp) ) );
+ } catch (...) {
+ std::terminate();
}
- };
+ BOOST_ASSERT( 0 == (flags & flag_main_ctx) );
+ }
+};
+
+}
+
+struct preallocated {
+ void * sp;
+ std::size_t size;
+ stack_context sctx;
+ preallocated( void * sp_, std::size_t size_, stack_context sctx_) noexcept :
+ sp( sp_), size( size_), sctx( sctx_) {
+ }
+};
+
+class BOOST_CONTEXT_DECL execution_context {
+private:
// tampoline function
// entered if the execution context
// is resumed for the first time
@@ -195,13 +204,15 @@ private:
ar->run();
}
- typedef boost::intrusive_ptr< activation_record > ptr_t;
+ typedef boost::intrusive_ptr< detail::activation_record > ptr_t;
ptr_t ptr_;
- template< typename StackAlloc, typename Fn >
- static activation_record * create_context( StackAlloc salloc, Fn && fn, bool use_segmented_stack) {
- typedef capture_record< Fn, StackAlloc > capture_t;
+ template< typename StackAlloc, typename Fn ,typename Tpl >
+ static detail::activation_record * create_context(
+ StackAlloc salloc,
+ Fn && fn, Tpl && tpl) {
+ typedef detail::capture_record< Fn, Tpl, StackAlloc > capture_t;
stack_context sctx( salloc.allocate() );
// reserve space for control structure
@@ -223,13 +234,18 @@ private:
// create fast-context
fcontext_t fctx = make_fcontext( sp, size, & execution_context::entry_func< capture_t >);
BOOST_ASSERT( nullptr != fctx);
+ // get current activation record
+ ptr_t curr = execution_context::current().ptr_;
// placment new for control structure on fast-context stack
- return new ( sp) capture_t( sctx, salloc, fctx, std::forward< Fn >( fn), use_segmented_stack);
+ return new ( sp) capture_t(
+ sctx, salloc, fctx, std::forward< Fn >( fn), std::forward< Tpl >( tpl), curr.get() );
}
- template< typename StackAlloc, typename Fn >
- static activation_record * create_context( preallocated palloc, StackAlloc salloc, Fn && fn, bool use_segmented_stack) {
- typedef capture_record< Fn, StackAlloc > capture_t;
+ template< typename StackAlloc, typename Fn , typename Tpl >
+ static detail::activation_record * create_context(
+ preallocated palloc, StackAlloc salloc,
+ Fn && fn, Tpl && tpl) {
+ typedef detail::capture_record< Fn, Tpl, StackAlloc > capture_t;
// reserve space for control structure
#if defined(BOOST_NO_CXX14_CONSTEXPR) || defined(BOOST_NO_CXX11_STD_ALIGN)
@@ -250,119 +266,181 @@ private:
// create fast-context
fcontext_t fctx = make_fcontext( sp, size, & execution_context::entry_func< capture_t >);
BOOST_ASSERT( nullptr != fctx);
+ // get current activation record
+ ptr_t curr = execution_context::current().ptr_;
// placment new for control structure on fast-context stack
- return new ( sp) capture_t( palloc.sctx, salloc, fctx, std::forward< Fn >( fn), use_segmented_stack);
- }
-
- template< typename StackAlloc, typename Fn, typename Tpl, std::size_t ... I >
- static activation_record * create_capture_record( StackAlloc salloc,
- Fn && fn_, Tpl && tpl_,
- std::index_sequence< I ... >,
- bool use_segmented_stack) {
- return create_context(
- salloc,
- // lambda, executed in new execution context
- [fn=std::forward< Fn >( fn_),tpl=std::forward< Tpl >( tpl_)] () mutable -> decltype( auto) {
- detail::invoke( fn,
- // non-type template parameter pack used to extract the
- // parameters (arguments) from the tuple and pass them to fn
- // via parameter pack expansion
- // std::tuple_element<> does not perfect forwarding
- std::forward< decltype( std::get< I >( std::declval< Tpl >() ) ) >(
- std::get< I >( std::forward< Tpl >( tpl) ) ) ... );
- },
- use_segmented_stack);
- }
-
- template< typename StackAlloc, typename Fn, typename Tpl, std::size_t ... I >
- static activation_record * create_capture_record( preallocated palloc, StackAlloc salloc,
- Fn && fn_, Tpl && tpl_,
- std::index_sequence< I ... >,
- bool use_segmented_stack) {
- return create_context(
- palloc, salloc,
- // lambda, executed in new execution context
- [fn=std::forward< Fn >( fn_),tpl=std::forward< Tpl >( tpl_)] () mutable -> decltype( auto) {
- detail::invoke( fn,
- // non-type template parameter pack used to extract the
- // parameters (arguments) from the tuple and pass them to fn
- // via parameter pack expansion
- // std::tuple_element<> does not perfect forwarding
- std::forward< decltype( std::get< I >( std::declval< Tpl >() ) ) >(
- std::get< I >( std::forward< Tpl >( tpl) ) ) ... );
- },
- use_segmented_stack);
+ return new ( sp) capture_t(
+ palloc.sctx, salloc, fctx, std::forward< Fn >( fn), std::forward< Tpl >( tpl), curr.get() );
}
execution_context() :
// default constructed with current activation_record
- ptr_( activation_record::current_rec) {
+ ptr_( detail::activation_record::current_rec) {
}
public:
- static execution_context current() noexcept {
- return execution_context();
- }
+ static execution_context current() noexcept;
# if defined(BOOST_USE_SEGMENTED_STACKS)
template< typename Fn, typename ... Args >
- explicit execution_context( segmented_stack salloc, Fn && fn, Args && ... args) :
+ explicit execution_context( Fn && fn, Args && ... args) :
// deferred execution of fn and its arguments
// arguments are stored in std::tuple<>
// non-type template parameter pack via std::index_sequence_for<>
// preserves the number of arguments
// used to extract the function arguments from std::tuple<>
- ptr_( create_capture_record( salloc,
- std::forward< Fn >( fn),
- std::make_tuple( std::forward< Args >( args) ... ),
- std::index_sequence_for< Args ... >(), true) ) {
+ ptr_( create_context( segmented_stack(),
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...) ) ) {
+ ptr_->resume( ptr_.get(), true);
}
template< typename Fn, typename ... Args >
- explicit execution_context( preallocated palloc, segmented_stack salloc, Fn && fn, Args && ... args) :
+ explicit execution_context( std::allocator_arg_t, segmented_stack salloc, Fn && fn, Args && ... args) :
// deferred execution of fn and its arguments
// arguments are stored in std::tuple<>
// non-type template parameter pack via std::index_sequence_for<>
// preserves the number of arguments
// used to extract the function arguments from std::tuple<>
- ptr_( create_capture_record( palloc, salloc,
- std::forward< Fn >( fn),
- std::make_tuple( std::forward< Args >( args) ... ),
- std::index_sequence_for< Args ... >(), true) ) {
+ ptr_( create_context( salloc,
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...) ) ) {
+ ptr_->resume( ptr_.get(), true);
+ }
+
+ template< typename Fn, typename ... Args >
+ explicit execution_context( std::allocator_arg_t, preallocated palloc, segmented_stack salloc, Fn && fn, Args && ... args) :
+ // deferred execution of fn and its arguments
+ // arguments are stored in std::tuple<>
+ // non-type template parameter pack via std::index_sequence_for<>
+ // preserves the number of arguments
+ // used to extract the function arguments from std::tuple<>
+ ptr_( create_context( palloc, salloc,
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...) ) ) {
+ ptr_->resume( ptr_.get(), true);
+ }
+# else
+ template< typename Fn, typename ... Args >
+ explicit execution_context( Fn && fn, Args && ... args) :
+ // deferred execution of fn and its arguments
+ // arguments are stored in std::tuple<>
+ // non-type template parameter pack via std::index_sequence_for<>
+ // preserves the number of arguments
+ // used to extract the function arguments from std::tuple<>
+ ptr_( create_context( fixedsize_stack(),
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...) ) ) {
+ ptr_->resume( ptr_.get(), true);
}
-# endif
template< typename StackAlloc, typename Fn, typename ... Args >
- explicit execution_context( StackAlloc salloc, Fn && fn, Args && ... args) :
+ explicit execution_context( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Args && ... args) :
// deferred execution of fn and its arguments
// arguments are stored in std::tuple<>
// non-type template parameter pack via std::index_sequence_for<>
// preserves the number of arguments
// used to extract the function arguments from std::tuple<>
- ptr_( create_capture_record( salloc,
- std::forward< Fn >( fn),
- std::make_tuple( std::forward< Args >( args) ... ),
- std::index_sequence_for< Args ... >(), false) ) {
+ ptr_( create_context( salloc,
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...) ) ) {
+ ptr_->resume( ptr_.get(), true);
}
template< typename StackAlloc, typename Fn, typename ... Args >
- explicit execution_context( preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args) :
+ explicit execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args) :
// deferred execution of fn and its arguments
// arguments are stored in std::tuple<>
// non-type template parameter pack via std::index_sequence_for<>
// preserves the number of arguments
// used to extract the function arguments from std::tuple<>
- ptr_( create_capture_record( palloc, salloc,
- std::forward< Fn >( fn),
- std::make_tuple( std::forward< Args >( args) ... ),
- std::index_sequence_for< Args ... >(), false) ) {
+ ptr_( create_context( palloc, salloc,
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...) ) ) {
+ ptr_->resume( ptr_.get(), true);
+ }
+# endif
+
+ execution_context( execution_context const& other) noexcept :
+ ptr_( other.ptr_) {
}
- void operator()( bool preserve_fpu = false) noexcept {
- ptr_->resume( preserve_fpu);
+ execution_context( execution_context && other) noexcept :
+ ptr_( other.ptr_) {
+ other.ptr_.reset();
+ }
+
+ execution_context & operator=( execution_context const& other) noexcept {
+ if ( this != & other) {
+ ptr_ = other.ptr_;
+ }
+ return * this;
+ }
+
+ execution_context & operator=( execution_context && other) noexcept {
+ if ( this != & other) {
+ ptr_ = other.ptr_;
+ other.ptr_.reset();
+ }
+ return * this;
+ }
+
+ void * operator()( void * vp = nullptr, bool preserve_fpu = false) noexcept {
+ return ptr_->resume( vp, preserve_fpu);
+ }
+
+ explicit operator bool() const noexcept {
+ return nullptr != ptr_.get();
+ }
+
+ bool operator!() const noexcept {
+ return nullptr == ptr_.get();
+ }
+
+ bool operator==( execution_context const& other) const noexcept {
+ return ptr_ == other.ptr_;
+ }
+
+ bool operator!=( execution_context const& other) const noexcept {
+ return ptr_ != other.ptr_;
+ }
+
+ bool operator<( execution_context const& other) const noexcept {
+ return ptr_ < other.ptr_;
+ }
+
+ bool operator>( execution_context const& other) const noexcept {
+ return other.ptr_ < ptr_;
+ }
+
+ bool operator<=( execution_context const& other) const noexcept {
+ return ! ( * this > other);
+ }
+
+ bool operator>=( execution_context const& other) const noexcept {
+ return ! ( * this < other);
+ }
+
+ template< typename charT, class traitsT >
+ friend std::basic_ostream< charT, traitsT > &
+ operator<<( std::basic_ostream< charT, traitsT > & os, execution_context const& other) {
+ if ( nullptr != other.ptr_) {
+ return os << other.ptr_;
+ } else {
+ return os << "{not-valid}";
+ }
+ }
+
+ void swap( execution_context & other) noexcept {
+ ptr_.swap( other.ptr_);
}
};
+inline
+void swap( execution_context & l, execution_context & r) noexcept {
+ l.swap( r);
+}
+
}}
# ifdef BOOST_HAS_ABI_HEADERS
diff --git a/boost/context/execution_context_winfib.ipp b/boost/context/execution_context_winfib.ipp
index 7b0a92b550..1b106fa245 100644
--- a/boost/context/execution_context_winfib.ipp
+++ b/boost/context/execution_context_winfib.ipp
@@ -13,6 +13,8 @@
#include <windows.h>
+#include <algorithm>
+#include <atomic>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
@@ -25,6 +27,7 @@
#include <boost/intrusive_ptr.hpp>
#include <boost/context/detail/invoke.hpp>
+#include <boost/context/fixedsize_stack.hpp>
#include <boost/context/stack_context.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
@@ -33,132 +36,162 @@
namespace boost {
namespace context {
+namespace detail {
-struct preallocated {
- void * sp;
- std::size_t size;
- stack_context sctx;
+struct activation_record {
+ typedef boost::intrusive_ptr< activation_record > ptr_t;
- preallocated( void * sp_, std::size_t size_, stack_context sctx_) noexcept :
- sp( sp_), size( size_), sctx( sctx_) {
- }
-};
+ enum flag_t {
+ flag_main_ctx = 1 << 1,
+ flag_preserve_fpu = 1 << 2,
+ flag_segmented_stack = 1 << 3
+ };
-class BOOST_CONTEXT_DECL execution_context {
-private:
- struct activation_record {
- typedef boost::intrusive_ptr< activation_record > ptr_t;
-
- enum flag_t {
- flag_main_ctx = 1 << 1,
- flag_preserve_fpu = 1 << 2,
- flag_segmented_stack = 1 << 3
- };
-
- thread_local static activation_record toplevel_rec;
- thread_local static ptr_t current_rec;
-
- std::size_t use_count;
- LPVOID fiber;
- stack_context sctx;
- int flags;
-
- // used for toplevel-context
- // (e.g. main context, thread-entry context)
- activation_record() noexcept :
- use_count( 1),
- fiber( nullptr),
- sctx(),
- flags( flag_main_ctx) {
- }
-
- activation_record( stack_context sctx_, bool use_segmented_stack) noexcept :
- use_count( 0),
- fiber( nullptr),
- sctx( sctx_),
- flags( use_segmented_stack ? flag_segmented_stack : 0) {
- }
-
- virtual ~activation_record() noexcept = default;
-
- void resume() noexcept {
- // store current activation record in local variable
- activation_record * from = current_rec.get();
- // store `this` in static, thread local pointer
- // `this` will become the active (running) context
- // returned by execution_context::current()
- current_rec = this;
- // context switch from parent context to `this`-context
+ thread_local static ptr_t current_rec;
+
+ std::atomic< std::size_t > use_count;
+ LPVOID fiber;
+ stack_context sctx;
+ void * data;
+ int flags;
+
+ // used for toplevel-context
+ // (e.g. main context, thread-entry context)
+ activation_record() noexcept :
+ use_count( 0),
+ fiber( nullptr),
+ sctx(),
+ flags( flag_main_ctx
+# if defined(BOOST_USE_SEGMENTED_STACKS)
+ | flag_segmented_stack
+# endif
+ ) {
+ }
+
+ activation_record( stack_context sctx_, bool use_segmented_stack) noexcept :
+ use_count( 0),
+ fiber( nullptr),
+ sctx( sctx_),
+ data( nullptr),
+ flags( use_segmented_stack ? flag_segmented_stack : 0) {
+ }
+
+ virtual ~activation_record() noexcept = default;
+
+ void * resume( void * vp, bool fpu) noexcept {
+ // store current activation record in local variable
+ activation_record * from = current_rec.get();
+ // store `this` in static, thread local pointer
+ // `this` will become the active (running) context
+ // returned by execution_context::current()
+ current_rec = this;
+ // context switch from parent context to `this`-context
#if ( _WIN32_WINNT > 0x0600)
- if ( ::IsThreadAFiber() ) {
- from->fiber = ::GetCurrentFiber();
- } else {
- from->fiber = ::ConvertThreadToFiber( nullptr);
- }
-#else
+ if ( ::IsThreadAFiber() ) {
+ from->fiber = ::GetCurrentFiber();
+ } else {
from->fiber = ::ConvertThreadToFiber( nullptr);
- if ( nullptr == from->fiber) {
- DWORD err = ::GetLastError();
- BOOST_ASSERT( ERROR_ALREADY_FIBER == err);
- from->fiber = ::GetCurrentFiber();
- BOOST_ASSERT( nullptr != from->fiber);
- BOOST_ASSERT( reinterpret_cast< LPVOID >( 0x1E00) != from->fiber);
- }
-#endif
- ::SwitchToFiber( fiber);
}
+#else
+ from->fiber = ::ConvertThreadToFiber( nullptr);
+ if ( nullptr == from->fiber) {
+ DWORD err = ::GetLastError();
+ BOOST_ASSERT( ERROR_ALREADY_FIBER == err);
+ from->fiber = ::GetCurrentFiber();
+ BOOST_ASSERT( nullptr != from->fiber);
+ BOOST_ASSERT( reinterpret_cast< LPVOID >( 0x1E00) != from->fiber);
+ }
+#endif
+ // store passed argument (void pointer)
+ data = vp;
+ // context switch
+ ::SwitchToFiber( fiber);
+ // access the activation-record of the current fiber
+ activation_record * ar = static_cast< activation_record * >( GetFiberData() );
+ return nullptr != ar ? ar->data : nullptr;
+ }
- virtual void deallocate() {}
+ virtual void deallocate() {
+ delete this;
+ }
- friend void intrusive_ptr_add_ref( activation_record * ar) {
- ++ar->use_count;
- }
+ friend void intrusive_ptr_add_ref( activation_record * ar) {
+ ++ar->use_count;
+ }
- friend void intrusive_ptr_release( activation_record * ar) {
- BOOST_ASSERT( nullptr != ar);
+ friend void intrusive_ptr_release( activation_record * ar) {
+ BOOST_ASSERT( nullptr != ar);
- if ( 0 == --ar->use_count) {
- ar->deallocate();
- }
+ if ( 0 == --ar->use_count) {
+ ar->deallocate();
}
- };
+ }
+};
- template< typename Fn, typename StackAlloc >
- class capture_record : public activation_record {
- private:
- StackAlloc salloc_;
- Fn fn_;
-
- static void destroy( capture_record * p) {
- StackAlloc salloc( p->salloc_);
- stack_context sctx( p->sctx);
- // deallocate activation record
- p->~capture_record();
- // destroy stack with stack allocator
- salloc.deallocate( sctx);
- }
+struct activation_record_initializer {
+ activation_record_initializer();
+ ~activation_record_initializer();
+};
- public:
- explicit capture_record( stack_context sctx, StackAlloc const& salloc, Fn && fn, bool use_segmented_stack) noexcept :
- activation_record( sctx, use_segmented_stack),
- salloc_( salloc),
- fn_( std::forward< Fn >( fn) ) {
- }
+template< typename Fn, typename Tpl, typename StackAlloc >
+class capture_record : public activation_record {
+private:
+ StackAlloc salloc_;
+ Fn fn_;
+ Tpl tpl_;
+ activation_record * caller_;
+
+ static void destroy( capture_record * p) {
+ StackAlloc salloc( p->salloc_);
+ stack_context sctx( p->sctx);
+ // deallocate activation record
+ p->~capture_record();
+ // destroy stack with stack allocator
+ salloc.deallocate( sctx);
+ }
- void deallocate() override final {
- destroy( this);
- }
+public:
+ explicit capture_record(
+ stack_context sctx, StackAlloc const& salloc,
+ Fn && fn, Tpl && tpl,
+ activation_record * caller,
+ bool use_segmented_stack) noexcept :
+ activation_record( sctx, use_segmented_stack),
+ salloc_( salloc),
+ fn_( std::forward< Fn >( fn) ),
+ tpl_( std::forward< Tpl >( tpl) ),
+ caller_( caller) {
+ }
- void run() noexcept {
- try {
- fn_();
- } catch (...) {
- std::terminate();
- }
- BOOST_ASSERT( 0 == (flags & flag_main_ctx) );
+ void deallocate() override final {
+ destroy( this);
+ }
+
+ void run() noexcept {
+ try {
+ void * vp = caller_->resume( caller_, true);
+ do_invoke( fn_, std::tuple_cat( tpl_, std::tie( vp) ) );
+ } catch (...) {
+ std::terminate();
}
- };
+ BOOST_ASSERT( 0 == (flags & flag_main_ctx) );
+ }
+};
+}
+
+struct preallocated {
+ void * sp;
+ std::size_t size;
+ stack_context sctx;
+
+ preallocated( void * sp_, std::size_t size_, stack_context sctx_) noexcept :
+ sp( sp_), size( size_), sctx( sctx_) {
+ }
+};
+
+class BOOST_CONTEXT_DECL execution_context {
+private:
// tampoline function
// entered if the execution context
// is resumed for the first time
@@ -173,23 +206,30 @@ private:
::DeleteFiber( ar->fiber);
}
- typedef boost::intrusive_ptr< activation_record > ptr_t;
+ typedef boost::intrusive_ptr< detail::activation_record > ptr_t;
ptr_t ptr_;
- template< typename StackAlloc, typename Fn >
- static activation_record * create_context( StackAlloc salloc, Fn && fn, bool use_segmented_stack) {
- typedef capture_record< Fn, StackAlloc > capture_t;
+ template< typename StackAlloc, typename Fn ,typename Tpl >
+ static detail::activation_record * create_context(
+ StackAlloc salloc,
+ Fn && fn, Tpl && tpl,
+ bool use_segmented_stack) {
+ typedef detail::capture_record< Fn, Tpl, StackAlloc > capture_t;
// hackish
std::size_t fsize = salloc.size_;
- salloc.size_ = sizeof( capture_t);
+ // protected_fixedsize_stack needs at least 2*page-size
+ salloc.size_ = ( std::max)( sizeof( capture_t), 2 * stack_traits::page_size() );
stack_context sctx( salloc.allocate() );
// reserve space for control structure
void * sp = static_cast< char * >( sctx.sp) - sizeof( capture_t);
- // placment new for control structure on fast-context stack
- capture_t * cr = new ( sp) capture_t( sctx, salloc, std::forward< Fn >( fn), use_segmented_stack);
+ // get current activation record
+ ptr_t curr = execution_context::current().ptr_;
+ // placement new for control structure on fast-context stack
+ capture_t * cr = new ( sp) capture_t(
+ sctx, salloc, std::forward< Fn >( fn), std::forward< Tpl >( tpl), curr.get(), use_segmented_stack);
// create fiber
// use default stacksize
cr->fiber = ::CreateFiber( fsize, execution_context::entry_func< capture_t >, cr);
@@ -197,18 +237,25 @@ private:
return cr;
}
- template< typename StackAlloc, typename Fn >
- static activation_record * create_context( preallocated palloc, StackAlloc salloc, Fn && fn, bool use_segmented_stack) {
- typedef capture_record< Fn, StackAlloc > capture_t;
+ template< typename StackAlloc, typename Fn , typename Tpl >
+ static detail::activation_record * create_context(
+ preallocated palloc, StackAlloc salloc,
+ Fn && fn, Tpl && tpl,
+ bool use_segmented_stack) {
+ typedef detail::capture_record< Fn, Tpl, StackAlloc > capture_t;
// hackish
std::size_t fsize = salloc.size_;
- salloc.size_ = sizeof( capture_t);
+ // protected_fixedsize_stack needs at least 2*page-size
+ salloc.size_ = ( std::max)( sizeof( capture_t), 2 * stack_traits::page_size() );
// reserve space for control structure
void * sp = static_cast< char * >( palloc.sp) - sizeof( capture_t);
- // placment new for control structure on fast-context stack
- capture_t * cr = new ( sp) capture_t( palloc.sctx, salloc, std::forward< Fn >( fn), use_segmented_stack);
+ // get current activation record
+ ptr_t curr = execution_context::current().ptr_;
+ // placement new for control structure on fast-context stack
+ capture_t * cr = new ( sp) capture_t(
+ palloc.sctx, salloc, std::forward< Fn >( fn), std::forward< Tpl >( tpl), curr.get(), use_segmented_stack);
// create fiber
// use default stacksize
cr->fiber = ::CreateFiber( fsize, execution_context::entry_func< capture_t >, cr);
@@ -216,84 +263,90 @@ private:
return cr;
}
- template< typename StackAlloc, typename Fn, typename Tpl, std::size_t ... I >
- static activation_record * create_capture_record( StackAlloc salloc,
- Fn && fn_, Tpl && tpl_,
- std::index_sequence< I ... >,
- bool use_segmented_stack) {
- return create_context(
- salloc,
- // lambda, executed in new execution context
- [fn=std::forward< Fn >( fn_),tpl=std::forward< Tpl >( tpl_)] () mutable -> decltype( auto) {
- detail::invoke( fn,
- // non-type template parameter pack used to extract the
- // parameters (arguments) from the tuple and pass them to fn
- // via parameter pack expansion
- // std::tuple_element<> does not perfect forwarding
- std::forward< decltype( std::get< I >( std::declval< Tpl >() ) ) >(
- std::get< I >( std::forward< Tpl >( tpl) ) ) ... );
- },
- use_segmented_stack);
- }
-
- template< typename StackAlloc, typename Fn, typename Tpl, std::size_t ... I >
- static activation_record * create_capture_record( preallocated palloc, StackAlloc salloc,
- Fn && fn_, Tpl && tpl_,
- std::index_sequence< I ... >,
- bool use_segmented_stack) {
- return create_context(
- palloc, salloc,
- // lambda, executed in new execution context
- [fn=std::forward< Fn >( fn_),tpl=std::forward< Tpl >( tpl_)] () mutable -> decltype( auto) {
- detail::invoke( fn,
- // non-type template parameter pack used to extract the
- // parameters (arguments) from the tuple and pass them to fn
- // via parameter pack expansion
- // std::tuple_element<> does not perfect forwarding
- std::forward< decltype( std::get< I >( std::declval< Tpl >() ) ) >(
- std::get< I >( std::forward< Tpl >( tpl) ) ) ... );
- },
- use_segmented_stack);
- }
-
execution_context() :
// default constructed with current activation_record
- ptr_( activation_record::current_rec) {
+ ptr_( detail::activation_record::current_rec) {
}
public:
- static execution_context current() noexcept {
- return execution_context();
+ static execution_context current() noexcept;
+
+ template< typename Fn, typename ... Args >
+ explicit execution_context( Fn && fn, Args && ... args) :
+ // deferred execution of fn and its arguments
+ // arguments are stored in std::tuple<>
+ // non-type template parameter pack via std::index_sequence_for<>
+ // preserves the number of arguments
+ // used to extract the function arguments from std::tuple<>
+ ptr_( create_context( fixedsize_stack(),
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...),
+ false) ) {
+ ptr_->resume( ptr_.get(), true);
}
template< typename StackAlloc, typename Fn, typename ... Args >
- explicit execution_context( StackAlloc salloc, Fn && fn, Args && ... args) :
+ explicit execution_context( std::allocator_arg_t, StackAlloc salloc, Fn && fn, Args && ... args) :
// deferred execution of fn and its arguments
// arguments are stored in std::tuple<>
// non-type template parameter pack via std::index_sequence_for<>
// preserves the number of arguments
// used to extract the function arguments from std::tuple<>
- ptr_( create_capture_record( salloc,
- std::forward< Fn >( fn),
- std::make_tuple( std::forward< Args >( args) ... ),
- std::index_sequence_for< Args ... >(), false) ) {
+ ptr_( create_context( salloc,
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...),
+ false) ) {
+ ptr_->resume( ptr_.get(), true);
}
template< typename StackAlloc, typename Fn, typename ... Args >
- explicit execution_context( preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args) :
+ explicit execution_context( std::allocator_arg_t, preallocated palloc, StackAlloc salloc, Fn && fn, Args && ... args) :
// deferred execution of fn and its arguments
// arguments are stored in std::tuple<>
// non-type template parameter pack via std::index_sequence_for<>
// preserves the number of arguments
// used to extract the function arguments from std::tuple<>
- ptr_( create_capture_record( palloc, salloc,
- std::forward< Fn >( fn),
- std::make_tuple( std::forward< Args >( args) ... ),
- std::index_sequence_for< Args ... >(), false) ) {
+ ptr_( create_context( palloc, salloc,
+ std::forward< Fn >( fn),
+ std::make_tuple( std::forward< Args >( args) ...),
+ false) ) {
+ ptr_->resume( ptr_.get(), true);
+ }
+
+ execution_context( execution_context const& other) noexcept :
+ ptr_( other.ptr_) {
+ }
+
+ execution_context( execution_context && other) noexcept :
+ ptr_( other.ptr_) {
+ other.ptr_.reset();
+ }
+
+ execution_context & operator=( execution_context const& other) noexcept {
+ if ( this != & other) {
+ ptr_ = other.ptr_;
+ }
+ return * this;
+ }
+
+ execution_context & operator=( execution_context && other) noexcept {
+ if ( this != & other) {
+ ptr_ = other.ptr_;
+ other.ptr_.reset();
+ }
+ return * this;
+ }
+
+ explicit operator bool() const noexcept {
+ return nullptr != ptr_.get();
+ }
+
+ bool operator!() const noexcept {
+ return nullptr == ptr_.get();
}
- void operator()( bool preserve_fpu = false) noexcept {
- ptr_->resume();
+ void * operator()( void * vp = nullptr, bool preserve_fpu = false) noexcept {
+ return ptr_->resume( vp, preserve_fpu);
}
};
diff --git a/boost/context/fixedsize_stack.hpp b/boost/context/fixedsize_stack.hpp
index ab19609e87..b27d785d08 100644
--- a/boost/context/fixedsize_stack.hpp
+++ b/boost/context/fixedsize_stack.hpp
@@ -62,7 +62,7 @@ public:
void deallocate( stack_context & sctx) {
BOOST_ASSERT( sctx.sp);
-#if defined(BOOST_USE_WINFIBERS)
+#if ! defined(BOOST_USE_WINFIBERS)
BOOST_ASSERT( traits_type::minimum_size() <= sctx.size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= sctx.size) );
#endif
@@ -77,6 +77,9 @@ public:
};
typedef basic_fixedsize_stack< stack_traits > fixedsize_stack;
+# if ! defined(BOOST_USE_SEGMENTED_STACKS)
+typedef fixedsize_stack default_stack;
+# endif
}}
diff --git a/boost/context/posix/protected_fixedsize_stack.hpp b/boost/context/posix/protected_fixedsize_stack.hpp
index c7e09439fc..25ce9a6828 100644
--- a/boost/context/posix/protected_fixedsize_stack.hpp
+++ b/boost/context/posix/protected_fixedsize_stack.hpp
@@ -58,7 +58,7 @@ public:
static_cast< float >( size_) / traits_type::page_size() ) ) );
BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
const std::size_t size__( pages * traits_type::page_size() );
- BOOST_ASSERT( 0 < size_ && 0 < size__);
+ BOOST_ASSERT( 0 != size_ && 0 != size__);
BOOST_ASSERT( size__ <= size_);
// conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
diff --git a/boost/context/posix/segmented_stack.hpp b/boost/context/posix/segmented_stack.hpp
index f4a32d7394..93f4210fd4 100644
--- a/boost/context/posix/segmented_stack.hpp
+++ b/boost/context/posix/segmented_stack.hpp
@@ -71,6 +71,9 @@ public:
};
typedef basic_segmented_stack< stack_traits > segmented_stack;
+# if defined(BOOST_USE_SEGMENTED_STACKS)
+typedef segmented_stack default_stack;
+# endif
}}
diff --git a/boost/context/stack_context.hpp b/boost/context/stack_context.hpp
index 48863b3bc8..24a54e5748 100644
--- a/boost/context/stack_context.hpp
+++ b/boost/context/stack_context.hpp
@@ -31,7 +31,11 @@ struct stack_context {
unsigned valgrind_stack_id;
#endif
+#if defined(BOOST_NO_CXX11_CONSTEXPR)
stack_context() :
+#else
+ constexpr stack_context() :
+#endif
size( 0),
sp( 0),
segments_ctx()
@@ -48,7 +52,11 @@ struct stack_context {
unsigned valgrind_stack_id;
#endif
+#if defined(BOOST_NO_CXX11_CONSTEXPR)
stack_context() :
+#else
+ constexpr stack_context() :
+#endif
size( 0),
sp( 0)
#if defined(BOOST_USE_VALGRIND)
diff --git a/boost/context/windows/protected_fixedsize_stack.hpp b/boost/context/windows/protected_fixedsize_stack.hpp
index e6efee62cf..548bcda31f 100644
--- a/boost/context/windows/protected_fixedsize_stack.hpp
+++ b/boost/context/windows/protected_fixedsize_stack.hpp
@@ -54,7 +54,7 @@ public:
static_cast< float >( size_) / traits_type::page_size() ) ) );
BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
const std::size_t size__( pages * traits_type::page_size() );
- BOOST_ASSERT( 0 < size_ && 0 < size__);
+ BOOST_ASSERT( 0 != size_ && 0 != size__);
BOOST_ASSERT( size__ <= size_);
void * vp = ::VirtualAlloc( 0, size__, MEM_COMMIT, PAGE_READWRITE);
@@ -78,7 +78,7 @@ public:
void deallocate( stack_context & sctx) {
BOOST_ASSERT( sctx.sp);
-#if defined(BOOST_USE_WINFIBERS)
+#if ! defined(BOOST_USE_WINFIBERS)
BOOST_ASSERT( traits_type::minimum_size() <= sctx.size);
BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= sctx.size) );
#endif
diff --git a/boost/convert/base.hpp b/boost/convert/base.hpp
index 128c46f3a5..3d446641d2 100644
--- a/boost/convert/base.hpp
+++ b/boost/convert/base.hpp
@@ -55,25 +55,29 @@ struct boost::cnv::cnvbase
}
// Basic type to string
- BOOST_CNV_TO_STRING ( int_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING ( uint_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING ( lint_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING (ulint_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING ( sint_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING (usint_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING ( flt_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING ( dbl_type v, optional<string_type>& r) const { to_str_(v, r); }
- BOOST_CNV_TO_STRING ( ldbl_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( int_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( uint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( lint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( llint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( ulint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING (ullint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( sint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( usint_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( flt_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( dbl_type v, optional<string_type>& r) const { to_str_(v, r); }
+ BOOST_CNV_TO_STRING ( ldbl_type v, optional<string_type>& r) const { to_str_(v, r); }
// String to basic type
- BOOST_CNV_STRING_TO (string_type const& s, optional< int_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional< uint_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional< lint_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional<ulint_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional< sint_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional<usint_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional< flt_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional< dbl_type>& r) const { str_to_(s, r); }
- BOOST_CNV_STRING_TO (string_type const& s, optional< ldbl_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< int_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< uint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< lint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< llint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< ulint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional<ullint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< sint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< usint_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< flt_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< dbl_type>& r) const { str_to_(s, r); }
+ BOOST_CNV_STRING_TO (string_type const& s, optional< ldbl_type>& r) const { str_to_(s, r); }
// Formatters
// BOOST_CNV_PARAM (locale, std::locale const) { locale_ = arg[ARG:: locale]; return dncast(); }
BOOST_CNV_PARAM (base, base::type const) { base_ = arg[ARG:: base]; return dncast(); }
@@ -104,8 +108,11 @@ struct boost::cnv::cnvbase
{
cnv::range<string_type const> range (str);
- /**/ if (skipws_) for (; std::isspace(*range.begin()); ++range);
- else if (std::isspace(*range.begin())) return;
+ if (skipws_)
+ for (; !range.empty() && std::isspace(*range.begin()); ++range);
+
+ if (range.empty()) return;
+ if (std::isspace(*range.begin())) return;
dncast().str_to(range, result_out);
}
diff --git a/boost/convert/detail/forward.hpp b/boost/convert/detail/forward.hpp
index 5548aec3fe..8d86d8c6a1 100644
--- a/boost/convert/detail/forward.hpp
+++ b/boost/convert/detail/forward.hpp
@@ -11,6 +11,7 @@
# pragma warning(disable: 4996)
# pragma warning(disable: 4180) // qualifier applied to function type has no meaning
# pragma warning(disable: 4100) // unreferenced formal parameter
+# pragma warning(disable: 4146) // unary minus operator applied to unsigned type
#if _MSC_VER < 1900 /* MSVC-14 defines real snprintf()... just about time! */
# define snprintf _snprintf
diff --git a/boost/convert/detail/range.hpp b/boost/convert/detail/range.hpp
index 439fbf48d0..cdfe7b7401 100644
--- a/boost/convert/detail/range.hpp
+++ b/boost/convert/detail/range.hpp
@@ -50,37 +50,41 @@ namespace boost { namespace cnv
typedef typename cnv::iterator<T>::const_type const_iterator;
typedef const_iterator sentry_type;
- range_base (iterator b, iterator e) : begin_(b), end_(e) {}
-
iterator begin () { return begin_; }
- iterator end () { return end_; }
const_iterator begin () const { return begin_; }
- const_iterator end () const { return end_; }
- sentry_type sentry () const { return end_; }
void operator++ () { ++begin_; }
- void operator-- () { --end_; }
+// void operator-- () { --end_; }
protected:
+ range_base (iterator b, iterator e) : begin_(b), end_(e) {}
+
iterator begin_;
- mutable iterator end_;
+ iterator mutable end_;
};
template<typename T>
struct range<T, typename enable_if<is_range<T> >::type> : public range_base<T>
{
- typedef range this_type;
- typedef range_base<T> base_type;
+ typedef range this_type;
+ typedef range_base<T> base_type;
+ typedef typename base_type::iterator iterator;
+ typedef typename base_type::const_iterator const_iterator;
+ typedef const_iterator sentry_type;
range (T& r) : base_type(r.begin(), r.end()) {}
+
+ iterator end () { return base_type::end_; }
+ const_iterator end () const { return base_type::end_; }
+ sentry_type sentry () const { return base_type::end_; }
+ bool empty () const { return base_type::begin_ == base_type::end_; }
};
template<typename T>
struct range<T*, typename enable_if<cnv::is_char<T> >::type> : public range_base<T*>
{
- typedef range this_type;
- typedef range_base<T*> base_type;
-
+ typedef range this_type;
+ typedef range_base<T*> base_type;
typedef typename remove_const<T>::type value_type;
typedef T* iterator;
typedef value_type const* const_iterator;
@@ -96,6 +100,7 @@ namespace boost { namespace cnv
const_iterator end () const { return base_type::end_ ? base_type::end_ : (base_type::end_ = base_type::begin_ + size()); }
sentry_type sentry () const { return sentry_type(); }
std::size_t size () const { return std::char_traits<value_type>::length(base_type::begin_); }
+ bool empty () const { return !*base_type::begin_; }
};
template<typename T>
struct range<T* const, void> : public range<T*>
diff --git a/boost/convert/spirit.hpp b/boost/convert/spirit.hpp
index 5ef69d3c78..34ad811b2b 100644
--- a/boost/convert/spirit.hpp
+++ b/boost/convert/spirit.hpp
@@ -38,7 +38,7 @@ struct boost::cnv::spirit : public boost::cnv::cnvbase<boost::cnv::spirit>
result_out = result;
}
template<typename in_type, typename char_type>
- cnv::range<char*>
+ cnv::range<char_type*>
to_str(in_type value_in, char_type* beg) const
{
typedef typename boost::spirit::traits::create_generator<in_type>::type generator;
@@ -46,7 +46,7 @@ struct boost::cnv::spirit : public boost::cnv::cnvbase<boost::cnv::spirit>
char_type* end = beg;
bool good = boost::spirit::karma::generate(end, generator(), value_in);
- return cnv::range<char*>(beg, good ? end : beg);
+ return cnv::range<char_type*>(beg, good ? end : beg);
}
};
diff --git a/boost/convert/stream.hpp b/boost/convert/stream.hpp
index 04f2bccf98..c0f4890b36 100644
--- a/boost/convert/stream.hpp
+++ b/boost/convert/stream.hpp
@@ -173,6 +173,8 @@ boost::cnv::basic_stream<char_type>::str_to(
boost::cnv::range<string_type> string_in,
boost::optional<out_type>& result_out) const
{
+ if (string_in.empty ()) return;
+
istream_type& istream = stream_;
buffer_type* oldbuf = istream.rdbuf();
char_type const* beg = &*string_in.begin();
diff --git a/boost/convert/strtol.hpp b/boost/convert/strtol.hpp
index bc329c6870..5d10bde5a7 100644
--- a/boost/convert/strtol.hpp
+++ b/boost/convert/strtol.hpp
@@ -55,15 +55,21 @@ struct boost::cnv::strtol : public boost::cnv::cnvbase<boost::cnv::strtol>
template<typename string_type> void str_to(cnv::range<string_type> v, optional< int_type>& r) const { str_to_i (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< sint_type>& r) const { str_to_i (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< lint_type>& r) const { str_to_i (v, r); }
+ template<typename string_type> void str_to(cnv::range<string_type> v, optional< llint_type>& r) const { str_to_i (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< uint_type>& r) const { str_to_i (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< usint_type>& r) const { str_to_i (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< ulint_type>& r) const { str_to_i (v, r); }
+ template<typename string_type> void str_to(cnv::range<string_type> v, optional<ullint_type>& r) const { str_to_i (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< flt_type>& r) const { str_to_d (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< dbl_type>& r) const { str_to_d (v, r); }
template<typename string_type> void str_to(cnv::range<string_type> v, optional< ldbl_type>& r) const { str_to_d (v, r); }
- template <typename char_type> cnv::range<char_type*> to_str ( int_type v, char_type* buf) const { return i_to_str(v, buf); }
- template <typename char_type> cnv::range<char_type*> to_str (lint_type v, char_type* buf) const { return i_to_str(v, buf); }
+ template <typename char_type> cnv::range<char_type*> to_str ( int_type v, char_type* buf) const { return i_to_str(v, buf); }
+ template <typename char_type> cnv::range<char_type*> to_str ( uint_type v, char_type* buf) const { return i_to_str(v, buf); }
+ template <typename char_type> cnv::range<char_type*> to_str ( lint_type v, char_type* buf) const { return i_to_str(v, buf); }
+ template <typename char_type> cnv::range<char_type*> to_str ( ulint_type v, char_type* buf) const { return i_to_str(v, buf); }
+ template <typename char_type> cnv::range<char_type*> to_str ( llint_type v, char_type* buf) const { return i_to_str(v, buf); }
+ template <typename char_type> cnv::range<char_type*> to_str (ullint_type v, char_type* buf) const { return i_to_str(v, buf); }
template <typename char_type> cnv::range<char_type*> to_str ( dbl_type v, char_type* buf) const;
template<typename char_type, typename in_type> cnv::range<char_type*> i_to_str (in_type, char_type*) const;
@@ -76,13 +82,16 @@ struct boost::cnv::strtol : public boost::cnv::cnvbase<boost::cnv::strtol>
template<typename char_type, typename Type>
boost::cnv::range<char_type*>
-boost::cnv::strtol::i_to_str(Type value, char_type* buf) const
+boost::cnv::strtol::i_to_str(Type in_value, char_type* buf) const
{
// C1. Base=10 optimization improves performance 10%
+ typedef typename boost::make_unsigned<Type>::type unsigned_type;
+
char_type* beg = buf + bufsize_ / 2;
char_type* end = beg;
- bool const is_negative = (value < 0) ? (value = -value, true) : false;
+ bool const is_negative = in_value < 0;
+ unsigned_type value = static_cast<unsigned_type>(is_negative ? -in_value : in_value);
if (base_ == 10) for (; value; *(--beg) = int(value % 10) + '0', value /= 10); //C1
else for (; value; *(--beg) = get_char(value % base_), value /= base_);
@@ -160,7 +169,6 @@ template<typename string_type, typename out_type>
void
boost::cnv::strtol::str_to_i(cnv::range<string_type> range, boost::optional<out_type>& result_out) const
{
-
typedef typename boost::make_unsigned<out_type>::type unsigned_type;
typedef cnv::range<string_type> range_type;
typedef typename range_type::iterator iterator;
@@ -182,7 +190,7 @@ boost::cnv::strtol::str_to_i(cnv::range<string_type> range, boost::optional<out_
for (; s != range.sentry(); ++s)
{
- unsigned int ch = *s;
+ ch = *s;
/**/ if (std::isdigit(ch)) ch -= '0';
else if (std::isalpha(ch)) ch -= (std::isupper(ch) ? 'A' : 'a') - 10;
@@ -202,7 +210,6 @@ void
boost::cnv::strtol::str_to_d(cnv::range<string_type> range, optional<out_type>& result_out) const
{
typedef cnv::range<string_type> range_type;
- typedef typename range_type::iterator iterator;
typedef typename range_type::value_type char_type;
char_type const* str = &*range.begin(); // Currently only works with 'char'
diff --git a/boost/core/demangle.hpp b/boost/core/demangle.hpp
index eebd0ce0f1..44aeb8ded7 100644
--- a/boost/core/demangle.hpp
+++ b/boost/core/demangle.hpp
@@ -27,8 +27,15 @@
#if defined( BOOST_CORE_HAS_CXXABI_H )
# include <cxxabi.h>
-# include <cstdlib>
-# include <cstddef>
+// For some archtectures (mips, mips64, x86, x86_64) cxxabi.h in Android NDK is implemented by gabi++ library
+// (https://android.googlesource.com/platform/ndk/+/master/sources/cxx-stl/gabi++/), which does not implement
+// abi::__cxa_demangle(). We detect this implementation by checking the include guard here.
+# if defined( __GABIXX_CXXABI_H__ )
+# undef BOOST_CORE_HAS_CXXABI_H
+# else
+# include <cstdlib>
+# include <cstddef>
+# endif
#endif
namespace boost
diff --git a/boost/core/enable_if.hpp b/boost/core/enable_if.hpp
index a3302b18a1..5dcef1e035 100644
--- a/boost/core/enable_if.hpp
+++ b/boost/core/enable_if.hpp
@@ -23,6 +23,11 @@
namespace boost
{
+ template<typename T, typename R=void>
+ struct enable_if_has_type
+ {
+ typedef R type;
+ };
template <bool B, class T = void>
struct enable_if_c {
@@ -80,6 +85,10 @@ namespace boost {
template <typename T>
struct enable_if_does_not_work_on_this_compiler;
+ template<typename T, typename R=void>
+ struct enable_if_has_type : enable_if_does_not_work_on_this_compiler<T>
+ { };
+
template <bool B, class T = detail::enable_if_default_T>
struct enable_if_c : enable_if_does_not_work_on_this_compiler<T>
{ };
diff --git a/boost/coroutine/asymmetric_coroutine.hpp b/boost/coroutine/asymmetric_coroutine.hpp
index d9369fae38..640896f7c4 100644
--- a/boost/coroutine/asymmetric_coroutine.hpp
+++ b/boost/coroutine/asymmetric_coroutine.hpp
@@ -467,16 +467,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, coroutine_fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -494,16 +494,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, coroutine_fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -521,16 +521,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -548,16 +548,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -575,16 +575,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -602,16 +602,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -629,16 +629,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -656,16 +656,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R >, R, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -927,16 +927,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, coroutine_fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -954,16 +954,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, coroutine_fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -981,16 +981,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1008,16 +1008,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1035,16 +1035,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1062,16 +1062,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1089,16 +1089,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1116,16 +1116,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< R & >, R &, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1383,16 +1383,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, coroutine_fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1410,16 +1410,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, coroutine_fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1437,16 +1437,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1464,16 +1464,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1491,16 +1491,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1518,16 +1518,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1545,16 +1545,16 @@ public:
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1572,16 +1572,16 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::pull_coroutine_object<
push_coroutine< void >, void, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1642,16 +1642,16 @@ push_coroutine< Arg >::push_coroutine( coroutine_fn fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, coroutine_fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1669,16 +1669,16 @@ push_coroutine< Arg >::push_coroutine( coroutine_fn fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, coroutine_fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1695,16 +1695,16 @@ push_coroutine< Arg & >::push_coroutine( coroutine_fn fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, coroutine_fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1722,16 +1722,16 @@ push_coroutine< Arg & >::push_coroutine( coroutine_fn fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, coroutine_fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1747,16 +1747,16 @@ inline push_coroutine< void >::push_coroutine( coroutine_fn fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, coroutine_fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1773,16 +1773,16 @@ push_coroutine< void >::push_coroutine( coroutine_fn fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, coroutine_fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1800,16 +1800,16 @@ push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1827,16 +1827,16 @@ push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1854,16 +1854,16 @@ push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1881,16 +1881,16 @@ push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1907,16 +1907,16 @@ push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1933,16 +1933,16 @@ push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1960,16 +1960,16 @@ push_coroutine< Arg >::push_coroutine( Fn fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -1987,16 +1987,16 @@ push_coroutine< Arg >::push_coroutine( Fn fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2014,16 +2014,16 @@ push_coroutine< Arg & >::push_coroutine( Fn fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2041,16 +2041,16 @@ push_coroutine< Arg & >::push_coroutine( Fn fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2067,16 +2067,16 @@ push_coroutine< void >::push_coroutine( Fn fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2093,16 +2093,16 @@ push_coroutine< void >::push_coroutine( Fn fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2120,16 +2120,16 @@ push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2147,16 +2147,16 @@ push_coroutine< Arg >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg >, Arg, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2174,16 +2174,16 @@ push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2201,16 +2201,16 @@ push_coroutine< Arg & >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< Arg & >, Arg &, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2227,16 +2227,16 @@ push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_allocator stack_alloc;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, Fn, stack_allocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
@@ -2253,16 +2253,16 @@ push_coroutine< void >::push_coroutine( BOOST_RV_REF( Fn) fn,
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef detail::push_coroutine_object<
pull_coroutine< void >, void, Fn, StackAllocator
> object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, detail::preallocated( sp, size, stack_ctx), stack_alloc);
diff --git a/boost/coroutine/detail/symmetric_coroutine_call.hpp b/boost/coroutine/detail/symmetric_coroutine_call.hpp
index 0b504b8edc..3a9e4e6f9f 100644
--- a/boost/coroutine/detail/symmetric_coroutine_call.hpp
+++ b/boost/coroutine/detail/symmetric_coroutine_call.hpp
@@ -65,14 +65,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, coroutine_fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -89,14 +89,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, coroutine_fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -113,14 +113,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -137,14 +137,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -161,14 +161,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -185,14 +185,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -209,14 +209,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -233,14 +233,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -321,14 +321,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, coroutine_fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -345,14 +345,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, coroutine_fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -369,14 +369,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -393,14 +393,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -417,14 +417,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -441,14 +441,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -465,14 +465,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -489,14 +489,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< Arg &, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -577,14 +577,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, coroutine_fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -601,14 +601,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, coroutine_fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< coroutine_fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -625,14 +625,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -649,14 +649,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
boost::forward< Fn >( fn), attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -673,14 +673,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -697,14 +697,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -721,14 +721,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, stack_allocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
@@ -745,14 +745,14 @@ public:
stack_context stack_ctx;
// allocate the coroutine-stack
stack_alloc.allocate( stack_ctx, attrs.size);
- BOOST_ASSERT( 0 < stack_ctx.sp);
+ BOOST_ASSERT( 0 != stack_ctx.sp);
// typedef of internal coroutine-type
typedef symmetric_coroutine_object< void, Fn, StackAllocator > object_t;
// reserve space on top of coroutine-stack for internal coroutine-type
std::size_t size = stack_ctx.size - sizeof( object_t);
- BOOST_ASSERT( 0 < size);
+ BOOST_ASSERT( 0 != size);
void * sp = static_cast< char * >( stack_ctx.sp) - sizeof( object_t);
- BOOST_ASSERT( 0 < sp);
+ BOOST_ASSERT( 0 != sp);
// placement new for internal coroutine
impl_ = new ( sp) object_t(
fn, attrs, preallocated( sp, size, stack_ctx), stack_alloc);
diff --git a/boost/coroutine/posix/protected_stack_allocator.hpp b/boost/coroutine/posix/protected_stack_allocator.hpp
index 659de337a1..649248b57d 100644
--- a/boost/coroutine/posix/protected_stack_allocator.hpp
+++ b/boost/coroutine/posix/protected_stack_allocator.hpp
@@ -53,7 +53,7 @@ struct basic_protected_stack_allocator
static_cast< float >( size) / traits_type::page_size() ) ) );
BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
const std::size_t size_( pages * traits_type::page_size() );
- BOOST_ASSERT( 0 < size && 0 < size_);
+ BOOST_ASSERT( 0 != size && 0 != size_);
BOOST_ASSERT( size_ <= size);
// conform to POSIX.4 (POSIX.1b-1993, _POSIX_C_SOURCE=199309L)
diff --git a/boost/coroutine/windows/protected_stack_allocator.hpp b/boost/coroutine/windows/protected_stack_allocator.hpp
index 293901223b..29e19babb7 100644
--- a/boost/coroutine/windows/protected_stack_allocator.hpp
+++ b/boost/coroutine/windows/protected_stack_allocator.hpp
@@ -46,7 +46,7 @@ struct basic_protected_stack_allocator
static_cast< float >( size) / traits_type::page_size() ) ) );
BOOST_ASSERT_MSG( 2 <= pages, "at least two pages must fit into stack (one page is guard-page)");
const std::size_t size_ = pages * traits_type::page_size();
- BOOST_ASSERT( 0 < size && 0 < size_);
+ BOOST_ASSERT( 0 != size && 0 != size_);
void * limit = ::VirtualAlloc( 0, size_, MEM_COMMIT, PAGE_READWRITE);
if ( ! limit) throw std::bad_alloc();
diff --git a/boost/coroutine2/detail/config.hpp b/boost/coroutine2/detail/config.hpp
index c439ecc0ea..cfb95846a5 100644
--- a/boost/coroutine2/detail/config.hpp
+++ b/boost/coroutine2/detail/config.hpp
@@ -36,16 +36,4 @@
# include <boost/config/auto_link.hpp>
#endif
-#if defined(BOOST_USE_SEGMENTED_STACKS)
-# if ! ( (defined(__GNUC__) && __GNUC__ > 3 && __GNUC_MINOR__ > 6) || \
- (defined(__clang__) && __clang_major__ > 2 && __clang_minor__ > 3) )
-# error "compiler does not support segmented_stack stacks"
-# endif
-# define BOOST_COROUTINES2_SEGMENTS 10
-#endif
-
-#if defined(BOOST_CONTEXT_NO_EXECUTION_CONTEXT)
-# error "execution_context from boost.context not supported"
-#endif
-
#endif // BOOST_COROUTINES2_DETAIL_CONFIG_H
diff --git a/boost/coroutine2/detail/pull_control_block.hpp b/boost/coroutine2/detail/pull_control_block.hpp
index 1abb34a0db..7009454c88 100644
--- a/boost/coroutine2/detail/pull_control_block.hpp
+++ b/boost/coroutine2/detail/pull_control_block.hpp
@@ -8,6 +8,7 @@
#define BOOST_COROUTINES2_DETAIL_PULL_CONTROL_BLOCK_HPP
#include <exception>
+#include <type_traits>
#include <boost/config.hpp>
#include <boost/context/execution_context.hpp>
@@ -22,17 +23,18 @@ namespace detail {
template< typename T >
struct pull_coroutine< T >::control_block {
- typename push_coroutine< T >::control_block * other;
- boost::context::execution_context caller;
- boost::context::execution_context callee;
- bool preserve_fpu;
- int state;
- std::exception_ptr except;
+ typename push_coroutine< T >::control_block * other;
+ boost::context::execution_context ctx;
+ bool preserve_fpu;
+ int state;
+ std::exception_ptr except;
+ bool bvalid;
+ typename std::aligned_storage< sizeof( T), alignof( T) >::type storage[1];
template< typename StackAllocator, typename Fn >
control_block( context::preallocated, StackAllocator, Fn &&, bool);
- explicit control_block( typename push_coroutine< T >::control_block *);
+ explicit control_block( typename push_coroutine< T >::control_block *, boost::context::execution_context const&);
~control_block();
@@ -41,22 +43,26 @@ struct pull_coroutine< T >::control_block {
void resume();
+ void set( T *);
+
+ T & get();
+
bool valid() const noexcept;
};
template< typename T >
struct pull_coroutine< T & >::control_block {
typename push_coroutine< T & >::control_block * other;
- boost::context::execution_context caller;
- boost::context::execution_context callee;
+ boost::context::execution_context ctx;
bool preserve_fpu;
int state;
std::exception_ptr except;
+ T * t;
template< typename StackAllocator, typename Fn >
control_block( context::preallocated, StackAllocator, Fn &&, bool);
- explicit control_block( typename push_coroutine< T & >::control_block *);
+ explicit control_block( typename push_coroutine< T & >::control_block *, boost::context::execution_context const&);
~control_block();
@@ -65,13 +71,14 @@ struct pull_coroutine< T & >::control_block {
void resume();
+ T & get();
+
bool valid() const noexcept;
};
struct pull_coroutine< void >::control_block {
push_coroutine< void >::control_block * other;
- boost::context::execution_context caller;
- boost::context::execution_context callee;
+ boost::context::execution_context ctx;
bool preserve_fpu;
int state;
std::exception_ptr except;
@@ -79,7 +86,7 @@ struct pull_coroutine< void >::control_block {
template< typename StackAllocator, typename Fn >
control_block( context::preallocated, StackAllocator, Fn &&, bool);
- explicit control_block( push_coroutine< void >::control_block *);
+ explicit control_block( push_coroutine< void >::control_block *, boost::context::execution_context const&);
~control_block();
diff --git a/boost/coroutine2/detail/pull_control_block.ipp b/boost/coroutine2/detail/pull_control_block.ipp
index fd806ecb21..536e5e6a94 100644
--- a/boost/coroutine2/detail/pull_control_block.ipp
+++ b/boost/coroutine2/detail/pull_control_block.ipp
@@ -8,6 +8,7 @@
#define BOOST_COROUTINES2_DETAIL_PULL_CONTROL_BLOCK_IPP
#include <exception>
+#include <memory>
#include <boost/assert.hpp>
#include <boost/config.hpp>
@@ -33,42 +34,46 @@ template< typename StackAllocator, typename Fn >
pull_coroutine< T >::control_block::control_block( context::preallocated palloc, StackAllocator salloc,
Fn && fn_, bool preserve_fpu_) :
other( nullptr),
- caller( boost::context::execution_context::current() ),
- callee( palloc, salloc,
- [=,fn=std::forward< Fn >( fn_)] () mutable -> decltype( auto) {
- // create synthesized push_coroutine< T >
- typename push_coroutine< T >::control_block synthesized_cb( this);
- push_coroutine< T > synthesized( & synthesized_cb);
- other = & synthesized_cb;
- try {
- // call coroutine-fn with synthesized push_coroutine as argument
- fn( synthesized);
- } catch ( forced_unwind const&) {
- // do nothing for unwinding exception
- } catch (...) {
- // store other exceptions in exception-pointer
- except = std::current_exception();
- }
- // set termination flags
- state |= static_cast< int >( state_t::complete);
- // jump back to caller
- caller( preserve_fpu);
- BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
- }),
+ ctx( std::allocator_arg, palloc, salloc,
+ [=,fn=std::forward< Fn >( fn_),ctx=boost::context::execution_context::current()] (void *) mutable -> void {
+ // create synthesized push_coroutine< T >
+ typename push_coroutine< T >::control_block synthesized_cb( this, ctx);
+ push_coroutine< T > synthesized( & synthesized_cb);
+ other = & synthesized_cb;
+ try {
+ // call coroutine-fn with synthesized push_coroutine as argument
+ fn( synthesized);
+ } catch ( forced_unwind const&) {
+ // do nothing for unwinding exception
+ } catch (...) {
+ // store other exceptions in exception-pointer
+ except = std::current_exception();
+ }
+ // set termination flags
+ state |= static_cast< int >( state_t::complete);
+ // jump back to ctx
+ other->ctx( nullptr, preserve_fpu);
+ BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+ }),
preserve_fpu( preserve_fpu_),
state( static_cast< int >( state_t::unwind) ),
- except() {
- callee( preserve_fpu);
+ except(),
+ bvalid( false),
+ storage() {
+ // enter coroutine-fn in order to have first value available after ctor (of `*this`) returns
+ set( reinterpret_cast< T * >( ctx( nullptr, preserve_fpu) ) );
}
template< typename T >
-pull_coroutine< T >::control_block::control_block( typename push_coroutine< T >::control_block * cb) :
+pull_coroutine< T >::control_block::control_block( typename push_coroutine< T >::control_block * cb,
+ boost::context::execution_context const& ctx_) :
other( cb),
- caller( other->callee),
- callee( other->caller),
+ ctx( ctx_),
preserve_fpu( other->preserve_fpu),
state( 0),
- except() {
+ except(),
+ bvalid( false),
+ storage() {
}
template< typename T >
@@ -77,14 +82,19 @@ pull_coroutine< T >::control_block::~control_block() {
0 != ( state & static_cast< int >( state_t::unwind) ) ) {
// set early-exit flag
state |= static_cast< int >( state_t::early_exit);
- callee( preserve_fpu);
+ ctx( nullptr, preserve_fpu);
+ }
+ // destroy data if it set
+ if ( bvalid) {
+ reinterpret_cast< T const* >( storage)->~T();
}
}
template< typename T >
void
pull_coroutine< T >::control_block::resume() {
- callee( preserve_fpu);
+ other->ctx = boost::context::execution_context::current();
+ set( reinterpret_cast< T * >( ctx( nullptr, preserve_fpu) ) );
if ( except) {
std::rethrow_exception( except);
}
@@ -95,9 +105,30 @@ pull_coroutine< T >::control_block::resume() {
}
template< typename T >
+void
+pull_coroutine< T >::control_block::set( T * t) {
+ // destroy data if it set
+ if ( bvalid) {
+ reinterpret_cast< T const* >( storage)->~T();
+ }
+ if ( nullptr != t) {
+ new ( storage) T( std::move( * t) ); // FIXME: differrentiation between move/copy
+ bvalid = true;
+ } else {
+ bvalid = false;
+ }
+}
+
+template< typename T >
+T &
+pull_coroutine< T >::control_block::get() {
+ return * reinterpret_cast< T * >( storage);
+}
+
+template< typename T >
bool
pull_coroutine< T >::control_block::valid() const noexcept {
- return nullptr != other && nullptr != other->t && 0 == ( state & static_cast< int >( state_t::complete) );
+ return nullptr != other && 0 == ( state & static_cast< int >( state_t::complete) ) && bvalid;
}
@@ -108,42 +139,44 @@ template< typename StackAllocator, typename Fn >
pull_coroutine< T & >::control_block::control_block( context::preallocated palloc, StackAllocator salloc,
Fn && fn_, bool preserve_fpu_) :
other( nullptr),
- caller( boost::context::execution_context::current() ),
- callee( palloc, salloc,
- [=,fn=std::forward< Fn >( fn_)] () mutable -> decltype( auto) {
- // create synthesized push_coroutine< T >
- typename push_coroutine< T & >::control_block synthesized_cb( this);
- push_coroutine< T & > synthesized( & synthesized_cb);
- other = & synthesized_cb;
- try {
- // call coroutine-fn with synthesized push_coroutine as argument
- fn( synthesized);
- } catch ( forced_unwind const&) {
- // do nothing for unwinding exception
- } catch (...) {
- // store other exceptions in exception-pointer
- except = std::current_exception();
- }
- // set termination flags
- state |= static_cast< int >( state_t::complete);
- // jump back to caller
- caller( preserve_fpu);
- BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
- }),
+ ctx( std::allocator_arg, palloc, salloc,
+ [=,fn=std::forward< Fn >( fn_),ctx=boost::context::execution_context::current()] (void *) mutable -> void {
+ // create synthesized push_coroutine< T >
+ typename push_coroutine< T & >::control_block synthesized_cb( this, ctx);
+ push_coroutine< T & > synthesized( & synthesized_cb);
+ other = & synthesized_cb;
+ try {
+ // call coroutine-fn with synthesized push_coroutine as argument
+ fn( synthesized);
+ } catch ( forced_unwind const&) {
+ // do nothing for unwinding exception
+ } catch (...) {
+ // store other exceptions in exception-pointer
+ except = std::current_exception();
+ }
+ // set termination flags
+ state |= static_cast< int >( state_t::complete);
+ // jump back to ctx
+ other->ctx( nullptr, preserve_fpu);
+ BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+ }),
preserve_fpu( preserve_fpu_),
state( static_cast< int >( state_t::unwind) ),
- except() {
- callee( preserve_fpu);
+ except(),
+ t( nullptr) {
+ // enter coroutine-fn in order to have first value available after ctor (of `*this`) returns
+ t = reinterpret_cast< T * >( ctx( nullptr, preserve_fpu) );
}
template< typename T >
-pull_coroutine< T & >::control_block::control_block( typename push_coroutine< T & >::control_block * cb) :
+pull_coroutine< T & >::control_block::control_block( typename push_coroutine< T & >::control_block * cb,
+ boost::context::execution_context const& ctx_) :
other( cb),
- caller( other->callee),
- callee( other->caller),
+ ctx( ctx_),
preserve_fpu( other->preserve_fpu),
state( 0),
- except() {
+ except(),
+ t( nullptr) {
}
template< typename T >
@@ -152,14 +185,15 @@ pull_coroutine< T & >::control_block::~control_block() {
0 != ( state & static_cast< int >( state_t::unwind) ) ) {
// set early-exit flag
state |= static_cast< int >( state_t::early_exit);
- callee( preserve_fpu);
+ ctx( nullptr, preserve_fpu);
}
}
template< typename T >
void
pull_coroutine< T & >::control_block::resume() {
- callee( preserve_fpu);
+ other->ctx = boost::context::execution_context::current();
+ t = reinterpret_cast< T * >( ctx( nullptr, preserve_fpu) );
if ( except) {
std::rethrow_exception( except);
}
@@ -170,9 +204,15 @@ pull_coroutine< T & >::control_block::resume() {
}
template< typename T >
+T &
+pull_coroutine< T & >::control_block::get() {
+ return * reinterpret_cast< T * >( t);
+}
+
+template< typename T >
bool
pull_coroutine< T & >::control_block::valid() const noexcept {
- return nullptr != other && nullptr != other->t && 0 == ( state & static_cast< int >( state_t::complete) );
+ return nullptr != other && 0 == ( state & static_cast< int >( state_t::complete) ) && nullptr != t;
}
@@ -182,39 +222,39 @@ template< typename StackAllocator, typename Fn >
pull_coroutine< void >::control_block::control_block( context::preallocated palloc, StackAllocator salloc,
Fn && fn_, bool preserve_fpu_) :
other( nullptr),
- caller( boost::context::execution_context::current() ),
- callee( palloc, salloc,
- [=,fn=std::forward< Fn >( fn_)] () mutable -> decltype( auto) {
- // create synthesized push_coroutine< T >
- typename push_coroutine< void >::control_block synthesized_cb( this);
- push_coroutine< void > synthesized( & synthesized_cb);
- other = & synthesized_cb;
- try {
- // call coroutine-fn with synthesized push_coroutine as argument
- fn( synthesized);
- } catch ( forced_unwind const&) {
- // do nothing for unwinding exception
- } catch (...) {
- // store other exceptions in exception-pointer
- except = std::current_exception();
- }
- // set termination flags
- state |= static_cast< int >( state_t::complete);
- // jump back to caller
- caller( preserve_fpu);
- BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
- }),
+ ctx( std::allocator_arg, palloc, salloc,
+ [=,fn=std::forward< Fn >( fn_),ctx=boost::context::execution_context::current()] (void *) mutable -> void {
+ // create synthesized push_coroutine< T >
+ typename push_coroutine< void >::control_block synthesized_cb( this, ctx);
+ push_coroutine< void > synthesized( & synthesized_cb);
+ other = & synthesized_cb;
+ try {
+ // call coroutine-fn with synthesized push_coroutine as argument
+ fn( synthesized);
+ } catch ( forced_unwind const&) {
+ // do nothing for unwinding exception
+ } catch (...) {
+ // store other exceptions in exception-pointer
+ except = std::current_exception();
+ }
+ // set termination flags
+ state |= static_cast< int >( state_t::complete);
+ // jump back to ctx
+ other->ctx( nullptr, preserve_fpu);
+ BOOST_ASSERT_MSG( false, "pull_coroutine is complete");
+ }),
preserve_fpu( preserve_fpu_),
state( static_cast< int >( state_t::unwind) ),
except() {
- callee( preserve_fpu);
+ // enter coroutine-fn in order to have first value available after ctor returns
+ ctx( nullptr, preserve_fpu);
}
inline
-pull_coroutine< void >::control_block::control_block( push_coroutine< void >::control_block * cb) :
+pull_coroutine< void >::control_block::control_block( push_coroutine< void >::control_block * cb,
+ boost::context::execution_context const& ctx_) :
other( cb),
- caller( other->callee),
- callee( other->caller),
+ ctx( ctx_),
preserve_fpu( other->preserve_fpu),
state( 0),
except() {
@@ -226,14 +266,15 @@ pull_coroutine< void >::control_block::~control_block() {
0 != ( state & static_cast< int >( state_t::unwind) ) ) {
// set early-exit flag
state |= static_cast< int >( state_t::early_exit);
- callee( preserve_fpu);
+ ctx( nullptr, preserve_fpu);
}
}
inline
void
pull_coroutine< void >::control_block::resume() {
- callee( preserve_fpu);
+ other->ctx = boost::context::execution_context::current();
+ ctx( nullptr, preserve_fpu);
if ( except) {
std::rethrow_exception( except);
}
diff --git a/boost/coroutine2/detail/pull_coroutine.hpp b/boost/coroutine2/detail/pull_coroutine.hpp
index ff76bd3aac..c78750442e 100644
--- a/boost/coroutine2/detail/pull_coroutine.hpp
+++ b/boost/coroutine2/detail/pull_coroutine.hpp
@@ -66,7 +66,7 @@ public:
bool operator!() const noexcept;
- T get() const noexcept;
+ T get();
class iterator : public std::iterator< std::input_iterator_tag, typename std::remove_reference< T >::type > {
private:
@@ -126,11 +126,11 @@ public:
iterator operator++( int) = delete;
reference_t operator*() const {
- return * c_->cb_->other->t;
+ return c_->cb_->get();
}
pointer_t operator->() const {
- return c_->cb_->other->t;
+ return std::addressof( c_->cb_->get() );
}
};
@@ -179,7 +179,7 @@ public:
bool operator!() const noexcept;
- T & get() const noexcept;
+ T & get();
class iterator : public std::iterator< std::input_iterator_tag, typename std::remove_reference< T >::type > {
private:
@@ -239,11 +239,11 @@ public:
iterator operator++( int) = delete;
reference_t operator*() const {
- return * c_->cb_->other->t;
+ return c_->cb_->get();
}
pointer_t operator->() const {
- return c_->cb_->other->t;
+ return std::addressof( c_->cb_->get() );
}
};
diff --git a/boost/coroutine2/detail/pull_coroutine.ipp b/boost/coroutine2/detail/pull_coroutine.ipp
index f59bb3cb5f..2e37ef2a98 100644
--- a/boost/coroutine2/detail/pull_coroutine.ipp
+++ b/boost/coroutine2/detail/pull_coroutine.ipp
@@ -19,6 +19,7 @@
#include <boost/coroutine2/detail/config.hpp>
#include <boost/coroutine2/fixedsize_stack.hpp>
+#include <boost/coroutine2/segmented_stack.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
@@ -44,7 +45,7 @@ pull_coroutine< T >::has_result_() const {
template< typename T >
template< typename Fn >
pull_coroutine< T >::pull_coroutine( Fn && fn, bool preserve_fpu) :
- pull_coroutine( fixedsize_stack(), std::forward< Fn >( fn), preserve_fpu) {
+ pull_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
}
template< typename T >
@@ -106,8 +107,8 @@ pull_coroutine< T >::operator!() const noexcept {
template< typename T >
T
-pull_coroutine< T >::get() const noexcept {
- return std::move( * cb_->other->t);
+pull_coroutine< T >::get() {
+ return std::move( cb_->get() );
}
@@ -127,7 +128,7 @@ pull_coroutine< T & >::has_result_() const {
template< typename T >
template< typename Fn >
pull_coroutine< T & >::pull_coroutine( Fn && fn, bool preserve_fpu) :
- pull_coroutine( fixedsize_stack(), std::forward< Fn >( fn), preserve_fpu) {
+ pull_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
}
template< typename T >
@@ -189,8 +190,8 @@ pull_coroutine< T & >::operator!() const noexcept {
template< typename T >
T &
-pull_coroutine< T & >::get() const noexcept {
- return * cb_->other->t;
+pull_coroutine< T & >::get() {
+ return cb_->get();
}
@@ -203,7 +204,7 @@ pull_coroutine< void >::pull_coroutine( control_block * cb) :
template< typename Fn >
pull_coroutine< void >::pull_coroutine( Fn && fn, bool preserve_fpu) :
- pull_coroutine( fixedsize_stack(), std::forward< Fn >( fn), preserve_fpu) {
+ pull_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
}
template< typename StackAllocator, typename Fn >
diff --git a/boost/coroutine2/detail/push_control_block.hpp b/boost/coroutine2/detail/push_control_block.hpp
index e6c86ffd81..03aa9125eb 100644
--- a/boost/coroutine2/detail/push_control_block.hpp
+++ b/boost/coroutine2/detail/push_control_block.hpp
@@ -23,17 +23,15 @@ namespace detail {
template< typename T >
struct push_coroutine< T >::control_block {
typename pull_coroutine< T >::control_block * other;
- boost::context::execution_context caller;
- boost::context::execution_context callee;
+ boost::context::execution_context ctx;
bool preserve_fpu;
int state;
std::exception_ptr except;
- T * t;
template< typename StackAllocator, typename Fn >
control_block( context::preallocated, StackAllocator, Fn &&, bool);
- explicit control_block( typename pull_coroutine< T >::control_block *);
+ explicit control_block( typename pull_coroutine< T >::control_block *, boost::context::execution_context const&);
~control_block();
@@ -50,17 +48,15 @@ struct push_coroutine< T >::control_block {
template< typename T >
struct push_coroutine< T & >::control_block {
typename pull_coroutine< T & >::control_block * other;
- boost::context::execution_context caller;
- boost::context::execution_context callee;
+ boost::context::execution_context ctx;
bool preserve_fpu;
int state;
std::exception_ptr except;
- T * t;
template< typename StackAllocator, typename Fn >
control_block( context::preallocated, StackAllocator, Fn &&, bool);
- explicit control_block( typename pull_coroutine< T & >::control_block *);
+ explicit control_block( typename pull_coroutine< T & >::control_block *, boost::context::execution_context const&);
~control_block();
@@ -74,8 +70,7 @@ struct push_coroutine< T & >::control_block {
struct push_coroutine< void >::control_block {
pull_coroutine< void >::control_block * other;
- boost::context::execution_context caller;
- boost::context::execution_context callee;
+ boost::context::execution_context ctx;
bool preserve_fpu;
int state;
std::exception_ptr except;
@@ -83,7 +78,7 @@ struct push_coroutine< void >::control_block {
template< typename StackAllocator, typename Fn >
control_block( context::preallocated, StackAllocator, Fn &&, bool);
- explicit control_block( pull_coroutine< void >::control_block *);
+ explicit control_block( pull_coroutine< void >::control_block *, boost::context::execution_context const&);
~control_block();
diff --git a/boost/coroutine2/detail/push_control_block.ipp b/boost/coroutine2/detail/push_control_block.ipp
index ebef5092b5..ce6776f600 100644
--- a/boost/coroutine2/detail/push_control_block.ipp
+++ b/boost/coroutine2/detail/push_control_block.ipp
@@ -9,6 +9,7 @@
#include <algorithm>
#include <exception>
+#include <memory>
#include <boost/assert.hpp>
#include <boost/config.hpp>
@@ -34,42 +35,46 @@ template< typename StackAllocator, typename Fn >
push_coroutine< T >::control_block::control_block( context::preallocated palloc, StackAllocator salloc,
Fn && fn_, bool preserve_fpu_) :
other( nullptr),
- caller( boost::context::execution_context::current() ),
- callee( palloc, salloc,
- [=,fn=std::forward< Fn >( fn_)] () mutable -> decltype( auto) {
- // create synthesized pull_coroutine< T >
- typename pull_coroutine< T >::control_block synthesized_cb( this);
- pull_coroutine< T > synthesized( & synthesized_cb);
- other = & synthesized_cb;
- try {
- // call coroutine-fn with synthesized pull_coroutine as argument
- fn( synthesized);
- } catch ( forced_unwind const&) {
- // do nothing for unwinding exception
- } catch (...) {
- // store other exceptions in exception-pointer
- except = std::current_exception();
- }
- // set termination flags
- state |= static_cast< int >( state_t::complete);
- caller( preserve_fpu);
- BOOST_ASSERT_MSG( false, "push_coroutine is complete");
- }),
+ ctx( std::allocator_arg, palloc, salloc,
+ [=,fn=std::forward< Fn >( fn_),ctx=boost::context::execution_context::current()] (void *) mutable -> void {
+ // create synthesized pull_coroutine< T >
+ typename pull_coroutine< T >::control_block synthesized_cb( this, ctx);
+ pull_coroutine< T > synthesized( & synthesized_cb);
+ other = & synthesized_cb;
+ // jump back to ctor
+ T * t = reinterpret_cast< T * >( ctx( nullptr, preserve_fpu) );
+ // set transferred value
+ synthesized_cb.set( t);
+ try {
+ // call coroutine-fn with synthesized pull_coroutine as argument
+ fn( synthesized);
+ } catch ( forced_unwind const&) {
+ // do nothing for unwinding exception
+ } catch (...) {
+ // store other exceptions in exception-pointer
+ except = std::current_exception();
+ }
+ // set termination flags
+ state |= static_cast< int >( state_t::complete);
+ // jump back to ctx
+ other->ctx( nullptr, preserve_fpu);
+ BOOST_ASSERT_MSG( false, "push_coroutine is complete");
+ }),
preserve_fpu( preserve_fpu_),
state( static_cast< int >( state_t::unwind) ),
- except(),
- t( nullptr) {
+ except() {
+ // enter coroutine-fn in order to get other set
+ ctx( nullptr, preserve_fpu);
}
template< typename T >
-push_coroutine< T >::control_block::control_block( typename pull_coroutine< T >::control_block * cb) :
+push_coroutine< T >::control_block::control_block( typename pull_coroutine< T >::control_block * cb,
+ boost::context::execution_context const& ctx_) :
other( cb),
- caller( other->callee),
- callee( other->caller),
+ ctx( ctx_),
preserve_fpu( other->preserve_fpu),
state( 0),
- except(),
- t( nullptr) {
+ except() {
}
template< typename T >
@@ -78,19 +83,16 @@ push_coroutine< T >::control_block::~control_block() {
0 != ( state & static_cast< int >( state_t::unwind) ) ) {
// set early-exit flag
state |= static_cast< int >( state_t::early_exit);
- callee( preserve_fpu);
+ ctx( nullptr, preserve_fpu);
}
}
template< typename T >
void
-push_coroutine< T >::control_block::resume( T const& t_) {
- // store data on this stack
- // pass an pointer (address of tmp) to other context
- T tmp( t_);
- t = & tmp;
- callee( preserve_fpu);
- t = nullptr;
+push_coroutine< T >::control_block::resume( T const& t) {
+ other->ctx = boost::context::execution_context::current();
+ // pass an pointer to other context
+ ctx( const_cast< T * >( & t), preserve_fpu);
if ( except) {
std::rethrow_exception( except);
}
@@ -102,13 +104,10 @@ push_coroutine< T >::control_block::resume( T const& t_) {
template< typename T >
void
-push_coroutine< T >::control_block::resume( T && t_) {
- // store data on this stack
- // pass an pointer (address of tmp) to other context
- T tmp( std::move( t_) );
- t = & tmp;
- callee( preserve_fpu);
- t = nullptr;
+push_coroutine< T >::control_block::resume( T && t) {
+ other->ctx = boost::context::execution_context::current();
+ // pass an pointer to other context
+ ctx( std::addressof( t), preserve_fpu);
if ( except) {
std::rethrow_exception( except);
}
@@ -132,42 +131,46 @@ template< typename StackAllocator, typename Fn >
push_coroutine< T & >::control_block::control_block( context::preallocated palloc, StackAllocator salloc,
Fn && fn_, bool preserve_fpu_) :
other( nullptr),
- caller( boost::context::execution_context::current() ),
- callee( palloc, salloc,
- [=,fn=std::forward< Fn >( fn_)] () mutable -> decltype( auto) {
- // create synthesized pull_coroutine< T >
- typename pull_coroutine< T & >::control_block synthesized_cb( this);
- pull_coroutine< T & > synthesized( & synthesized_cb);
- other = & synthesized_cb;
- try {
- // call coroutine-fn with synthesized pull_coroutine as argument
- fn( synthesized);
- } catch ( forced_unwind const&) {
- // do nothing for unwinding exception
- } catch (...) {
- // store other exceptions in exception-pointer
- except = std::current_exception();
- }
- // set termination flags
- state |= static_cast< int >( state_t::complete);
- caller( preserve_fpu);
- BOOST_ASSERT_MSG( false, "push_coroutine is complete");
- }),
+ ctx( std::allocator_arg, palloc, salloc,
+ [=,fn=std::forward< Fn >( fn_),ctx=boost::context::execution_context::current()] (void *) mutable -> void {
+ // create synthesized pull_coroutine< T >
+ typename pull_coroutine< T & >::control_block synthesized_cb( this, ctx);
+ pull_coroutine< T & > synthesized( & synthesized_cb);
+ other = & synthesized_cb;
+ // jump back to ctor
+ T * t = reinterpret_cast< T * >( ctx( nullptr, preserve_fpu) );
+ // set transferred value
+ synthesized_cb.t = t;
+ try {
+ // call coroutine-fn with synthesized pull_coroutine as argument
+ fn( synthesized);
+ } catch ( forced_unwind const&) {
+ // do nothing for unwinding exception
+ } catch (...) {
+ // store other exceptions in exception-pointer
+ except = std::current_exception();
+ }
+ // set termination flags
+ state |= static_cast< int >( state_t::complete);
+ // jump back to ctx
+ other->ctx( nullptr, preserve_fpu);
+ BOOST_ASSERT_MSG( false, "push_coroutine is complete");
+ }),
preserve_fpu( preserve_fpu_),
state( static_cast< int >( state_t::unwind) ),
- except(),
- t( nullptr) {
+ except() {
+ // enter coroutine-fn in order to get other set
+ ctx( nullptr, preserve_fpu);
}
template< typename T >
-push_coroutine< T & >::control_block::control_block( typename pull_coroutine< T & >::control_block * cb) :
+push_coroutine< T & >::control_block::control_block( typename pull_coroutine< T & >::control_block * cb,
+ boost::context::execution_context const& ctx_) :
other( cb),
- caller( other->callee),
- callee( other->caller),
+ ctx( ctx_),
preserve_fpu( other->preserve_fpu),
state( 0),
- except(),
- t( nullptr) {
+ except() {
}
template< typename T >
@@ -176,16 +179,16 @@ push_coroutine< T & >::control_block::~control_block() {
0 != ( state & static_cast< int >( state_t::unwind) ) ) {
// set early-exit flag
state |= static_cast< int >( state_t::early_exit);
- callee( preserve_fpu);
+ ctx( nullptr, preserve_fpu);
}
}
template< typename T >
void
-push_coroutine< T & >::control_block::resume( T & t_) {
- t = & t_;
- callee( preserve_fpu);
- t = nullptr;
+push_coroutine< T & >::control_block::resume( T & t) {
+ other->ctx = boost::context::execution_context::current();
+ // pass an pointer to other context
+ ctx( const_cast< typename std::remove_const< T >::type * >( std::addressof( t) ), preserve_fpu);
if ( except) {
std::rethrow_exception( except);
}
@@ -207,37 +210,41 @@ push_coroutine< T & >::control_block::valid() const noexcept {
template< typename StackAllocator, typename Fn >
push_coroutine< void >::control_block::control_block( context::preallocated palloc, StackAllocator salloc, Fn && fn_, bool preserve_fpu_) :
other( nullptr),
- caller( boost::context::execution_context::current() ),
- callee( palloc, salloc,
- [=,fn=std::forward< Fn >( fn_)] () mutable -> decltype( auto) {
- // create synthesized pull_coroutine< T >
- typename pull_coroutine< void >::control_block synthesized_cb( this);
- pull_coroutine< void > synthesized( & synthesized_cb);
- other = & synthesized_cb;
- try {
- // call coroutine-fn with synthesized pull_coroutine as argument
- fn( synthesized);
- } catch ( forced_unwind const&) {
- // do nothing for unwinding exception
- } catch (...) {
- // store other exceptions in exception-pointer
- except = std::current_exception();
- }
- // set termination flags
- state |= static_cast< int >( state_t::complete);
- caller( preserve_fpu);
- BOOST_ASSERT_MSG( false, "push_coroutine is complete");
- }),
+ ctx( std::allocator_arg, palloc, salloc,
+ [=,fn=std::forward< Fn >( fn_),ctx=boost::context::execution_context::current()] (void *) mutable -> void {
+ // create synthesized pull_coroutine< T >
+ typename pull_coroutine< void >::control_block synthesized_cb( this, ctx);
+ pull_coroutine< void > synthesized( & synthesized_cb);
+ other = & synthesized_cb;
+ // jump back to ctor
+ ctx( nullptr, preserve_fpu);
+ try {
+ // call coroutine-fn with synthesized pull_coroutine as argument
+ fn( synthesized);
+ } catch ( forced_unwind const&) {
+ // do nothing for unwinding exception
+ } catch (...) {
+ // store other exceptions in exception-pointer
+ except = std::current_exception();
+ }
+ // set termination flags
+ state |= static_cast< int >( state_t::complete);
+ // jump back to ctx
+ other->ctx( nullptr, preserve_fpu);
+ BOOST_ASSERT_MSG( false, "push_coroutine is complete");
+ }),
preserve_fpu( preserve_fpu_),
state( static_cast< int >( state_t::unwind) ),
except() {
+ // enter coroutine-fn in order to get other set
+ ctx( nullptr, preserve_fpu);
}
inline
-push_coroutine< void >::control_block::control_block( pull_coroutine< void >::control_block * cb) :
+push_coroutine< void >::control_block::control_block( pull_coroutine< void >::control_block * cb,
+ boost::context::execution_context const& ctx_) :
other( cb),
- caller( other->callee),
- callee( other->caller),
+ ctx( ctx_),
preserve_fpu( other->preserve_fpu),
state( 0),
except() {
@@ -249,14 +256,15 @@ push_coroutine< void >::control_block::~control_block() {
0 != ( state & static_cast< int >( state_t::unwind) ) ) {
// set early-exit flag
state |= static_cast< int >( state_t::early_exit);
- callee( preserve_fpu);
+ ctx( nullptr, preserve_fpu);
}
}
inline
void
push_coroutine< void >::control_block::resume() {
- callee( preserve_fpu);
+ other->ctx = boost::context::execution_context::current();
+ ctx( nullptr, preserve_fpu);
if ( except) {
std::rethrow_exception( except);
}
diff --git a/boost/coroutine2/detail/push_coroutine.ipp b/boost/coroutine2/detail/push_coroutine.ipp
index 4617e73aac..5f4817802a 100644
--- a/boost/coroutine2/detail/push_coroutine.ipp
+++ b/boost/coroutine2/detail/push_coroutine.ipp
@@ -18,6 +18,7 @@
#include <boost/coroutine2/detail/config.hpp>
#include <boost/coroutine2/fixedsize_stack.hpp>
+#include <boost/coroutine2/segmented_stack.hpp>
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
@@ -37,7 +38,7 @@ push_coroutine< T >::push_coroutine( control_block * cb) :
template< typename T >
template< typename Fn >
push_coroutine< T >::push_coroutine( Fn && fn, bool preserve_fpu) :
- push_coroutine( fixedsize_stack(), std::forward< Fn >( fn), preserve_fpu) {
+ push_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
}
template< typename T >
@@ -115,7 +116,7 @@ push_coroutine< T & >::push_coroutine( control_block * cb) :
template< typename T >
template< typename Fn >
push_coroutine< T & >::push_coroutine( Fn && fn, bool preserve_fpu) :
- push_coroutine( fixedsize_stack(), std::forward< Fn >( fn), preserve_fpu) {
+ push_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
}
template< typename T >
@@ -185,7 +186,7 @@ push_coroutine< void >::push_coroutine( control_block * cb) :
template< typename Fn >
push_coroutine< void >::push_coroutine( Fn && fn, bool preserve_fpu) :
- push_coroutine( fixedsize_stack(), std::forward< Fn >( fn), preserve_fpu) {
+ push_coroutine( default_stack(), std::forward< Fn >( fn), preserve_fpu) {
}
template< typename StackAllocator, typename Fn >
diff --git a/boost/coroutine2/fixedsize_stack.hpp b/boost/coroutine2/fixedsize_stack.hpp
index 56523ab29a..8aa66fee61 100644
--- a/boost/coroutine2/fixedsize_stack.hpp
+++ b/boost/coroutine2/fixedsize_stack.hpp
@@ -23,6 +23,9 @@ namespace boost {
namespace coroutines2 {
typedef boost::context::fixedsize_stack fixedsize_stack;
+#if !defined(BOOST_USE_SEGMENTED_STACKS)
+typedef boost::context::default_stack default_stack;
+#endif
}}
diff --git a/boost/coroutine2/segmented_stack.hpp b/boost/coroutine2/segmented_stack.hpp
index a252ae445f..8443bc3561 100644
--- a/boost/coroutine2/segmented_stack.hpp
+++ b/boost/coroutine2/segmented_stack.hpp
@@ -24,7 +24,8 @@ namespace coroutines2 {
#if defined(BOOST_USE_SEGMENTED_STACKS)
# if ! defined(BOOST_WINDOWS)
-typedef boost::context::segmented_stack segmented_stack;
+typedef boost::context::segmented_stack segmented_stack;
+typedef boost::context::default_stack default_stack;
# endif
#endif
diff --git a/boost/cstdint.hpp b/boost/cstdint.hpp
index 69888352da..bf7097ec8c 100644
--- a/boost/cstdint.hpp
+++ b/boost/cstdint.hpp
@@ -69,7 +69,7 @@
# endif
-#ifdef __QNX__
+#if defined(__QNX__) && defined(__EXT_QNX)
// QNX (Dinkumware stdlib) defines these as non-standard names.
// Reflect to the standard names.
diff --git a/boost/date_time/date.hpp b/boost/date_time/date.hpp
index 2bd936cd5b..b38db220d5 100644
--- a/boost/date_time/date.hpp
+++ b/boost/date_time/date.hpp
@@ -159,7 +159,7 @@ namespace date_time {
{
return date_type(date_rep_type(days_) - dd.get_rep());
}
- return date_type(date_rep_type(days_) - dd.days());
+ return date_type(date_rep_type(days_) - static_cast<date_int_type>(dd.days()));
}
date_type operator-=(const duration_type& dd)
{
@@ -177,7 +177,7 @@ namespace date_time {
{
return date_type(date_rep_type(days_) + dd.get_rep());
}
- return date_type(date_rep_type(days_) + dd.days());
+ return date_type(date_rep_type(days_) + static_cast<date_int_type>(dd.days()));
}
date_type operator+=(const duration_type& dd)
{
diff --git a/boost/date_time/gregorian_calendar.ipp b/boost/date_time/gregorian_calendar.ipp
index 8a58c8844a..7b43ea8512 100644
--- a/boost/date_time/gregorian_calendar.ipp
+++ b/boost/date_time/gregorian_calendar.ipp
@@ -44,12 +44,12 @@ namespace date_time {
unsigned long week = (juliantoday + day - julianbegin + 4)/7;
if ((week >= 1) && (week <= 52)) {
- return week;
+ return static_cast<int>(week);
}
if (week == 53) {
if((day==6) ||(day == 5 && is_leap_year(ymd.year))) {
- return week; //under these circumstances week == 53.
+ return static_cast<int>(week); //under these circumstances week == 53.
} else {
return 1; //monday - wednesday is in week 1 of next year
}
@@ -60,10 +60,10 @@ namespace date_time {
juliantoday = julian_day_number(ymd);
day = (julianbegin + 3) % 7;
week = (juliantoday + day - julianbegin + 4)/7;
- return week;
+ return static_cast<int>(week);
}
- return week; //not reachable -- well except if day == 5 and is_leap_year != true
+ return static_cast<int>(week); //not reachable -- well except if day == 5 and is_leap_year != true
}
@@ -79,7 +79,7 @@ namespace date_time {
unsigned short y = static_cast<unsigned short>(ymd.year + 4800 - a);
unsigned short m = static_cast<unsigned short>(ymd.month + 12*a - 3);
unsigned long d = ymd.day + ((153*m + 2)/5) + 365*y + (y/4) - (y/100) + (y/400) - 32045;
- return d;
+ return static_cast<date_int_type>(d);
}
//! Convert a year-month-day into the julian day number
diff --git a/boost/date_time/int_adapter.hpp b/boost/date_time/int_adapter.hpp
index 81f68f645c..39210864ca 100644
--- a/boost/date_time/int_adapter.hpp
+++ b/boost/date_time/int_adapter.hpp
@@ -230,7 +230,7 @@ public:
return int_adapter::neg_infinity();
}
}
- return int_adapter<int_type>(value_ + rhs.as_number());
+ return int_adapter<int_type>(value_ + static_cast<int_type>(rhs.as_number()));
}
int_adapter operator+(const int_type rhs) const
@@ -279,7 +279,7 @@ public:
return int_adapter::pos_infinity();
}
}
- return int_adapter<int_type>(value_ - rhs.as_number());
+ return int_adapter<int_type>(value_ - static_cast<int_type>(rhs.as_number()));
}
int_adapter operator-(const int_type rhs) const
{
diff --git a/boost/date_time/posix_time/posix_time_duration.hpp b/boost/date_time/posix_time/posix_time_duration.hpp
index 7e15df2302..34380de904 100644
--- a/boost/date_time/posix_time/posix_time_duration.hpp
+++ b/boost/date_time/posix_time/posix_time_duration.hpp
@@ -21,7 +21,7 @@ namespace posix_time {
{
public:
explicit hours(long h) :
- time_duration(h,0,0)
+ time_duration(static_cast<hour_type>(h),0,0)
{}
};
@@ -32,7 +32,7 @@ namespace posix_time {
{
public:
explicit minutes(long m) :
- time_duration(0,m,0)
+ time_duration(0,static_cast<min_type>(m),0)
{}
};
@@ -43,7 +43,7 @@ namespace posix_time {
{
public:
explicit seconds(long s) :
- time_duration(0,0,s)
+ time_duration(0,0,static_cast<sec_type>(s))
{}
};
diff --git a/boost/date_time/time_system_counted.hpp b/boost/date_time/time_system_counted.hpp
index e5ed20b8c6..af27aad36e 100644
--- a/boost/date_time/time_system_counted.hpp
+++ b/boost/date_time/time_system_counted.hpp
@@ -54,7 +54,7 @@ namespace date_time {
return date_type(time_count_.as_special());
}
else {
- typename calendar_type::date_int_type dc = day_count();
+ typename calendar_type::date_int_type dc = static_cast<typename calendar_type::date_int_type>(day_count());
//std::cout << "time_rep here:" << dc << std::endl;
ymd_type ymd = calendar_type::from_day_number(dc);
return date_type(ymd);
diff --git a/boost/detail/is_incrementable.hpp b/boost/detail/is_incrementable.hpp
index 88ddb14513..5ebf4b7aca 100644
--- a/boost/detail/is_incrementable.hpp
+++ b/boost/detail/is_incrementable.hpp
@@ -4,16 +4,13 @@
#ifndef IS_INCREMENTABLE_DWA200415_HPP
# define IS_INCREMENTABLE_DWA200415_HPP
-# include <boost/type_traits/detail/template_arity_spec.hpp>
+# include <boost/type_traits/integral_constant.hpp>
# include <boost/type_traits/remove_cv.hpp>
# include <boost/mpl/aux_/lambda_support.hpp>
# include <boost/mpl/bool.hpp>
# include <boost/detail/workaround.hpp>
-// Must be the last include
-# include <boost/type_traits/detail/bool_trait_def.hpp>
-
-namespace boost { namespace detail {
+namespace boost { namespace detail {
// is_incrementable<T> metafunction
//
@@ -27,7 +24,7 @@ namespace is_incrementable_
// a type returned from operator++ when no increment is found in the
// type's own namespace
struct tag {};
-
+
// any soaks up implicit conversions and makes the following
// operator++ less-preferred than any other such operator that
// might be found via ADL.
@@ -35,7 +32,7 @@ namespace is_incrementable_
// This is a last-resort operator++ for when none other is found
# if BOOST_WORKAROUND(__GNUC__, == 4) && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2
-
+
}
namespace is_incrementable_2
@@ -47,33 +44,33 @@ using namespace is_incrementable_2;
namespace is_incrementable_
{
-
+
# else
-
+
tag operator++(any const&);
tag operator++(any const&,int);
-
-# endif
+
+# endif
# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202))
# define BOOST_comma(a,b) (a)
-# else
+# else
// In case an operator++ is found that returns void, we'll use ++x,0
- tag operator,(tag,int);
+ tag operator,(tag,int);
# define BOOST_comma(a,b) (a,b)
-# endif
+# endif
# if defined(BOOST_MSVC)
# pragma warning(push)
# pragma warning(disable:4913) // Warning about operator,
-# endif
+# endif
// two check overloads help us identify which operator++ was picked
char (& check_(tag) )[2];
-
+
template <class T>
char check_(T const&);
-
+
template <class T>
struct impl
@@ -99,33 +96,28 @@ namespace is_incrementable_
# if defined(BOOST_MSVC)
# pragma warning(pop)
-# endif
+# endif
}
# undef BOOST_comma
-template<typename T>
-struct is_incrementable
-BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl<T>::value)
-{
- BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl<T>::value)
+template<typename T>
+struct is_incrementable :
+ public boost::integral_constant<bool, boost::detail::is_incrementable_::impl<T>::value>
+{
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T))
};
-template<typename T>
-struct is_postfix_incrementable
-BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::postfix_impl<T>::value)
-{
- BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::postfix_impl<T>::value)
+template<typename T>
+struct is_postfix_incrementable :
+ public boost::integral_constant<bool, boost::detail::is_incrementable_::postfix_impl<T>::value>
+{
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T))
};
} // namespace detail
-BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_incrementable)
-BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_postfix_incrementable)
-
} // namespace boost
# include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/boost/detail/winapi/GetCurrentProcess.hpp b/boost/detail/winapi/GetCurrentProcess.hpp
index 51206bb4e8..431b52fa4c 100644
--- a/boost/detail/winapi/GetCurrentProcess.hpp
+++ b/boost/detail/winapi/GetCurrentProcess.hpp
@@ -1,6 +1,7 @@
// GetCurrentProcess.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -15,15 +16,19 @@
#pragma once
#endif
+// Windows CE define GetCurrentProcess as an inline function in kfuncs.h
+#if !defined( BOOST_USE_WINDOWS_H ) && !defined( UNDER_CE )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI GetCurrentProcess(BOOST_DETAIL_WINAPI_VOID);
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetCurrentProcess;
-#else
- extern "C" __declspec(dllimport) HANDLE_ WINAPI GetCurrentProcess();
-#endif
+using ::GetCurrentProcess;
}
}
}
+
#endif // BOOST_DETAIL_WINAPI_GETCURRENTPROCESS_HPP
diff --git a/boost/detail/winapi/GetCurrentThread.hpp b/boost/detail/winapi/GetCurrentThread.hpp
index 595b751d13..cbcdc97bda 100644
--- a/boost/detail/winapi/GetCurrentThread.hpp
+++ b/boost/detail/winapi/GetCurrentThread.hpp
@@ -1,6 +1,7 @@
// GetCurrentThread.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -15,22 +16,17 @@
#pragma once
#endif
-namespace boost {
-namespace detail {
-namespace winapi {
-#if defined( UNDER_CE )
// Windows CE define GetCurrentThread as an inline function in kfuncs.h
-inline HANDLE_ GetCurrentThread()
-{
- return ::GetCurrentThread();
+#if !defined( BOOST_USE_WINDOWS_H ) && !defined( UNDER_CE )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI GetCurrentThread(BOOST_DETAIL_WINAPI_VOID);
}
-#else
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetCurrentThread;
-#else
- extern "C" __declspec(dllimport) HANDLE_ WINAPI GetCurrentThread();
-#endif
#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+using ::GetCurrentThread;
}
}
}
diff --git a/boost/detail/winapi/GetLastError.hpp b/boost/detail/winapi/GetLastError.hpp
index 6e9e2d998a..8874ba853a 100644
--- a/boost/detail/winapi/GetLastError.hpp
+++ b/boost/detail/winapi/GetLastError.hpp
@@ -1,6 +1,7 @@
// GetLastError.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -15,15 +16,16 @@
#pragma once
#endif
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI GetLastError(BOOST_DETAIL_WINAPI_VOID);
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetLastError;
-#else
- extern "C" __declspec(dllimport) DWORD_ WINAPI
- GetLastError();
-#endif
+using ::GetLastError;
}
}
}
diff --git a/boost/detail/winapi/GetProcessTimes.hpp b/boost/detail/winapi/GetProcessTimes.hpp
index f2860b06bd..41b3f0e493 100644
--- a/boost/detail/winapi/GetProcessTimes.hpp
+++ b/boost/detail/winapi/GetProcessTimes.hpp
@@ -9,31 +9,52 @@
#ifndef BOOST_DETAIL_WINAPI_GETPROCESSTIMES_HPP
#define BOOST_DETAIL_WINAPI_GETPROCESSTIMES_HPP
-#include <boost/detail/winapi/time.hpp>
+#include <boost/detail/winapi/config.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
+// Windows CE does not define GetProcessTimes
+#if !defined( UNDER_CE )
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/time.hpp>
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+GetProcessTimes(
+ boost::detail::winapi::HANDLE_ hProcess,
+ ::_FILETIME* lpCreationTime,
+ ::_FILETIME* lpExitTime,
+ ::_FILETIME* lpKernelTime,
+ ::_FILETIME* lpUserTime);
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
-#if !defined(UNDER_CE) // Windows CE does not define GetProcessTimes
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetProcessTimes;
-#else
- extern "C" __declspec(dllimport) BOOL_ WINAPI
- GetProcessTimes(
- HANDLE_ hProcess,
- LPFILETIME_ lpCreationTime,
- LPFILETIME_ lpExitTime,
- LPFILETIME_ lpKernelTime,
- LPFILETIME_ lpUserTime
- );
-#endif
-#endif
+
+BOOST_FORCEINLINE BOOL_ GetProcessTimes(
+ HANDLE_ hProcess,
+ LPFILETIME_ lpCreationTime,
+ LPFILETIME_ lpExitTime,
+ LPFILETIME_ lpKernelTime,
+ LPFILETIME_ lpUserTime)
+{
+ return ::GetProcessTimes(
+ hProcess,
+ reinterpret_cast< ::_FILETIME* >(lpCreationTime),
+ reinterpret_cast< ::_FILETIME* >(lpExitTime),
+ reinterpret_cast< ::_FILETIME* >(lpKernelTime),
+ reinterpret_cast< ::_FILETIME* >(lpUserTime));
+}
+
}
}
}
+#endif // !defined( UNDER_CE )
#endif // BOOST_DETAIL_WINAPI_GETPROCESSTIMES_HPP
diff --git a/boost/detail/winapi/GetThreadTimes.hpp b/boost/detail/winapi/GetThreadTimes.hpp
index 3428edad22..2e1eb8f45c 100644
--- a/boost/detail/winapi/GetThreadTimes.hpp
+++ b/boost/detail/winapi/GetThreadTimes.hpp
@@ -1,6 +1,7 @@
// GetThreadTimes.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -9,27 +10,44 @@
#ifndef BOOST_DETAIL_WINAPI_GETTHREADTIMES_HPP
#define BOOST_DETAIL_WINAPI_GETTHREADTIMES_HPP
+#include <boost/detail/winapi/basic_types.hpp>
#include <boost/detail/winapi/time.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+GetThreadTimes(
+ boost::detail::winapi::HANDLE_ hThread,
+ ::_FILETIME* lpCreationTime,
+ ::_FILETIME* lpExitTime,
+ ::_FILETIME* lpKernelTime,
+ ::_FILETIME* lpUserTime);
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetThreadTimes;
-#else
- extern "C" __declspec(dllimport) BOOL_ WINAPI
- GetThreadTimes(
- HANDLE_ hThread,
- LPFILETIME_ lpCreationTime,
- LPFILETIME_ lpExitTime,
- LPFILETIME_ lpKernelTime,
- LPFILETIME_ lpUserTime
- );
-#endif
+
+BOOST_FORCEINLINE BOOL_ GetThreadTimes(
+ HANDLE_ hThread,
+ LPFILETIME_ lpCreationTime,
+ LPFILETIME_ lpExitTime,
+ LPFILETIME_ lpKernelTime,
+ LPFILETIME_ lpUserTime)
+{
+ return ::GetThreadTimes(
+ hThread,
+ reinterpret_cast< ::_FILETIME* >(lpCreationTime),
+ reinterpret_cast< ::_FILETIME* >(lpExitTime),
+ reinterpret_cast< ::_FILETIME* >(lpKernelTime),
+ reinterpret_cast< ::_FILETIME* >(lpUserTime));
+}
+
}
}
}
diff --git a/boost/detail/winapi/LocalFree.hpp b/boost/detail/winapi/LocalFree.hpp
deleted file mode 100644
index 697016c0c6..0000000000
--- a/boost/detail/winapi/LocalFree.hpp
+++ /dev/null
@@ -1,33 +0,0 @@
-// LocalFree.hpp --------------------------------------------------------------//
-
-// Copyright 2010 Vicente J. Botet Escriba
-
-// Distributed under the Boost Software License, Version 1.0.
-// See http://www.boost.org/LICENSE_1_0.txt
-
-
-#ifndef BOOST_DETAIL_WINAPI_LOCALFREE_HPP
-#define BOOST_DETAIL_WINAPI_LOCALFREE_HPP
-
-#include <boost/detail/winapi/basic_types.hpp>
-
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
-#endif
-
-namespace boost {
-namespace detail {
-namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
- typedef HANDLE_ HLOCAL_;
-
- using ::LocalFree;
-#else
- extern "C" typedef HANDLE_ HLOCAL_;
- extern "C" __declspec(dllimport) HLOCAL_ WINAPI
- LocalFree(HLOCAL_ hMem);
-#endif
-}
-}
-}
-#endif // BOOST_DETAIL_WINAPI_LOCALFREE_HPP
diff --git a/boost/detail/winapi/apc.hpp b/boost/detail/winapi/apc.hpp
new file mode 100644
index 0000000000..6913045bec
--- /dev/null
+++ b/boost/detail/winapi/apc.hpp
@@ -0,0 +1,47 @@
+// apc.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_APC_HPP
+#define BOOST_DETAIL_WINAPI_APC_HPP
+
+#include <boost/detail/winapi/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+typedef boost::detail::winapi::VOID_
+(NTAPI *PAPCFUNC)(boost::detail::winapi::ULONG_PTR_ Parameter);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+QueueUserAPC(
+ PAPCFUNC pfnAPC,
+ boost::detail::winapi::HANDLE_ hThread,
+ boost::detail::winapi::ULONG_PTR_ dwData);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+typedef ::PAPCFUNC PAPCFUNC_;
+using ::QueueUserAPC;
+}
+}
+}
+
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+
+#endif // BOOST_DETAIL_WINAPI_APC_HPP
diff --git a/boost/detail/winapi/basic_types.hpp b/boost/detail/winapi/basic_types.hpp
index 09d907bdc2..717e934e42 100644
--- a/boost/detail/winapi/basic_types.hpp
+++ b/boost/detail/winapi/basic_types.hpp
@@ -1,11 +1,11 @@
// basic_types.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
-
#ifndef BOOST_DETAIL_WINAPI_BASIC_TYPES_HPP
#define BOOST_DETAIL_WINAPI_BASIC_TYPES_HPP
@@ -13,11 +13,14 @@
#include <boost/cstdint.hpp>
#include <boost/detail/winapi/config.hpp>
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
#if defined( BOOST_USE_WINDOWS_H )
# include <windows.h>
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined(__CYGWIN__)
# include <winerror.h>
-// @FIXME Which condition must be tested
# ifdef UNDER_CE
# ifndef WINAPI
# ifndef _WIN32_WCE_EMULATION
@@ -26,9 +29,14 @@
# define WINAPI __stdcall
# endif
# endif
+// Windows CE defines a few functions as inline functions in kfuncs.h
+typedef int BOOL;
+typedef unsigned long DWORD;
+typedef void* HANDLE;
+# include <kfuncs.h>
# else
# ifndef WINAPI
-# define WINAPI __stdcall
+# define WINAPI __stdcall
# endif
# endif
# ifndef NTAPI
@@ -38,95 +46,178 @@
# error "Win32 functions not available"
#endif
-#ifdef BOOST_HAS_PRAGMA_ONCE
-#pragma once
+#ifndef NO_STRICT
+#ifndef STRICT
+#define STRICT 1
+#endif
+#endif
+
+#if defined(STRICT)
+#define BOOST_DETAIL_WINAPI_DECLARE_HANDLE(x) struct x##__; typedef struct x##__ *x
+#else
+#define BOOST_DETAIL_WINAPI_DECLARE_HANDLE(x) typedef void* x
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+union _LARGE_INTEGER;
+struct _SECURITY_ATTRIBUTES;
+BOOST_DETAIL_WINAPI_DECLARE_HANDLE(HINSTANCE);
+typedef HINSTANCE HMODULE;
+}
+#endif
+
+#if defined(__GNUC__)
+#define BOOST_DETAIL_WINAPI_MAY_ALIAS __attribute__ ((__may_alias__))
+#else
+#define BOOST_DETAIL_WINAPI_MAY_ALIAS
#endif
+// MinGW64 gcc 4.8.2 fails to compile function declarations with boost::detail::winapi::VOID_ arguments even though
+// the typedef expands to void. In Windows SDK, VOID is a macro which unfolds to void. We use our own macro in such cases.
+#define BOOST_DETAIL_WINAPI_VOID void
+
namespace boost {
namespace detail {
namespace winapi {
#if defined( BOOST_USE_WINDOWS_H )
- typedef ::BOOL BOOL_;
- typedef ::BOOLEAN BOOLEAN_;
- typedef ::PBOOLEAN PBOOLEAN_;
- typedef ::BYTE BYTE_;
- typedef ::WORD WORD_;
- typedef ::DWORD DWORD_;
- typedef ::HANDLE HANDLE_;
- typedef ::HMODULE HMODULE_;
- typedef ::LONG LONG_;
- typedef ::ULONG ULONG_;
- typedef ::LONGLONG LONGLONG_;
- typedef ::ULONGLONG ULONGLONG_;
- typedef ::INT_PTR INT_PTR_;
- typedef ::UINT_PTR UINT_PTR_;
- typedef ::LONG_PTR LONG_PTR_;
- typedef ::ULONG_PTR ULONG_PTR_;
- typedef ::LARGE_INTEGER LARGE_INTEGER_;
- typedef ::PLARGE_INTEGER PLARGE_INTEGER_;
- typedef ::PVOID PVOID_;
- typedef ::LPVOID LPVOID_;
- typedef ::CHAR CHAR_;
- typedef ::LPSTR LPSTR_;
- typedef ::LPCSTR LPCSTR_;
- typedef ::WCHAR WCHAR_;
- typedef ::LPWSTR LPWSTR_;
- typedef ::LPCWSTR LPCWSTR_;
-#else
-extern "C" {
- typedef int BOOL_;
- typedef unsigned char BYTE_;
- typedef BYTE_ BOOLEAN_;
- typedef BOOLEAN_* PBOOLEAN_;
- typedef unsigned short WORD_;
- typedef unsigned long DWORD_;
- typedef void* HANDLE_;
- typedef void* HMODULE_;
-
- typedef long LONG_;
- typedef unsigned long ULONG_;
-
- typedef boost::int64_t LONGLONG_;
- typedef boost::uint64_t ULONGLONG_;
-
-// @FIXME Which condition must be tested
+
+typedef ::BOOL BOOL_;
+typedef ::PBOOL PBOOL_;
+typedef ::LPBOOL LPBOOL_;
+typedef ::BOOLEAN BOOLEAN_;
+typedef ::PBOOLEAN PBOOLEAN_;
+typedef ::BYTE BYTE_;
+typedef ::PBYTE PBYTE_;
+typedef ::LPBYTE LPBYTE_;
+typedef ::WORD WORD_;
+typedef ::PWORD PWORD_;
+typedef ::LPWORD LPWORD_;
+typedef ::DWORD DWORD_;
+typedef ::PDWORD PDWORD_;
+typedef ::LPDWORD LPDWORD_;
+typedef ::HANDLE HANDLE_;
+typedef ::PHANDLE PHANDLE_;
+typedef ::INT INT_;
+typedef ::PINT PINT_;
+typedef ::LPINT LPINT_;
+typedef ::UINT UINT_;
+typedef ::PUINT PUINT_;
+typedef ::LONG LONG_;
+typedef ::PLONG PLONG_;
+typedef ::LPLONG LPLONG_;
+typedef ::ULONG ULONG_;
+typedef ::PULONG PULONG_;
+typedef ::LONGLONG LONGLONG_;
+typedef ::ULONGLONG ULONGLONG_;
+typedef ::INT_PTR INT_PTR_;
+typedef ::UINT_PTR UINT_PTR_;
+typedef ::LONG_PTR LONG_PTR_;
+typedef ::ULONG_PTR ULONG_PTR_;
+typedef ::DWORD_PTR DWORD_PTR_;
+typedef ::PDWORD_PTR PDWORD_PTR_;
+typedef ::SIZE_T SIZE_T_;
+typedef ::PSIZE_T PSIZE_T_;
+typedef ::SSIZE_T SSIZE_T_;
+typedef ::PSSIZE_T PSSIZE_T_;
+typedef VOID VOID_; // VOID is a macro
+typedef ::PVOID PVOID_;
+typedef ::LPVOID LPVOID_;
+typedef ::LPCVOID LPCVOID_;
+typedef ::CHAR CHAR_;
+typedef ::LPSTR LPSTR_;
+typedef ::LPCSTR LPCSTR_;
+typedef ::WCHAR WCHAR_;
+typedef ::LPWSTR LPWSTR_;
+typedef ::LPCWSTR LPCWSTR_;
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+typedef int BOOL_;
+typedef BOOL_* PBOOL_;
+typedef BOOL_* LPBOOL_;
+typedef unsigned char BYTE_;
+typedef BYTE_* PBYTE_;
+typedef BYTE_* LPBYTE_;
+typedef BYTE_ BOOLEAN_;
+typedef BOOLEAN_* PBOOLEAN_;
+typedef unsigned short WORD_;
+typedef WORD_* PWORD_;
+typedef WORD_* LPWORD_;
+typedef unsigned long DWORD_;
+typedef DWORD_* PDWORD_;
+typedef DWORD_* LPDWORD_;
+typedef void* HANDLE_;
+typedef void** PHANDLE_;
+
+typedef int INT_;
+typedef INT_* PINT_;
+typedef INT_* LPINT_;
+typedef unsigned int UINT_;
+typedef UINT_* PUINT_;
+typedef long LONG_;
+typedef LONG_* PLONG_;
+typedef LONG_* LPLONG_;
+typedef unsigned long ULONG_;
+typedef ULONG_* PULONG_;
+
+typedef boost::int64_t LONGLONG_;
+typedef boost::uint64_t ULONGLONG_;
+
# ifdef _WIN64
-#if defined(__CYGWIN__)
- typedef long INT_PTR_;
- typedef unsigned long UINT_PTR_;
- typedef long LONG_PTR_;
- typedef unsigned long ULONG_PTR_;
-#else
- typedef __int64 INT_PTR_;
- typedef unsigned __int64 UINT_PTR_;
- typedef __int64 LONG_PTR_;
- typedef unsigned __int64 ULONG_PTR_;
-#endif
+# if defined(__CYGWIN__)
+typedef long INT_PTR_;
+typedef unsigned long UINT_PTR_;
+typedef long LONG_PTR_;
+typedef unsigned long ULONG_PTR_;
+# else
+typedef __int64 INT_PTR_;
+typedef unsigned __int64 UINT_PTR_;
+typedef __int64 LONG_PTR_;
+typedef unsigned __int64 ULONG_PTR_;
+# endif
# else
- typedef int INT_PTR_;
- typedef unsigned int UINT_PTR_;
- typedef long LONG_PTR_;
- typedef unsigned long ULONG_PTR_;
+typedef int INT_PTR_;
+typedef unsigned int UINT_PTR_;
+typedef long LONG_PTR_;
+typedef unsigned long ULONG_PTR_;
# endif
- typedef struct _LARGE_INTEGER {
- LONGLONG_ QuadPart;
- } LARGE_INTEGER_;
- typedef LARGE_INTEGER_ *PLARGE_INTEGER_;
+typedef ULONG_PTR_ DWORD_PTR_, *PDWORD_PTR_;
+typedef ULONG_PTR_ SIZE_T_, *PSIZE_T_;
+typedef LONG_PTR_ SSIZE_T_, *PSSIZE_T_;
- typedef void *PVOID_;
- typedef void *LPVOID_;
- typedef const void *LPCVOID_;
+typedef void VOID_;
+typedef void *PVOID_;
+typedef void *LPVOID_;
+typedef const void *LPCVOID_;
- typedef char CHAR_;
- typedef CHAR_ *LPSTR_;
- typedef const CHAR_ *LPCSTR_;
+typedef char CHAR_;
+typedef CHAR_ *LPSTR_;
+typedef const CHAR_ *LPCSTR_;
+
+typedef wchar_t WCHAR_;
+typedef WCHAR_ *LPWSTR_;
+typedef const WCHAR_ *LPCWSTR_;
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+typedef ::HMODULE HMODULE_;
+
+typedef union BOOST_DETAIL_WINAPI_MAY_ALIAS _LARGE_INTEGER {
+ struct {
+ DWORD_ LowPart;
+ LONG_ HighPart;
+ } u;
+ LONGLONG_ QuadPart;
+} LARGE_INTEGER_, *PLARGE_INTEGER_;
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _SECURITY_ATTRIBUTES {
+ DWORD_ nLength;
+ LPVOID_ lpSecurityDescriptor;
+ BOOL_ bInheritHandle;
+} SECURITY_ATTRIBUTES_, *PSECURITY_ATTRIBUTES_, *LPSECURITY_ATTRIBUTES_;
- typedef wchar_t WCHAR_;
- typedef WCHAR_ *LPWSTR_;
- typedef const WCHAR_ *LPCWSTR_;
-}
-#endif
}
}
}
diff --git a/boost/detail/winapi/condition_variable.hpp b/boost/detail/winapi/condition_variable.hpp
new file mode 100644
index 0000000000..b47a537158
--- /dev/null
+++ b/boost/detail/winapi/condition_variable.hpp
@@ -0,0 +1,116 @@
+// condition_variable.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_HPP
+#define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_HPP
+
+#include <boost/detail/winapi/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+struct _RTL_CONDITION_VARIABLE;
+struct _RTL_CRITICAL_SECTION;
+struct _RTL_SRWLOCK;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+InitializeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+WakeConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+WakeAllConditionVariable(::_RTL_CONDITION_VARIABLE* ConditionVariable);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SleepConditionVariableCS(
+ ::_RTL_CONDITION_VARIABLE* ConditionVariable,
+ ::_RTL_CRITICAL_SECTION* CriticalSection,
+ boost::detail::winapi::DWORD_ dwMilliseconds);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SleepConditionVariableSRW(
+ ::_RTL_CONDITION_VARIABLE* ConditionVariable,
+ ::_RTL_SRWLOCK* SRWLock,
+ boost::detail::winapi::DWORD_ dwMilliseconds,
+ boost::detail::winapi::ULONG_ Flags);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _RTL_CONDITION_VARIABLE {
+ PVOID_ Ptr;
+} CONDITION_VARIABLE_, *PCONDITION_VARIABLE_;
+struct _RTL_CRITICAL_SECTION;
+struct _RTL_SRWLOCK;
+
+BOOST_FORCEINLINE VOID_ InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
+{
+ ::InitializeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
+}
+
+BOOST_FORCEINLINE VOID_ WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
+{
+ ::WakeConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
+}
+
+BOOST_FORCEINLINE VOID_ WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable)
+{
+ ::WakeAllConditionVariable(reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable));
+}
+
+BOOST_FORCEINLINE BOOL_ SleepConditionVariableCS(
+ PCONDITION_VARIABLE_ ConditionVariable,
+ _RTL_CRITICAL_SECTION* CriticalSection,
+ DWORD_ dwMilliseconds)
+{
+ return ::SleepConditionVariableCS(
+ reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
+ reinterpret_cast< ::_RTL_CRITICAL_SECTION* >(CriticalSection),
+ dwMilliseconds);
+}
+
+BOOST_FORCEINLINE BOOL_ SleepConditionVariableSRW(
+ PCONDITION_VARIABLE_ ConditionVariable,
+ _RTL_SRWLOCK* SRWLock,
+ DWORD_ dwMilliseconds,
+ ULONG_ Flags)
+{
+ return ::SleepConditionVariableSRW(
+ reinterpret_cast< ::_RTL_CONDITION_VARIABLE* >(ConditionVariable),
+ reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock),
+ dwMilliseconds,
+ Flags);
+}
+
+#if defined( BOOST_USE_WINDOWS_H )
+const ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = CONDITION_VARIABLE_LOCKMODE_SHARED;
+#else // defined( BOOST_USE_WINDOWS_H )
+const ULONG_ CONDITION_VARIABLE_LOCKMODE_SHARED_ = 0x00000001;
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED_;
+
+}
+}
+}
+
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+#endif // BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_HPP
diff --git a/boost/detail/winapi/config.hpp b/boost/detail/winapi/config.hpp
index 2b0cdfbada..c67d670dd2 100644
--- a/boost/detail/winapi/config.hpp
+++ b/boost/detail/winapi/config.hpp
@@ -10,11 +10,24 @@
#define BOOST_DETAIL_WINAPI_CONFIG_HPP_INCLUDED_
#include <boost/config.hpp>
+#if defined __MINGW32__
+#include <_mingw.h>
+#endif
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
+// BOOST_WINAPI_IS_MINGW indicates that the target Windows SDK is provided by MinGW (http://mingw.org/).
+// BOOST_WINAPI_IS_MINGW_W64 indicates that the target Windows SDK is provided by MinGW-w64 (http://mingw-w64.org).
+#if defined __MINGW32__
+#if defined __MINGW64_VERSION_MAJOR
+#define BOOST_WINAPI_IS_MINGW_W64
+#else
+#define BOOST_WINAPI_IS_MINGW
+#endif
+#endif
+
// These constants reflect _WIN32_WINNT_* macros from sdkddkver.h
// See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx#setting_winver_or__win32_winnt
#define BOOST_WINAPI_VERSION_NT4 0x0400
@@ -28,6 +41,8 @@
#define BOOST_WINAPI_VERSION_WIN7 0x0601
#define BOOST_WINAPI_VERSION_WIN8 0x0602
#define BOOST_WINAPI_VERSION_WINBLUE 0x0603
+#define BOOST_WINAPI_VERSION_WINTHRESHOLD 0x0A00
+#define BOOST_WINAPI_VERSION_WIN10 0x0A00
#if !defined(BOOST_USE_WINAPI_VERSION)
#if defined(_WIN32_WINNT)
@@ -35,8 +50,12 @@
#elif defined(WINVER)
#define BOOST_USE_WINAPI_VERSION WINVER
#else
-// By default use Windows XP API
+// By default use Windows Vista API on compilers that support it and XP on the others
+#if (defined(_MSC_VER) && _MSC_VER <= 1400) || defined(BOOST_WINAPI_IS_MINGW)
#define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WINXP
+#else
+#define BOOST_USE_WINAPI_VERSION BOOST_WINAPI_VERSION_WIN6
+#endif
#endif
#endif
diff --git a/boost/detail/winapi/critical_section.hpp b/boost/detail/winapi/critical_section.hpp
new file mode 100644
index 0000000000..be1d3472c4
--- /dev/null
+++ b/boost/detail/winapi/critical_section.hpp
@@ -0,0 +1,184 @@
+// critical_section.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP
+#define BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/detail/cast_ptr.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+
+extern "C" {
+#if !defined( BOOST_WINAPI_IS_MINGW )
+struct _RTL_CRITICAL_SECTION;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+InitializeCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+EnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+LeaveCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
+
+#if BOOST_USE_WINAPI_VERSION >= 0x0403
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitializeCriticalSectionAndSpinCount(
+ ::_RTL_CRITICAL_SECTION* lpCriticalSection,
+ boost::detail::winapi::DWORD_ dwSpinCount);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitializeCriticalSectionEx(
+ ::_RTL_CRITICAL_SECTION* lpCriticalSection,
+ boost::detail::winapi::DWORD_ dwSpinCount,
+ boost::detail::winapi::DWORD_ Flags);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+SetCriticalSectionSpinCount(
+ ::_RTL_CRITICAL_SECTION* lpCriticalSection,
+ boost::detail::winapi::DWORD_ dwSpinCount);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+TryEnterCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+DeleteCriticalSection(::_RTL_CRITICAL_SECTION* lpCriticalSection);
+
+#else // defined( BOOST_WINAPI_IS_MINGW )
+
+// MinGW uses a different name for the structure
+struct _CRITICAL_SECTION;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+InitializeCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+EnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+LeaveCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
+
+#if BOOST_USE_WINAPI_VERSION >= 0x0403
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitializeCriticalSectionAndSpinCount(
+ ::_CRITICAL_SECTION* lpCriticalSection,
+ boost::detail::winapi::DWORD_ dwSpinCount);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitializeCriticalSectionEx(
+ ::_CRITICAL_SECTION* lpCriticalSection,
+ boost::detail::winapi::DWORD_ dwSpinCount,
+ boost::detail::winapi::DWORD_ Flags);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+SetCriticalSectionSpinCount(
+ ::_CRITICAL_SECTION* lpCriticalSection,
+ boost::detail::winapi::DWORD_ dwSpinCount);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+TryEnterCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+DeleteCriticalSection(::_CRITICAL_SECTION* lpCriticalSection);
+
+#endif // defined( BOOST_WINAPI_IS_MINGW )
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+struct _RTL_CRITICAL_SECTION_DEBUG;
+
+#pragma pack(push, 8)
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _RTL_CRITICAL_SECTION {
+ _RTL_CRITICAL_SECTION_DEBUG* DebugInfo;
+ LONG_ LockCount;
+ LONG_ RecursionCount;
+ HANDLE_ OwningThread;
+ HANDLE_ LockSemaphore;
+ ULONG_PTR_ SpinCount;
+} CRITICAL_SECTION_, *PCRITICAL_SECTION_;
+
+#pragma pack(pop)
+
+BOOST_FORCEINLINE VOID_ InitializeCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
+{
+ ::InitializeCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
+}
+
+BOOST_FORCEINLINE VOID_ EnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
+{
+ ::EnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
+}
+
+BOOST_FORCEINLINE VOID_ LeaveCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
+{
+ ::LeaveCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
+}
+
+#if BOOST_USE_WINAPI_VERSION >= 0x0403
+BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
+{
+ return ::InitializeCriticalSectionAndSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
+}
+
+// CRITICAL_SECTION_NO_DEBUG_INFO is defined for WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+const DWORD_ CRITICAL_SECTION_NO_DEBUG_INFO_ = 0x01000000;
+const DWORD_ CRITICAL_SECTION_FLAG_NO_DEBUG_INFO_ = CRITICAL_SECTION_NO_DEBUG_INFO_;
+const DWORD_ CRITICAL_SECTION_FLAG_DYNAMIC_SPIN_ = 0x02000000; // undocumented
+const DWORD_ CRITICAL_SECTION_FLAG_STATIC_INIT_ = 0x04000000; // undocumented
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE BOOL_ InitializeCriticalSectionEx(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount, DWORD_ Flags)
+{
+ return ::InitializeCriticalSectionEx(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount, Flags);
+}
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+BOOST_FORCEINLINE DWORD_ SetCriticalSectionSpinCount(CRITICAL_SECTION_* lpCriticalSection, DWORD_ dwSpinCount)
+{
+ return ::SetCriticalSectionSpinCount(winapi::detail::cast_ptr(lpCriticalSection), dwSpinCount);
+}
+#endif // BOOST_USE_WINAPI_VERSION >= 0x0403
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+BOOST_FORCEINLINE BOOL_ TryEnterCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
+{
+ return ::TryEnterCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
+}
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+
+BOOST_FORCEINLINE VOID_ DeleteCriticalSection(CRITICAL_SECTION_* lpCriticalSection)
+{
+ ::DeleteCriticalSection(winapi::detail::cast_ptr(lpCriticalSection));
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_CRITICAL_SECTION_HPP
diff --git a/boost/detail/winapi/crypt.hpp b/boost/detail/winapi/crypt.hpp
index c9108f29bf..4d2ebedb01 100644
--- a/boost/detail/winapi/crypt.hpp
+++ b/boost/detail/winapi/crypt.hpp
@@ -1,6 +1,7 @@
// crypt.hpp --------------------------------------------------------------//
// Copyright 2014 Antony Polukhin
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -10,77 +11,181 @@
#define BOOST_DETAIL_WINAPI_CRYPT_HPP
#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/detail/cast_ptr.hpp>
+#if defined( BOOST_USE_WINDOWS_H ) && defined( BOOST_WINAPI_IS_MINGW )
+// MinGW does not include this header as part of windows.h
+#include <wincrypt.h>
+#endif
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
+#if !defined( BOOST_USE_WINDOWS_H )
+namespace boost { namespace detail { namespace winapi {
+typedef ULONG_PTR_ HCRYPTPROV_;
+}}}
+
+// Some versions of MinGW (including the latest ones) contain buggy declarations of CryptEnumProvidersA and CryptEnumProvidersW.
+// We cannot detect those broken versions, and we can't include the system header because it's incomplete.
+// So below we duplicate the broken declarations here and work around the problem with cast_ptr. These declarations
+// will have to be removed when MinGW is fixed.
+
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+#if !defined( BOOST_WINAPI_IS_MINGW ) || !defined( UNICODE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptEnumProvidersA(
+ boost::detail::winapi::DWORD_ dwIndex,
+ boost::detail::winapi::DWORD_ *pdwReserved,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ *pdwProvType,
+ boost::detail::winapi::LPSTR_ szProvName,
+ boost::detail::winapi::DWORD_ *pcbProvName);
+#else
+// Broken declaration in MinGW
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptEnumProvidersA(
+ boost::detail::winapi::DWORD_ dwIndex,
+ boost::detail::winapi::DWORD_ *pdwReserved,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ *pdwProvType,
+ boost::detail::winapi::LPWSTR_ szProvName,
+ boost::detail::winapi::DWORD_ *pcbProvName);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptAcquireContextA(
+ boost::detail::winapi::HCRYPTPROV_ *phProv,
+ boost::detail::winapi::LPCSTR_ pszContainer,
+ boost::detail::winapi::LPCSTR_ pszProvider,
+ boost::detail::winapi::DWORD_ dwProvType,
+ boost::detail::winapi::DWORD_ dwFlags);
+#endif // !defined( BOOST_NO_ANSI_APIS )
+
+#if !defined( BOOST_WINAPI_IS_MINGW ) || defined( UNICODE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptEnumProvidersW(
+ boost::detail::winapi::DWORD_ dwIndex,
+ boost::detail::winapi::DWORD_ *pdwReserved,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ *pdwProvType,
+ boost::detail::winapi::LPWSTR_ szProvName,
+ boost::detail::winapi::DWORD_ *pcbProvName);
+#else
+// Broken declaration in MinGW
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptEnumProvidersW(
+ boost::detail::winapi::DWORD_ dwIndex,
+ boost::detail::winapi::DWORD_ *pdwReserved,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ *pdwProvType,
+ boost::detail::winapi::LPSTR_ szProvName,
+ boost::detail::winapi::DWORD_ *pcbProvName);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptAcquireContextW(
+ boost::detail::winapi::HCRYPTPROV_ *phProv,
+ boost::detail::winapi::LPCWSTR_ szContainer,
+ boost::detail::winapi::LPCWSTR_ szProvider,
+ boost::detail::winapi::DWORD_ dwProvType,
+ boost::detail::winapi::DWORD_ dwFlags);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptGenRandom(
+ boost::detail::winapi::HCRYPTPROV_ hProv,
+ boost::detail::winapi::DWORD_ dwLen,
+ boost::detail::winapi::BYTE_ *pbBuffer);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CryptReleaseContext(
+ boost::detail::winapi::HCRYPTPROV_ hProv,
+ boost::detail::winapi::DWORD_ dwFlags);
+}
+#endif // !defined( BOOST_USE_WINDOWS_H )
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
#if defined( BOOST_USE_WINDOWS_H )
- typedef HCRYPTPROV HCRYPTPROV_;
- using ::CryptEnumProvidersA;
- using ::CryptAcquireContextA;
- using ::CryptGenRandom;
- using ::CryptReleaseContext;
+typedef ::HCRYPTPROV HCRYPTPROV_;
- const DWORD_ PROV_RSA_FULL_ = PROV_RSA_FULL;
+const DWORD_ PROV_RSA_FULL_ = PROV_RSA_FULL;
+
+const DWORD_ CRYPT_VERIFYCONTEXT_ = CRYPT_VERIFYCONTEXT;
+const DWORD_ CRYPT_NEWKEYSET_ = CRYPT_NEWKEYSET;
+const DWORD_ CRYPT_DELETEKEYSET_ = CRYPT_DELETEKEYSET;
+const DWORD_ CRYPT_MACHINE_KEYSET_ = CRYPT_MACHINE_KEYSET;
+const DWORD_ CRYPT_SILENT_ = CRYPT_SILENT;
- const DWORD_ CRYPT_VERIFYCONTEXT_ = CRYPT_VERIFYCONTEXT;
- const DWORD_ CRYPT_NEWKEYSET_ = CRYPT_NEWKEYSET;
- const DWORD_ CRYPT_DELETEKEYSET_ = CRYPT_DELETEKEYSET;
- const DWORD_ CRYPT_MACHINE_KEYSET_ = CRYPT_MACHINE_KEYSET;
- const DWORD_ CRYPT_SILENT_ = CRYPT_SILENT;
#else
-extern "C" {
- typedef ULONG_PTR_ HCRYPTPROV_;
-
- __declspec(dllimport) BOOL_ __stdcall
- CryptEnumProvidersA(
- DWORD_ dwIndex,
- DWORD_ *pdwReserved,
- DWORD_ dwFlags,
- DWORD_ *pdwProvType,
- LPSTR_ szProvName,
- DWORD_ *pcbProvName
- );
-
- __declspec(dllimport) BOOL_ __stdcall
- CryptAcquireContextA(
- HCRYPTPROV_ *phProv,
- LPCSTR_ pszContainer,
- LPCSTR_ pszProvider,
- DWORD_ dwProvType,
- DWORD_ dwFlags
- );
-
- __declspec(dllimport) BOOL_ __stdcall
- CryptGenRandom(
- HCRYPTPROV_ hProv,
- DWORD_ dwLen,
- BYTE_ *pbBuffer
- );
-
- __declspec(dllimport) BOOL_ __stdcall
- CryptReleaseContext(
- HCRYPTPROV_ hProv,
- DWORD_ dwFlags
- );
-
- const DWORD_ PROV_RSA_FULL_ = 1;
-
- const DWORD_ CRYPT_VERIFYCONTEXT_ = 0xF0000000;
- const DWORD_ CRYPT_NEWKEYSET_ = 8;
- const DWORD_ CRYPT_DELETEKEYSET_ = 16;
- const DWORD_ CRYPT_MACHINE_KEYSET_ = 32;
- const DWORD_ CRYPT_SILENT_ = 64;
+
+const DWORD_ PROV_RSA_FULL_ = 1;
+
+const DWORD_ CRYPT_VERIFYCONTEXT_ = 0xF0000000;
+const DWORD_ CRYPT_NEWKEYSET_ = 8;
+const DWORD_ CRYPT_DELETEKEYSET_ = 16;
+const DWORD_ CRYPT_MACHINE_KEYSET_ = 32;
+const DWORD_ CRYPT_SILENT_ = 64;
+
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::CryptEnumProvidersA;
+using ::CryptAcquireContextA;
+#endif
+using ::CryptEnumProvidersW;
+using ::CryptAcquireContextW;
+using ::CryptGenRandom;
+using ::CryptReleaseContext;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE BOOL_ crypt_enum_providers(
+ DWORD_ dwIndex,
+ DWORD_ *pdwReserved,
+ DWORD_ dwFlags,
+ DWORD_ *pdwProvType,
+ LPSTR_ szProvName,
+ DWORD_ *pcbProvName)
+{
+ return ::CryptEnumProvidersA(dwIndex, pdwReserved, dwFlags, pdwProvType, winapi::detail::cast_ptr(szProvName), pcbProvName);
+}
+
+BOOST_FORCEINLINE BOOL_ crypt_acquire_context(
+ HCRYPTPROV_ *phProv,
+ LPCSTR_ pszContainer,
+ LPCSTR_ pszProvider,
+ DWORD_ dwProvType,
+ DWORD_ dwFlags)
+{
+ return ::CryptAcquireContextA(phProv, pszContainer, pszProvider, dwProvType, dwFlags);
}
#endif
+
+BOOST_FORCEINLINE BOOL_ crypt_enum_providers(
+ DWORD_ dwIndex,
+ DWORD_ *pdwReserved,
+ DWORD_ dwFlags,
+ DWORD_ *pdwProvType,
+ LPWSTR_ szProvName,
+ DWORD_ *pcbProvName)
+{
+ return ::CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, winapi::detail::cast_ptr(szProvName), pcbProvName);
+}
+
+BOOST_FORCEINLINE BOOL_ crypt_acquire_context(
+ HCRYPTPROV_ *phProv,
+ LPCWSTR_ szContainer,
+ LPCWSTR_ szProvider,
+ DWORD_ dwProvType,
+ DWORD_ dwFlags)
+{
+ return ::CryptAcquireContextW(phProv, szContainer, szProvider, dwProvType, dwFlags);
+}
+
}
}
}
diff --git a/boost/detail/winapi/detail/cast_ptr.hpp b/boost/detail/winapi/detail/cast_ptr.hpp
new file mode 100644
index 0000000000..261007ee7a
--- /dev/null
+++ b/boost/detail/winapi/detail/cast_ptr.hpp
@@ -0,0 +1,40 @@
+// cast_ptr.hpp --------------------------------------------------------------//
+
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_DETAIL_CAST_PTR_HPP
+#define BOOST_DETAIL_WINAPI_DETAIL_CAST_PTR_HPP
+
+#include <boost/detail/winapi/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+namespace detail {
+
+//! This class is used to automatically cast pointers to the type used in the current Windows SDK function declarations
+class cast_ptr
+{
+private:
+ const void* m_p;
+
+public:
+ explicit BOOST_FORCEINLINE cast_ptr(const void* p) BOOST_NOEXCEPT : m_p(p) {}
+ template< typename T >
+ BOOST_FORCEINLINE operator T* () const BOOST_NOEXCEPT { return (T*)m_p; }
+};
+
+}
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_DETAIL_CAST_PTR_HPP
diff --git a/boost/detail/winapi/directory_management.hpp b/boost/detail/winapi/directory_management.hpp
index 19af1ee4ea..61e406b02e 100644
--- a/boost/detail/winapi/directory_management.hpp
+++ b/boost/detail/winapi/directory_management.hpp
@@ -1,6 +1,7 @@
// directory_management.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -10,37 +11,83 @@
#define BOOST_DETAIL_WINAPI_DIRECTORY_MANAGEMENT_HPP
#include <boost/detail/winapi/basic_types.hpp>
-#include <boost/detail/winapi/security.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
- using ::CreateDirectory;
- using ::CreateDirectoryA;
- using ::GetTempPathA;
- using ::RemoveDirectoryA;
-#else
-extern "C" {
- __declspec(dllimport) int __stdcall
- CreateDirectory(LPCTSTR_, LPSECURITY_ATTRIBUTES_*);
- __declspec(dllimport) int __stdcall
- CreateDirectoryA(LPCTSTR_, interprocess_security_attributes*);
- __declspec(dllimport) int __stdcall
- GetTempPathA(unsigned long length, char *buffer);
- __declspec(dllimport) int __stdcall
- RemoveDirectoryA(LPCTSTR_);
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ CreateDirectoryA(boost::detail::winapi::LPCSTR_, ::_SECURITY_ATTRIBUTES*);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+ GetTempPathA(boost::detail::winapi::DWORD_ length, boost::detail::winapi::LPSTR_ buffer);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ RemoveDirectoryA(boost::detail::winapi::LPCSTR_);
+#endif
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ CreateDirectoryW(boost::detail::winapi::LPCWSTR_, ::_SECURITY_ATTRIBUTES*);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+ GetTempPathW(boost::detail::winapi::DWORD_ length, boost::detail::winapi::LPWSTR_ buffer);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ RemoveDirectoryW(boost::detail::winapi::LPCWSTR_);
}
#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::GetTempPathA;
+using ::RemoveDirectoryA;
+#endif
+using ::GetTempPathW;
+using ::RemoveDirectoryW;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE BOOL_ CreateDirectoryA(LPCSTR_ pPathName, PSECURITY_ATTRIBUTES_ pSecurityAttributes)
+{
+ return ::CreateDirectoryA(pPathName, reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(pSecurityAttributes));
+}
+#endif
+
+BOOST_FORCEINLINE BOOL_ CreateDirectoryW(LPCWSTR_ pPathName, PSECURITY_ATTRIBUTES_ pSecurityAttributes)
+{
+ return ::CreateDirectoryW(pPathName, reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(pSecurityAttributes));
+}
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE BOOL_ create_directory(LPCSTR_ pPathName, PSECURITY_ATTRIBUTES_ pSecurityAttributes)
+{
+ return ::CreateDirectoryA(pPathName, reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(pSecurityAttributes));
+}
+BOOST_FORCEINLINE DWORD_ get_temp_path(DWORD_ length, LPSTR_ buffer)
+{
+ return ::GetTempPathA(length, buffer);
+}
+BOOST_FORCEINLINE BOOL_ remove_directory(LPCSTR_ pPathName)
+{
+ return ::RemoveDirectoryA(pPathName);
+}
+#endif
+
+BOOST_FORCEINLINE BOOL_ create_directory(LPCWSTR_ pPathName, PSECURITY_ATTRIBUTES_ pSecurityAttributes)
+{
+ return ::CreateDirectoryW(pPathName, reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(pSecurityAttributes));
}
+BOOST_FORCEINLINE DWORD_ get_temp_path(DWORD_ length, LPWSTR_ buffer)
+{
+ return ::GetTempPathW(length, buffer);
}
+BOOST_FORCEINLINE BOOL_ remove_directory(LPCWSTR_ pPathName)
+{
+ return ::RemoveDirectoryW(pPathName);
}
-#endif // BOOST_DETAIL_WINAPI_THREAD_HPP
+} // namespace winapi
+} // namespace detail
+} // namespace boost
+
+#endif // BOOST_DETAIL_WINAPI_DIRECTORY_MANAGEMENT_HPP
diff --git a/boost/detail/winapi/dll.hpp b/boost/detail/winapi/dll.hpp
index 2ec5a73bc9..5172f33880 100644
--- a/boost/detail/winapi/dll.hpp
+++ b/boost/detail/winapi/dll.hpp
@@ -1,6 +1,9 @@
// dll.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2014 Renato Tegon Forti, Antony Polukhin
+// Copyright 2015 Andrey Semashev
+// Copyright 2015 Antony Polukhin
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -10,77 +13,184 @@
#define BOOST_DETAIL_WINAPI_DLL_HPP
#include <boost/detail/winapi/basic_types.hpp>
-#include <boost/detail/winapi/security.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
-namespace boost
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+namespace boost { namespace detail { namespace winapi {
+#ifdef _WIN64
+typedef INT_PTR_ (WINAPI *FARPROC_)();
+typedef INT_PTR_ (WINAPI *NEARPROC_)();
+typedef INT_PTR_ (WINAPI *PROC_)();
+#else
+typedef int (WINAPI *FARPROC_)();
+typedef int (WINAPI *NEARPROC_)();
+typedef int (WINAPI *PROC_)();
+#endif // _WIN64
+}}} // namespace boost::detail::winapi
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HMODULE_ WINAPI
+LoadLibraryA(boost::detail::winapi::LPCSTR_ lpFileName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HMODULE_ WINAPI
+LoadLibraryExA(
+ boost::detail::winapi::LPCSTR_ lpFileName,
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::DWORD_ dwFlags
+);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HMODULE_ WINAPI
+GetModuleHandleA(boost::detail::winapi::LPCSTR_ lpFileName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+GetModuleFileNameA(
+ boost::detail::winapi::HMODULE_ hModule,
+ boost::detail::winapi::LPSTR_ lpFilename,
+ boost::detail::winapi::DWORD_ nSize
+);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HMODULE_ WINAPI
+LoadLibraryW(boost::detail::winapi::LPCWSTR_ lpFileName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HMODULE_ WINAPI
+LoadLibraryExW(
+ boost::detail::winapi::LPCWSTR_ lpFileName,
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::DWORD_ dwFlags
+);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HMODULE_ WINAPI
+GetModuleHandleW(boost::detail::winapi::LPCWSTR_ lpFileName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+GetModuleFileNameW(
+ boost::detail::winapi::HMODULE_ hModule,
+ boost::detail::winapi::LPWSTR_ lpFilename,
+ boost::detail::winapi::DWORD_ nSize
+);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FreeLibrary(boost::detail::winapi::HMODULE_ hModule);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::FARPROC_ WINAPI
+GetProcAddress(boost::detail::winapi::HMODULE_ hModule, boost::detail::winapi::LPCSTR_ lpProcName);
+
+struct _MEMORY_BASIC_INFORMATION;
+
+#if !defined( BOOST_WINAPI_IS_MINGW )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::SIZE_T_ WINAPI
+VirtualQuery(
+ boost::detail::winapi::LPCVOID_ lpAddress,
+ ::_MEMORY_BASIC_INFORMATION* lpBuffer,
+ boost::detail::winapi::ULONG_PTR_ dwLength
+);
+#else // !defined( BOOST_WINAPI_IS_MINGW )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+VirtualQuery(
+ boost::detail::winapi::LPCVOID_ lpAddress,
+ ::_MEMORY_BASIC_INFORMATION* lpBuffer,
+ boost::detail::winapi::DWORD_ dwLength
+);
+#endif // !defined( BOOST_WINAPI_IS_MINGW )
+} // extern "C"
+#endif // #if !defined( BOOST_USE_WINDOWS_H )
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS MEMORY_BASIC_INFORMATION_ {
+ PVOID_ BaseAddress;
+ PVOID_ AllocationBase;
+ DWORD_ AllocationProtect;
+ SIZE_T_ RegionSize;
+ DWORD_ State;
+ DWORD_ Protect;
+ DWORD_ Type;
+} *PMEMORY_BASIC_INFORMATION_;
+
+#if defined( BOOST_USE_WINDOWS_H )
+typedef ::FARPROC FARPROC_;
+typedef ::NEARPROC NEARPROC_;
+typedef ::PROC PROC_;
+
+const DWORD_ DONT_RESOLVE_DLL_REFERENCES_ = DONT_RESOLVE_DLL_REFERENCES;
+const DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_ = LOAD_WITH_ALTERED_SEARCH_PATH;
+#else // defined( BOOST_USE_WINDOWS_H )
+const DWORD_ DONT_RESOLVE_DLL_REFERENCES_ = 0x00000001;
+const DWORD_ LOAD_WITH_ALTERED_SEARCH_PATH_ = 0x00000008;
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+// This one is not defined by MinGW
+const DWORD_ LOAD_IGNORE_CODE_AUTHZ_LEVEL_ = 0x00000010;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::LoadLibraryA;
+using ::LoadLibraryExA;
+using ::GetModuleHandleA;
+using ::GetModuleFileNameA;
+#endif // !defined( BOOST_NO_ANSI_APIS )
+using ::LoadLibraryW;
+using ::LoadLibraryExW;
+using ::GetModuleHandleW;
+using ::GetModuleFileNameW;
+using ::FreeLibrary;
+using ::GetProcAddress;
+
+BOOST_FORCEINLINE SIZE_T_ VirtualQuery(LPCVOID_ lpAddress, MEMORY_BASIC_INFORMATION_* lpBuffer, ULONG_PTR_ dwLength)
{
-namespace detail
+ return ::VirtualQuery(lpAddress, reinterpret_cast< ::_MEMORY_BASIC_INFORMATION* >(lpBuffer), dwLength);
+}
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HMODULE_ load_library(LPCSTR_ lpFileName)
{
-namespace winapi
+ return ::LoadLibraryA(lpFileName);
+}
+
+BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
{
-#if defined( BOOST_USE_WINDOWS_H )
- typedef ::FARPROC FARPROC_;
- typedef ::NEARPROC NEARPROC_;
- typedef ::PROC PROC_;
-
-# ifdef BOOST_NO_ANSI_APIS
- using ::LoadLibraryW;
- using ::GetModuleHandleW;
-# else
- using ::LoadLibraryA;
- using ::GetModuleHandleA;
-# endif
- using ::FreeLibrary;
- using ::GetProcAddress;
-#else
-extern "C" {
-# ifdef _WIN64
- typedef INT_PTR_ (WINAPI *FARPROC_)();
- typedef INT_PTR_ (WINAPI *NEARPROC_)();
- typedef INT_PTR_ (WINAPI *PROC_)();
-# else
- typedef int (WINAPI *FARPROC_)();
- typedef int (WINAPI *NEARPROC_)();
- typedef int (WINAPI *PROC_)();
-# endif // _WIN64
-
-# ifdef BOOST_NO_ANSI_APIS
- __declspec(dllimport) HMODULE_ WINAPI
- LoadLibraryW(
- LPCWSTR_ lpFileName
- );
- __declspec(dllimport) HMODULE_ WINAPI
- GetModuleHandleW(
- LPCWSTR_ lpFileName
- );
-# else
- __declspec(dllimport) HMODULE_ WINAPI
- LoadLibraryA(
- LPCSTR_ lpFileName
- );
- __declspec(dllimport) HMODULE_ WINAPI
- GetModuleHandleA(
- LPCSTR_ lpFileName
- );
-# endif
-
- __declspec(dllimport) BOOL_ WINAPI
- FreeLibrary(
- HMODULE_ hModule
- );
- __declspec(dllimport) FARPROC_ WINAPI
- GetProcAddress(
- HMODULE_ hModule,
- LPCSTR_ lpProcName
- );
+ return ::LoadLibraryExA(lpFileName, hFile, dwFlags);
}
-#endif
+
+BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCSTR_ lpFileName)
+{
+ return ::GetModuleHandleA(lpFileName);
}
+
+BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPSTR_ lpFilename, DWORD_ nSize)
+{
+ return ::GetModuleFileNameA(hModule, lpFilename, nSize);
}
+#endif // #if !defined( BOOST_NO_ANSI_APIS )
+
+BOOST_FORCEINLINE HMODULE_ load_library(LPCWSTR_ lpFileName)
+{
+ return ::LoadLibraryW(lpFileName);
+}
+
+BOOST_FORCEINLINE HMODULE_ load_library_ex(LPCWSTR_ lpFileName, HANDLE_ hFile, DWORD_ dwFlags)
+{
+ return ::LoadLibraryExW(lpFileName, hFile, dwFlags);
}
+BOOST_FORCEINLINE HMODULE_ get_module_handle(LPCWSTR_ lpFileName)
+{
+ return ::GetModuleHandleW(lpFileName);
+}
+
+BOOST_FORCEINLINE DWORD_ get_module_file_name(HMODULE_ hModule, LPWSTR_ lpFilename, DWORD_ nSize)
+{
+ return ::GetModuleFileNameW(hModule, lpFilename, nSize);
+}
+
+} // namespace winapi
+} // namespace detail
+} // namespace boost
+
#endif // BOOST_DETAIL_WINAPI_DLL_HPP
diff --git a/boost/detail/winapi/error_handling.hpp b/boost/detail/winapi/error_handling.hpp
index fbe9924b25..cdd759ded5 100644
--- a/boost/detail/winapi/error_handling.hpp
+++ b/boost/detail/winapi/error_handling.hpp
@@ -1,6 +1,7 @@
// error_handling.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -9,85 +10,119 @@
#ifndef BOOST_DETAIL_WINAPI_ERROR_HANDLING_HPP
#define BOOST_DETAIL_WINAPI_ERROR_HANDLING_HPP
+#include <stdarg.h>
#include <boost/detail/winapi/basic_types.hpp>
-#include <boost/detail/winapi/GetCurrentThread.hpp>
+#include <boost/detail/winapi/GetLastError.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+FormatMessageA(
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::LPCVOID_ lpSource,
+ boost::detail::winapi::DWORD_ dwMessageId,
+ boost::detail::winapi::DWORD_ dwLanguageId,
+ boost::detail::winapi::LPSTR_ lpBuffer,
+ boost::detail::winapi::DWORD_ nSize,
+ va_list *Arguments);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+FormatMessageW(
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::LPCVOID_ lpSource,
+ boost::detail::winapi::DWORD_ dwMessageId,
+ boost::detail::winapi::DWORD_ dwLanguageId,
+ boost::detail::winapi::LPWSTR_ lpBuffer,
+ boost::detail::winapi::DWORD_ nSize,
+ va_list *Arguments);
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
#if defined( BOOST_USE_WINDOWS_H )
- using ::FormatMessageA;
- using ::FormatMessageW;
-
- const int FORMAT_MESSAGE_ALLOCATE_BUFFER_= FORMAT_MESSAGE_ALLOCATE_BUFFER;
- const int FORMAT_MESSAGE_IGNORE_INSERTS_= FORMAT_MESSAGE_IGNORE_INSERTS;
- const int FORMAT_MESSAGE_FROM_STRING_= FORMAT_MESSAGE_FROM_STRING;
- const int FORMAT_MESSAGE_FROM_HMODULE_= FORMAT_MESSAGE_FROM_HMODULE;
- const int FORMAT_MESSAGE_FROM_SYSTEM_= FORMAT_MESSAGE_FROM_SYSTEM;
- const int FORMAT_MESSAGE_ARGUMENT_ARRAY_= FORMAT_MESSAGE_ARGUMENT_ARRAY;
- const int FORMAT_MESSAGE_MAX_WIDTH_MASK_= FORMAT_MESSAGE_MAX_WIDTH_MASK;
-
- const char LANG_NEUTRAL_= LANG_NEUTRAL;
- const char LANG_INVARIANT_= LANG_INVARIANT;
-
- const char SUBLANG_DEFAULT_= SUBLANG_DEFAULT; // user default
- inline WORD_ MAKELANGID_(WORD_ p, WORD_ s) {
- return MAKELANGID(p,s);
- }
+
+const DWORD_ FORMAT_MESSAGE_ALLOCATE_BUFFER_= FORMAT_MESSAGE_ALLOCATE_BUFFER;
+const DWORD_ FORMAT_MESSAGE_IGNORE_INSERTS_= FORMAT_MESSAGE_IGNORE_INSERTS;
+const DWORD_ FORMAT_MESSAGE_FROM_STRING_= FORMAT_MESSAGE_FROM_STRING;
+const DWORD_ FORMAT_MESSAGE_FROM_HMODULE_= FORMAT_MESSAGE_FROM_HMODULE;
+const DWORD_ FORMAT_MESSAGE_FROM_SYSTEM_= FORMAT_MESSAGE_FROM_SYSTEM;
+const DWORD_ FORMAT_MESSAGE_ARGUMENT_ARRAY_= FORMAT_MESSAGE_ARGUMENT_ARRAY;
+const DWORD_ FORMAT_MESSAGE_MAX_WIDTH_MASK_= FORMAT_MESSAGE_MAX_WIDTH_MASK;
+
+const WORD_ LANG_NEUTRAL_= LANG_NEUTRAL;
+const WORD_ LANG_INVARIANT_= LANG_INVARIANT;
+
+const WORD_ SUBLANG_DEFAULT_= SUBLANG_DEFAULT; // user default
+
+BOOST_FORCEINLINE WORD_ MAKELANGID_(WORD_ p, WORD_ s)
+{
+ return MAKELANGID(p,s);
+}
+
#else
-extern "C" {
- // using ::FormatMessageA;
- __declspec(dllimport)
- DWORD_
- WINAPI
- FormatMessageA(
- DWORD_ dwFlags,
- LPCVOID_ lpSource,
- DWORD_ dwMessageId,
- DWORD_ dwLanguageId,
- LPSTR_ lpBuffer,
- DWORD_ nSize,
- va_list *Arguments
- );
-
- // using ::FormatMessageW;
- __declspec(dllimport)
- DWORD_
- WINAPI
- FormatMessageW(
- DWORD_ dwFlags,
- LPCVOID_ lpSource,
- DWORD_ dwMessageId,
- DWORD_ dwLanguageId,
- LPWSTR_ lpBuffer,
- DWORD_ nSize,
- va_list *Arguments
- );
-
- const int FORMAT_MESSAGE_ALLOCATE_BUFFER_= 0x00000100;
- const int FORMAT_MESSAGE_IGNORE_INSERTS_= 0x00000200;
- const int FORMAT_MESSAGE_FROM_STRING_= 0x00000400;
- const int FORMAT_MESSAGE_FROM_HMODULE_= 0x00000800;
- const int FORMAT_MESSAGE_FROM_SYSTEM_= 0x00001000;
- const int FORMAT_MESSAGE_ARGUMENT_ARRAY_= 0x00002000;
- const int FORMAT_MESSAGE_MAX_WIDTH_MASK_= 0x000000FF;
-
- const char LANG_NEUTRAL_= 0x00;
- const char LANG_INVARIANT_= 0x7f;
-
- const char SUBLANG_DEFAULT_= 0x01; // user default
- inline WORD_ MAKELANGID_(WORD_ p, WORD_ s) {
- return ((((WORD_ )(s)) << 10) | (WORD_ )(p));
- }
+const DWORD_ FORMAT_MESSAGE_ALLOCATE_BUFFER_= 0x00000100;
+const DWORD_ FORMAT_MESSAGE_IGNORE_INSERTS_= 0x00000200;
+const DWORD_ FORMAT_MESSAGE_FROM_STRING_= 0x00000400;
+const DWORD_ FORMAT_MESSAGE_FROM_HMODULE_= 0x00000800;
+const DWORD_ FORMAT_MESSAGE_FROM_SYSTEM_= 0x00001000;
+const DWORD_ FORMAT_MESSAGE_ARGUMENT_ARRAY_= 0x00002000;
+const DWORD_ FORMAT_MESSAGE_MAX_WIDTH_MASK_= 0x000000FF;
+
+const WORD_ LANG_NEUTRAL_= 0x00;
+const WORD_ LANG_INVARIANT_= 0x7f;
+
+const WORD_ SUBLANG_DEFAULT_= 0x01; // user default
+
+BOOST_FORCEINLINE WORD_ MAKELANGID_(WORD_ p, WORD_ s)
+{
+ return ((((WORD_)(s)) << 10) | (WORD_)(p));
+}
+
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::FormatMessageA;
+#endif
+using ::FormatMessageW;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE DWORD_ format_message(
+ DWORD_ dwFlags,
+ LPCVOID_ lpSource,
+ DWORD_ dwMessageId,
+ DWORD_ dwLanguageId,
+ LPSTR_ lpBuffer,
+ DWORD_ nSize,
+ va_list *Arguments)
+{
+ return ::FormatMessageA(dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments);
}
#endif
+
+BOOST_FORCEINLINE DWORD_ format_message(
+ DWORD_ dwFlags,
+ LPCVOID_ lpSource,
+ DWORD_ dwMessageId,
+ DWORD_ dwLanguageId,
+ LPWSTR_ lpBuffer,
+ DWORD_ nSize,
+ va_list *Arguments)
+{
+ return ::FormatMessageW(dwFlags, lpSource, dwMessageId, dwLanguageId, lpBuffer, nSize, Arguments);
+}
+
}
}
}
+
#endif // BOOST_DETAIL_WINAPI_ERROR_HANDLING_HPP
diff --git a/boost/detail/winapi/event.hpp b/boost/detail/winapi/event.hpp
new file mode 100644
index 0000000000..ec2b096103
--- /dev/null
+++ b/boost/detail/winapi/event.hpp
@@ -0,0 +1,183 @@
+// event.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_EVENT_HPP
+#define BOOST_DETAIL_WINAPI_EVENT_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/predef/platform.h>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+#if !defined( BOOST_PLAT_WINDOWS_RUNTIME_AVALIABLE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateEventA(
+ ::_SECURITY_ATTRIBUTES* lpEventAttributes,
+ boost::detail::winapi::BOOL_ bManualReset,
+ boost::detail::winapi::BOOL_ bInitialState,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateEventExA(
+ ::_SECURITY_ATTRIBUTES *lpEventAttributes,
+ boost::detail::winapi::LPCSTR_ lpName,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwDesiredAccess);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenEventA(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateEventW(
+ ::_SECURITY_ATTRIBUTES* lpEventAttributes,
+ boost::detail::winapi::BOOL_ bManualReset,
+ boost::detail::winapi::BOOL_ bInitialState,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateEventExW(
+ ::_SECURITY_ATTRIBUTES *lpEventAttributes,
+ boost::detail::winapi::LPCWSTR_ lpName,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwDesiredAccess);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenEventW(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+// Windows CE define SetEvent/ResetEvent as inline functions in kfuncs.h
+#if !defined( UNDER_CE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SetEvent(boost::detail::winapi::HANDLE_ hEvent);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ResetEvent(boost::detail::winapi::HANDLE_ hEvent);
+#endif
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::OpenEventA;
+#endif
+using ::OpenEventW;
+using ::SetEvent;
+using ::ResetEvent;
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ EVENT_ALL_ACCESS_ = EVENT_ALL_ACCESS;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ CREATE_EVENT_INITIAL_SET_ = CREATE_EVENT_INITIAL_SET;
+const DWORD_ CREATE_EVENT_MANUAL_RESET_ = CREATE_EVENT_MANUAL_RESET;
+#endif
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ EVENT_ALL_ACCESS_ = 0x1F0003;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ CREATE_EVENT_INITIAL_SET_ = 0x00000002;
+const DWORD_ CREATE_EVENT_MANUAL_RESET_ = 0x00000001;
+#endif
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ event_all_access = EVENT_ALL_ACCESS_;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ create_event_initial_set = CREATE_EVENT_INITIAL_SET_;
+const DWORD_ create_event_manual_reset = CREATE_EVENT_MANUAL_RESET_;
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ CreateEventA(SECURITY_ATTRIBUTES_* lpEventAttributes, BOOL_ bManualReset, BOOL_ bInitialState, LPCSTR_ lpName)
+{
+#if BOOST_PLAT_WINDOWS_RUNTIME && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+ const DWORD_ flags = (bManualReset ? create_event_manual_reset : 0u) | (bInitialState ? create_event_initial_set : 0u);
+ return ::CreateEventExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpEventAttributes), lpName, flags, event_all_access);
+#else
+ return ::CreateEventA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpEventAttributes), bManualReset, bInitialState, lpName);
+#endif
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE HANDLE_ CreateEventExA(SECURITY_ATTRIBUTES_* lpEventAttributes, LPCSTR_ lpName, DWORD_ dwFlags, DWORD_ dwDesiredAccess)
+{
+ return ::CreateEventExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpEventAttributes), lpName, dwFlags, dwDesiredAccess);
+}
+#endif
+#endif
+
+BOOST_FORCEINLINE HANDLE_ CreateEventW(SECURITY_ATTRIBUTES_* lpEventAttributes, BOOL_ bManualReset, BOOL_ bInitialState, LPCWSTR_ lpName)
+{
+#if BOOST_PLAT_WINDOWS_RUNTIME && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+ const DWORD_ flags = (bManualReset ? create_event_manual_reset : 0u) | (bInitialState ? create_event_initial_set : 0u);
+ return ::CreateEventExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpEventAttributes), lpName, flags, event_all_access);
+#else
+ return ::CreateEventW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpEventAttributes), bManualReset, bInitialState, lpName);
+#endif
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE HANDLE_ CreateEventExW(SECURITY_ATTRIBUTES_* lpEventAttributes, LPCWSTR_ lpName, DWORD_ dwFlags, DWORD_ dwDesiredAccess)
+{
+ return ::CreateEventExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpEventAttributes), lpName, dwFlags, dwDesiredAccess);
+}
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ create_event(SECURITY_ATTRIBUTES_* lpEventAttributes, BOOL_ bManualReset, BOOL_ bInitialState, LPCSTR_ lpName)
+{
+ return winapi::CreateEventA(lpEventAttributes, bManualReset, bInitialState, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_event(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
+{
+ return ::OpenEventA(dwDesiredAccess, bInheritHandle, lpName);
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_event(SECURITY_ATTRIBUTES_* lpEventAttributes, BOOL_ bManualReset, BOOL_ bInitialState, LPCWSTR_ lpName)
+{
+ return winapi::CreateEventW(lpEventAttributes, bManualReset, bInitialState, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_event(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
+{
+ return ::OpenEventW(dwDesiredAccess, bInheritHandle, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_event(SECURITY_ATTRIBUTES_* lpEventAttributes, BOOL_ bManualReset, BOOL_ bInitialState)
+{
+ return winapi::CreateEventW(lpEventAttributes, bManualReset, bInitialState, 0);
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_EVENT_HPP
diff --git a/boost/detail/winapi/file_management.hpp b/boost/detail/winapi/file_management.hpp
index c1d5978ba7..c923d8499e 100644
--- a/boost/detail/winapi/file_management.hpp
+++ b/boost/detail/winapi/file_management.hpp
@@ -1,6 +1,7 @@
-// thread.hpp --------------------------------------------------------------//
+// file_management.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -10,121 +11,381 @@
#define BOOST_DETAIL_WINAPI_FILE_MANAGEMENT_HPP
#include <boost/detail/winapi/basic_types.hpp>
-#include <boost/detail/winapi/security.hpp>
+#include <boost/detail/winapi/time.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
-namespace boost
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+struct _OVERLAPPED;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateFileA(
+ boost::detail::winapi::LPCSTR_ lpFileName,
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::DWORD_ dwShareMode,
+ ::_SECURITY_ATTRIBUTES* lpSecurityAttributes,
+ boost::detail::winapi::DWORD_ dwCreationDisposition,
+ boost::detail::winapi::DWORD_ dwFlagsAndAttributes,
+ boost::detail::winapi::HANDLE_ hTemplateFile);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+DeleteFileA(boost::detail::winapi::LPCSTR_ lpFileName);
+
+struct _WIN32_FIND_DATAA;
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+FindFirstFileA(boost::detail::winapi::LPCSTR_ lpFileName, ::_WIN32_FIND_DATAA* lpFindFileData);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FindNextFileA(boost::detail::winapi::HANDLE_ hFindFile, ::_WIN32_FIND_DATAA* lpFindFileData);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+MoveFileExA(
+ boost::detail::winapi::LPCSTR_ lpExistingFileName,
+ boost::detail::winapi::LPCSTR_ lpNewFileName,
+ boost::detail::winapi::DWORD_ dwFlags);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateFileW(
+ boost::detail::winapi::LPCWSTR_ lpFileName,
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::DWORD_ dwShareMode,
+ ::_SECURITY_ATTRIBUTES* lpSecurityAttributes,
+ boost::detail::winapi::DWORD_ dwCreationDisposition,
+ boost::detail::winapi::DWORD_ dwFlagsAndAttributes,
+ boost::detail::winapi::HANDLE_ hTemplateFile);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+DeleteFileW(boost::detail::winapi::LPCWSTR_ lpFileName);
+
+struct _WIN32_FIND_DATAW;
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+FindFirstFileW(boost::detail::winapi::LPCWSTR_ lpFileName, ::_WIN32_FIND_DATAW* lpFindFileData);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FindNextFileW(boost::detail::winapi::HANDLE_ hFindFile, ::_WIN32_FIND_DATAW* lpFindFileData);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+MoveFileExW(
+ boost::detail::winapi::LPCWSTR_ lpExistingFileName,
+ boost::detail::winapi::LPCWSTR_ lpNewFileName,
+ boost::detail::winapi::DWORD_ dwFlags);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FindClose(boost::detail::winapi::HANDLE_ hFindFile);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+GetFileSizeEx(boost::detail::winapi::HANDLE_ hFile, ::_LARGE_INTEGER* lpFileSize);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SetFileValidData(boost::detail::winapi::HANDLE_ hFile, boost::detail::winapi::LONGLONG_ ValidDataLength);
+
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SetEndOfFile(boost::detail::winapi::HANDLE_ hFile);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+LockFile(
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::DWORD_ dwFileOffsetLow,
+ boost::detail::winapi::DWORD_ dwFileOffsetHigh,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToLockLow,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToLockHigh);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+UnlockFile(
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::DWORD_ dwFileOffsetLow,
+ boost::detail::winapi::DWORD_ dwFileOffsetHigh,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToUnlockLow,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToUnlockHigh);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+LockFileEx(
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwReserved,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToLockLow,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToLockHigh,
+ ::_OVERLAPPED* lpOverlapped);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+UnlockFileEx(
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::DWORD_ dwReserved,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToUnlockLow,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToUnlockHigh,
+ ::_OVERLAPPED* lpOverlapped);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+WriteFile(
+ boost::detail::winapi::HANDLE_ hFile,
+ boost::detail::winapi::LPCVOID_ lpBuffer,
+ boost::detail::winapi::DWORD_ nNumberOfBytesToWrite,
+ boost::detail::winapi::LPDWORD_ lpNumberOfBytesWritten,
+ ::_OVERLAPPED* lpOverlapped);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::DeleteFileA;
+using ::MoveFileExA;
+#endif
+
+using ::DeleteFileW;
+using ::MoveFileExW;
+
+using ::FindClose;
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
+
+using ::SetFileValidData;
+
+#endif
+
+using ::SetEndOfFile;
+using ::LockFile;
+using ::UnlockFile;
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _OVERLAPPED {
+ ULONG_PTR_ Internal;
+ ULONG_PTR_ InternalHigh;
+ union {
+ struct {
+ DWORD_ Offset;
+ DWORD_ OffsetHigh;
+ };
+ PVOID_ Pointer;
+ };
+ HANDLE_ hEvent;
+} OVERLAPPED_, *LPOVERLAPPED_;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ CreateFileA(
+ LPCSTR_ lpFileName,
+ DWORD_ dwDesiredAccess,
+ DWORD_ dwShareMode,
+ SECURITY_ATTRIBUTES_* lpSecurityAttributes,
+ DWORD_ dwCreationDisposition,
+ DWORD_ dwFlagsAndAttributes,
+ HANDLE_ hTemplateFile)
{
-namespace detail
+ return ::CreateFileA(
+ lpFileName,
+ dwDesiredAccess,
+ dwShareMode,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
+ dwCreationDisposition,
+ dwFlagsAndAttributes,
+ hTemplateFile);
+}
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _WIN32_FIND_DATAA {
+ DWORD_ dwFileAttributes;
+ FILETIME_ ftCreationTime;
+ FILETIME_ ftLastAccessTime;
+ FILETIME_ ftLastWriteTime;
+ DWORD_ nFileSizeHigh;
+ DWORD_ nFileSizeLow;
+ DWORD_ dwReserved0;
+ DWORD_ dwReserved1;
+ CHAR_ cFileName[ 260 ]; // MAX_PATH
+ CHAR_ cAlternateFileName[ 14 ];
+#ifdef _MAC
+ DWORD_ dwFileType;
+ DWORD_ dwCreatorType;
+ WORD_ wFinderFlags;
+#endif
+} WIN32_FIND_DATAA_, *PWIN32_FIND_DATAA_, *LPWIN32_FIND_DATAA_;
+
+BOOST_FORCEINLINE HANDLE_ FindFirstFileA(LPCSTR_ lpFileName, WIN32_FIND_DATAA_* lpFindFileData)
+{
+ return ::FindFirstFileA(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ FindNextFileA(HANDLE_ hFindFile, WIN32_FIND_DATAA_* lpFindFileData)
{
-namespace winapi
+ return ::FindNextFileA(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ CreateFileW(
+ LPCWSTR_ lpFileName,
+ DWORD_ dwDesiredAccess,
+ DWORD_ dwShareMode,
+ SECURITY_ATTRIBUTES_* lpSecurityAttributes,
+ DWORD_ dwCreationDisposition,
+ DWORD_ dwFlagsAndAttributes,
+ HANDLE_ hTemplateFile)
{
-#if defined( BOOST_USE_WINDOWS_H )
- using ::CreateFileA;
- using ::DeleteFileA;
- using ::FindFirstFileA;
- using ::FindNextFileA;
- using ::FindClose;
- using ::GetFileSizeEx;
- using ::MoveFileExA;
- using ::SetFileValidData;
-#else
-extern "C" {
- typedef struct _OVERLAPPED {
- ULONG_PTR Internal;
- ULONG_PTR InternalHigh;
- union {
- struct {
- DWORD Offset;
- DWORD OffsetHigh;
- } ;
- PVOID Pointer;
- } ;
- HANDLE hEvent;
- } OVERLAPPED, *LPOVERLAPPED;
-
-
- __declspec(dllimport) void * __stdcall
- CreateFileA (const char *, unsigned long, unsigned long, struct SECURITY_ATTRIBUTES_*, unsigned long, unsigned long, void *);
- __declspec(dllimport) int __stdcall
- DeleteFileA (const char *);
- __declspec(dllimport) void *__stdcall
- FindFirstFileA(const char *lpFileName, win32_find_data_t *lpFindFileData);
- __declspec(dllimport) int __stdcall
- FindNextFileA(void *hFindFile, win32_find_data_t *lpFindFileData);
- __declspec(dllimport) int __stdcall
- FindClose(void *hFindFile);
- __declspec(dllimport) BOOL __stdcall
- GetFileSizeEx(
- HANDLE_ hFile,
- PLARGE_INTEGER_ lpFileSize
- );
- __declspec(dllimport) int __stdcall
- MoveFileExA (const char *, const char *, unsigned long);
- __declspec(dllimport) BOOL_ __stdcall
- SetFileValidData(
- HANDLE_ hFile,
- LONGLONG_ ValidDataLength
- );
- __declspec(dllimport) BOOL_ __stdcall
- SetEndOfFile(
- HANDLE_ hFile
- );
- __declspec(dllimport) BOOL_ __stdcall
- SetFilePointerEx(
- HANDLE_ hFile,
- LARGE_INTEGER_ liDistanceToMove,
- PLARGE_INTEGER_ lpNewFilePointer,
- DWORD_ dwMoveMethod
- );
- __declspec(dllimport) BOOL_ __stdcall
- LockFile(
- HANDLE_ hFile,
- DWORD_ dwFileOffsetLow,
- DWORD_ dwFileOffsetHigh,
- DWORD_ nNumberOfBytesToLockLow,
- DWORD_ nNumberOfBytesToLockHigh
- );
- __declspec(dllimport) BOOL_ __stdcall
- UnlockFile(
- HANDLE_ hFile,
- DWORD_ dwFileOffsetLow,
- DWORD_ dwFileOffsetHigh,
- DWORD_ nNumberOfBytesToUnlockLow,
- DWORD_ nNumberOfBytesToUnlockHigh
- );
- __declspec(dllimport) BOOL_ __stdcall
- LockFileEx(
- HANDLE_ hFile,
- DWORD_ dwFlags,
- DWORD_ dwReserved,
- DWORD_ nNumberOfBytesToLockLow,
- DWORD_ nNumberOfBytesToLockHigh,
- LPOVERLAPPED_ lpOverlapped
- );
- __declspec(dllimport) BOOL_ __stdcall
- UnlockFileEx(
- HANDLE_ hFile,
- DWORD_ dwReserved,
- DWORD_ nNumberOfBytesToUnlockLow,
- DWORD_ nNumberOfBytesToUnlockHigh,
- LPOVERLAPPED_ lpOverlapped
- );
- __declspec(dllimport) BOOL_ __stdcall
- WriteFile(
- HANDLE_ hFile,
- LPCVOID_ lpBuffer,
- DWORD_ nNumberOfBytesToWrite,
- LPDWORD_ lpNumberOfBytesWritten,
- LPOVERLAPPED_ lpOverlapped
- );
+ return ::CreateFileW(
+ lpFileName,
+ dwDesiredAccess,
+ dwShareMode,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
+ dwCreationDisposition,
+ dwFlagsAndAttributes,
+ hTemplateFile);
}
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _WIN32_FIND_DATAW {
+ DWORD_ dwFileAttributes;
+ FILETIME_ ftCreationTime;
+ FILETIME_ ftLastAccessTime;
+ FILETIME_ ftLastWriteTime;
+ DWORD_ nFileSizeHigh;
+ DWORD_ nFileSizeLow;
+ DWORD_ dwReserved0;
+ DWORD_ dwReserved1;
+ WCHAR_ cFileName[ 260 ]; // MAX_PATH
+ WCHAR_ cAlternateFileName[ 14 ];
+#ifdef _MAC
+ DWORD_ dwFileType;
+ DWORD_ dwCreatorType;
+ WORD_ wFinderFlags;
#endif
+} WIN32_FIND_DATAW_, *PWIN32_FIND_DATAW_, *LPWIN32_FIND_DATAW_;
+
+BOOST_FORCEINLINE HANDLE_ FindFirstFileW(LPCWSTR_ lpFileName, WIN32_FIND_DATAW_* lpFindFileData)
+{
+ return ::FindFirstFileW(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ FindNextFileW(HANDLE_ hFindFile, WIN32_FIND_DATAW_* lpFindFileData)
+{
+ return ::FindNextFileW(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ GetFileSizeEx(HANDLE_ hFile, LARGE_INTEGER_* lpFileSize)
+{
+ return ::GetFileSizeEx(hFile, reinterpret_cast< ::_LARGE_INTEGER* >(lpFileSize));
+}
+
+BOOST_FORCEINLINE BOOL_ LockFileEx(
+ HANDLE_ hFile,
+ DWORD_ dwFlags,
+ DWORD_ dwReserved,
+ DWORD_ nNumberOfBytesToLockLow,
+ DWORD_ nNumberOfBytesToLockHigh,
+ OVERLAPPED_* lpOverlapped)
+{
+ return ::LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
+}
+
+BOOST_FORCEINLINE BOOL_ UnlockFileEx(
+ HANDLE_ hFile,
+ DWORD_ dwReserved,
+ DWORD_ nNumberOfBytesToUnlockLow,
+ DWORD_ nNumberOfBytesToUnlockHigh,
+ OVERLAPPED_* lpOverlapped)
+{
+ return ::UnlockFileEx(hFile, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
+}
+
+BOOST_FORCEINLINE BOOL_ WriteFile(
+ HANDLE_ hFile,
+ LPCVOID_ lpBuffer,
+ DWORD_ nNumberOfBytesToWrite,
+ LPDWORD_ lpNumberOfBytesWritten,
+ OVERLAPPED_* lpOverlapped)
+{
+ return ::WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, reinterpret_cast< ::_OVERLAPPED* >(lpOverlapped));
+};
+
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ create_file(
+ LPCSTR_ lpFileName,
+ DWORD_ dwDesiredAccess,
+ DWORD_ dwShareMode,
+ SECURITY_ATTRIBUTES_* lpSecurityAttributes,
+ DWORD_ dwCreationDisposition,
+ DWORD_ dwFlagsAndAttributes,
+ HANDLE_ hTemplateFile)
+{
+ return ::CreateFileA(
+ lpFileName,
+ dwDesiredAccess,
+ dwShareMode,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
+ dwCreationDisposition,
+ dwFlagsAndAttributes,
+ hTemplateFile);
+}
+
+BOOST_FORCEINLINE BOOL_ delete_file(LPCSTR_ lpFileName)
+{
+ return ::DeleteFileA(lpFileName);
+}
+
+BOOST_FORCEINLINE HANDLE_ find_first_file(LPCSTR_ lpFileName, WIN32_FIND_DATAA_* lpFindFileData)
+{
+ return ::FindFirstFileA(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ find_next_file(HANDLE_ hFindFile, WIN32_FIND_DATAA_* lpFindFileData)
+{
+ return ::FindNextFileA(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAA* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ move_file(LPCSTR_ lpExistingFileName, LPCSTR_ lpNewFileName, DWORD_ dwFlags)
+{
+ return ::MoveFileExA(lpExistingFileName, lpNewFileName, dwFlags);
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_file(
+ LPCWSTR_ lpFileName,
+ DWORD_ dwDesiredAccess,
+ DWORD_ dwShareMode,
+ SECURITY_ATTRIBUTES_* lpSecurityAttributes,
+ DWORD_ dwCreationDisposition,
+ DWORD_ dwFlagsAndAttributes,
+ HANDLE_ hTemplateFile)
+{
+ return ::CreateFileW(
+ lpFileName,
+ dwDesiredAccess,
+ dwShareMode,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSecurityAttributes),
+ dwCreationDisposition,
+ dwFlagsAndAttributes,
+ hTemplateFile);
+}
+
+BOOST_FORCEINLINE BOOL_ delete_file(LPCWSTR_ lpFileName)
+{
+ return ::DeleteFileW(lpFileName);
+}
+
+BOOST_FORCEINLINE HANDLE_ find_first_file(LPCWSTR_ lpFileName, WIN32_FIND_DATAW_* lpFindFileData)
+{
+ return ::FindFirstFileW(lpFileName, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ find_next_file(HANDLE_ hFindFile, WIN32_FIND_DATAW_* lpFindFileData)
+{
+ return ::FindNextFileW(hFindFile, reinterpret_cast< ::_WIN32_FIND_DATAW* >(lpFindFileData));
+}
+
+BOOST_FORCEINLINE BOOL_ move_file(LPCWSTR_ lpExistingFileName, LPCWSTR_ lpNewFileName, DWORD_ dwFlags)
+{
+ return ::MoveFileExW(lpExistingFileName, lpNewFileName, dwFlags);
+}
+
}
}
}
-#endif // BOOST_DETAIL_WINAPI_THREAD_HPP
+#endif // BOOST_DETAIL_WINAPI_FILE_MANAGEMENT_HPP
diff --git a/boost/detail/winapi/file_mapping.hpp b/boost/detail/winapi/file_mapping.hpp
new file mode 100644
index 0000000000..f3cf794b41
--- /dev/null
+++ b/boost/detail/winapi/file_mapping.hpp
@@ -0,0 +1,170 @@
+// file_mapping.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_FILE_MAPPING_HPP
+#define BOOST_DETAIL_WINAPI_FILE_MAPPING_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateFileMappingA(
+ boost::detail::winapi::HANDLE_ hFile,
+ ::_SECURITY_ATTRIBUTES* lpFileMappingAttributes,
+ boost::detail::winapi::DWORD_ flProtect,
+ boost::detail::winapi::DWORD_ dwMaximumSizeHigh,
+ boost::detail::winapi::DWORD_ dwMaximumSizeLow,
+ boost::detail::winapi::LPCSTR_ lpName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenFileMappingA(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateFileMappingW(
+ boost::detail::winapi::HANDLE_ hFile,
+ ::_SECURITY_ATTRIBUTES* lpFileMappingAttributes,
+ boost::detail::winapi::DWORD_ flProtect,
+ boost::detail::winapi::DWORD_ dwMaximumSizeHigh,
+ boost::detail::winapi::DWORD_ dwMaximumSizeLow,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenFileMappingW(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::LPVOID_ WINAPI
+MapViewOfFileEx(
+ boost::detail::winapi::HANDLE_ hFileMappingObject,
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::DWORD_ dwFileOffsetHigh,
+ boost::detail::winapi::DWORD_ dwFileOffsetLow,
+ boost::detail::winapi::SIZE_T_ dwNumberOfBytesToMap,
+ boost::detail::winapi::LPVOID_ lpBaseAddress);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FlushViewOfFile(
+ boost::detail::winapi::LPCVOID_ lpBaseAddress,
+ boost::detail::winapi::SIZE_T_ dwNumberOfBytesToFlush);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+UnmapViewOfFile(boost::detail::winapi::LPCVOID_ lpBaseAddress);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::OpenFileMappingA;
+#endif
+using ::OpenFileMappingW;
+using ::MapViewOfFileEx;
+using ::FlushViewOfFile;
+using ::UnmapViewOfFile;
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ CreateFileMappingA(
+ HANDLE_ hFile,
+ SECURITY_ATTRIBUTES_* lpFileMappingAttributes,
+ DWORD_ flProtect,
+ DWORD_ dwMaximumSizeHigh,
+ DWORD_ dwMaximumSizeLow,
+ LPCSTR_ lpName)
+{
+ return ::CreateFileMappingA(
+ hFile,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
+ flProtect,
+ dwMaximumSizeHigh,
+ dwMaximumSizeLow,
+ lpName);
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ CreateFileMappingW(
+ HANDLE_ hFile,
+ ::_SECURITY_ATTRIBUTES* lpFileMappingAttributes,
+ DWORD_ flProtect,
+ DWORD_ dwMaximumSizeHigh,
+ DWORD_ dwMaximumSizeLow,
+ LPCWSTR_ lpName)
+{
+ return ::CreateFileMappingW(
+ hFile,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
+ flProtect,
+ dwMaximumSizeHigh,
+ dwMaximumSizeLow,
+ lpName);
+}
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ create_file_mapping(
+ HANDLE_ hFile,
+ SECURITY_ATTRIBUTES_* lpFileMappingAttributes,
+ DWORD_ flProtect,
+ DWORD_ dwMaximumSizeHigh,
+ DWORD_ dwMaximumSizeLow,
+ LPCSTR_ lpName)
+{
+ return ::CreateFileMappingA(
+ hFile,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
+ flProtect,
+ dwMaximumSizeHigh,
+ dwMaximumSizeLow,
+ lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_file_mapping(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
+{
+ return ::OpenFileMappingA(dwDesiredAccess, bInheritHandle, lpName);
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_file_mapping(
+ HANDLE_ hFile,
+ ::_SECURITY_ATTRIBUTES* lpFileMappingAttributes,
+ DWORD_ flProtect,
+ DWORD_ dwMaximumSizeHigh,
+ DWORD_ dwMaximumSizeLow,
+ LPCWSTR_ lpName)
+{
+ return ::CreateFileMappingW(
+ hFile,
+ reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpFileMappingAttributes),
+ flProtect,
+ dwMaximumSizeHigh,
+ dwMaximumSizeLow,
+ lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_file_mapping(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
+{
+ return ::OpenFileMappingW(dwDesiredAccess, bInheritHandle, lpName);
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_FILE_MAPPING_HPP
diff --git a/boost/detail/winapi/handles.hpp b/boost/detail/winapi/handles.hpp
index 7108daa10b..54859f46d9 100644
--- a/boost/detail/winapi/handles.hpp
+++ b/boost/detail/winapi/handles.hpp
@@ -1,6 +1,7 @@
-// memory.hpp --------------------------------------------------------------//
+// handles.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -15,30 +16,44 @@
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
- using ::CloseHandle;
- using ::DuplicateHandle;
-
- const DWORD_ duplicate_close_source = DUPLICATE_CLOSE_SOURCE;
- const DWORD_ duplicate_same_access = DUPLICATE_SAME_ACCESS;
- const HANDLE_ invalid_handle_value = INVALID_HANDLE_VALUE;
-#else
+#if !defined( BOOST_USE_WINDOWS_H )
extern "C" {
- __declspec(dllimport) int __stdcall
- CloseHandle(void*);
- __declspec(dllimport) int __stdcall
- DuplicateHandle(void*,void*,void*,void**,unsigned long,int,unsigned long);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CloseHandle(boost::detail::winapi::HANDLE_ handle);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+DuplicateHandle(
+ boost::detail::winapi::HANDLE_ hSourceProcessHandle,
+ boost::detail::winapi::HANDLE_ hSourceHandle,
+ boost::detail::winapi::HANDLE_ hTargetProcessHandle,
+ boost::detail::winapi::HANDLE_* lpTargetHandle,
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::DWORD_ dwOptions);
}
- const DWORD_ duplicate_close_source = 1;
- const DWORD_ duplicate_same_access = 2;
- const HANDLE_ invalid_handle_value = (HANDLE_)(-1);
#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+using ::CloseHandle;
+using ::DuplicateHandle;
+
+#if defined( BOOST_USE_WINDOWS_H )
+const DWORD_ DUPLICATE_CLOSE_SOURCE_ = DUPLICATE_CLOSE_SOURCE;
+const DWORD_ DUPLICATE_SAME_ACCESS_ = DUPLICATE_SAME_ACCESS;
+const HANDLE_ INVALID_HANDLE_VALUE_ = INVALID_HANDLE_VALUE;
+#else
+const DWORD_ DUPLICATE_CLOSE_SOURCE_ = 1;
+const DWORD_ DUPLICATE_SAME_ACCESS_ = 2;
+const HANDLE_ INVALID_HANDLE_VALUE_ = (HANDLE_)(-1);
+#endif
+
+const DWORD_ duplicate_close_source = DUPLICATE_CLOSE_SOURCE_;
+const DWORD_ duplicate_same_access = DUPLICATE_SAME_ACCESS_;
+const HANDLE_ invalid_handle_value = INVALID_HANDLE_VALUE_;
+
}
}
}
diff --git a/boost/detail/winapi/heap_memory.hpp b/boost/detail/winapi/heap_memory.hpp
new file mode 100644
index 0000000000..ae863523e4
--- /dev/null
+++ b/boost/detail/winapi/heap_memory.hpp
@@ -0,0 +1,72 @@
+// heap_memory.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_HEAP_MEMORY_HPP
+#define BOOST_DETAIL_WINAPI_HEAP_MEMORY_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+#undef HeapAlloc
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+GetProcessHeap(BOOST_DETAIL_WINAPI_VOID);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+GetProcessHeaps(boost::detail::winapi::DWORD_ NumberOfHeaps, boost::detail::winapi::PHANDLE_ ProcessHeaps);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+HeapCreate(
+ boost::detail::winapi::DWORD_ flOptions,
+ boost::detail::winapi::SIZE_T_ dwInitialSize,
+ boost::detail::winapi::SIZE_T_ dwMaximumSize);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+HeapDestroy(boost::detail::winapi::HANDLE_ hHeap);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::LPVOID_ WINAPI
+HeapAlloc(
+ boost::detail::winapi::HANDLE_ hHeap,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::SIZE_T_ dwBytes);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::LPVOID_ WINAPI
+HeapReAlloc(
+ boost::detail::winapi::HANDLE_ hHeap,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::LPVOID_ lpMem,
+ boost::detail::winapi::SIZE_T_ dwBytes);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+HeapFree(
+ boost::detail::winapi::HANDLE_ hHeap,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::LPVOID_ lpMem);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+using ::GetProcessHeap;
+using ::GetProcessHeaps;
+using ::HeapCreate;
+using ::HeapDestroy;
+using ::HeapAlloc;
+using ::HeapReAlloc;
+using ::HeapFree;
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_HEAP_MEMORY_HPP
diff --git a/boost/detail/winapi/init_once.hpp b/boost/detail/winapi/init_once.hpp
new file mode 100644
index 0000000000..4c0597961e
--- /dev/null
+++ b/boost/detail/winapi/init_once.hpp
@@ -0,0 +1,123 @@
+// init_once.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_INIT_ONCE_HPP
+#define BOOST_DETAIL_WINAPI_INIT_ONCE_HPP
+
+#include <boost/detail/winapi/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if defined( BOOST_WINAPI_IS_MINGW_W64 )
+struct _RTL_RUN_ONCE;
+#else
+union _RTL_RUN_ONCE;
+#endif
+
+typedef boost::detail::winapi::BOOL_
+(WINAPI *PINIT_ONCE_FN) (
+ ::_RTL_RUN_ONCE* InitOnce,
+ boost::detail::winapi::PVOID_ Parameter,
+ boost::detail::winapi::PVOID_ *Context);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+InitOnceInitialize(::_RTL_RUN_ONCE* InitOnce);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitOnceExecuteOnce(
+ ::_RTL_RUN_ONCE* InitOnce,
+ ::PINIT_ONCE_FN InitFn,
+ boost::detail::winapi::PVOID_ Parameter,
+ boost::detail::winapi::LPVOID_ *Context);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitOnceBeginInitialize(
+ ::_RTL_RUN_ONCE* lpInitOnce,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::PBOOL_ fPending,
+ boost::detail::winapi::LPVOID_ *lpContext);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitOnceComplete(
+ ::_RTL_RUN_ONCE* lpInitOnce,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::LPVOID_ lpContext);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+typedef union BOOST_DETAIL_WINAPI_MAY_ALIAS _RTL_RUN_ONCE {
+ PVOID_ Ptr;
+} INIT_ONCE_, *PINIT_ONCE_, *LPINIT_ONCE_;
+
+extern "C" {
+typedef BOOL_ (WINAPI *PINIT_ONCE_FN_) (PINIT_ONCE_ lpInitOnce, PVOID_ Parameter, PVOID_ *Context);
+}
+
+BOOST_FORCEINLINE VOID_ InitOnceInitialize(PINIT_ONCE_ lpInitOnce)
+{
+ ::InitOnceInitialize(reinterpret_cast< ::_RTL_RUN_ONCE* >(lpInitOnce));
+}
+
+BOOST_FORCEINLINE BOOL_ InitOnceExecuteOnce(PINIT_ONCE_ lpInitOnce, PINIT_ONCE_FN_ InitFn, PVOID_ Parameter, LPVOID_ *Context)
+{
+ return ::InitOnceExecuteOnce(reinterpret_cast< ::_RTL_RUN_ONCE* >(lpInitOnce), reinterpret_cast< ::PINIT_ONCE_FN >(InitFn), Parameter, Context);
+}
+
+BOOST_FORCEINLINE BOOL_ InitOnceBeginInitialize(PINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, PBOOL_ fPending, LPVOID_ *lpContext)
+{
+ return ::InitOnceBeginInitialize(reinterpret_cast< ::_RTL_RUN_ONCE* >(lpInitOnce), dwFlags, fPending, lpContext);
+}
+
+BOOST_FORCEINLINE BOOL_ InitOnceComplete(PINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, LPVOID_ lpContext)
+{
+ return ::InitOnceComplete(reinterpret_cast< ::_RTL_RUN_ONCE* >(lpInitOnce), dwFlags, lpContext);
+}
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+#define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
+const DWORD_ INIT_ONCE_ASYNC_ = INIT_ONCE_ASYNC;
+const DWORD_ INIT_ONCE_CHECK_ONLY_ = INIT_ONCE_CHECK_ONLY;
+const DWORD_ INIT_ONCE_INIT_FAILED_ = INIT_ONCE_INIT_FAILED;
+const DWORD_ INIT_ONCE_CTX_RESERVED_BITS_ = INIT_ONCE_CTX_RESERVED_BITS;
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+#define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT {0}
+const DWORD_ INIT_ONCE_ASYNC_ = 0x00000002UL;
+const DWORD_ INIT_ONCE_CHECK_ONLY_ = 0x00000001UL;
+const DWORD_ INIT_ONCE_INIT_FAILED_ = 0x00000004UL;
+const DWORD_ INIT_ONCE_CTX_RESERVED_BITS_ = 2;
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ init_once_async = INIT_ONCE_ASYNC_;
+const DWORD_ init_once_check_only = INIT_ONCE_CHECK_ONLY_;
+const DWORD_ init_once_init_failed = INIT_ONCE_INIT_FAILED_;
+const DWORD_ init_once_ctx_reserved_bits = INIT_ONCE_CTX_RESERVED_BITS_;
+
+}
+}
+}
+
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+#endif // BOOST_DETAIL_WINAPI_INIT_ONCE_HPP
diff --git a/boost/detail/winapi/local_memory.hpp b/boost/detail/winapi/local_memory.hpp
new file mode 100644
index 0000000000..17bc08b1bf
--- /dev/null
+++ b/boost/detail/winapi/local_memory.hpp
@@ -0,0 +1,51 @@
+// local_memory.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_LOCAL_MEMORY_HPP
+#define BOOST_DETAIL_WINAPI_LOCAL_MEMORY_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+namespace boost { namespace detail { namespace winapi {
+typedef HANDLE_ HLOCAL_;
+}}}
+
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HLOCAL_ WINAPI
+LocalAlloc(
+ boost::detail::winapi::UINT_ uFlags,
+ boost::detail::winapi::SIZE_T_ uBytes);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HLOCAL_ WINAPI
+LocalReAlloc(
+ boost::detail::winapi::HLOCAL_ hMem,
+ boost::detail::winapi::SIZE_T_ uBytes,
+ boost::detail::winapi::UINT_ uFlags);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HLOCAL_ WINAPI LocalFree(boost::detail::winapi::HLOCAL_ hMem);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+#if defined( BOOST_USE_WINDOWS_H )
+typedef ::HLOCAL HLOCAL_;
+#endif
+using ::LocalAlloc;
+using ::LocalReAlloc;
+using ::LocalFree;
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_LOCAL_MEMORY_HPP
diff --git a/boost/detail/winapi/memory.hpp b/boost/detail/winapi/memory.hpp
index b5316e09e0..3168e21956 100644
--- a/boost/detail/winapi/memory.hpp
+++ b/boost/detail/winapi/memory.hpp
@@ -1,6 +1,7 @@
// memory.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -9,52 +10,11 @@
#ifndef BOOST_DETAIL_WINAPI_MEMORY_HPP
#define BOOST_DETAIL_WINAPI_MEMORY_HPP
-#include <boost/detail/winapi/basic_types.hpp>
-#include <boost/detail/winapi/security.hpp>
-#include <boost/detail/winapi/LocalFree.hpp>
+#include <boost/detail/winapi/heap_memory.hpp>
+#include <boost/detail/winapi/local_memory.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
- using ::CreateFileMappingA;
- using ::FlushViewOfFile;
- using ::GetProcessHeap;
- using ::HeapAlloc;
- using ::HeapFree;
- using ::MapViewOfFileEx;
- using ::OpenFileMappingA;
- using ::UnmapViewOfFile;
-#else
-#undef HeapAlloc
-extern "C" {
- __declspec(dllimport) void * __stdcall
- CreateFileMappingA (void *, SECURITY_ATTRIBUTES_*, unsigned long, unsigned long, unsigned long, const char *);
- __declspec(dllimport) int __stdcall
- FlushViewOfFile (void *, std::size_t);
- __declspec(dllimport) HANDLE_ __stdcall
- GetProcessHeap();
- __declspec(dllimport) void* __stdcall
- HeapAlloc(HANDLE_,DWORD_,SIZE_T_);
- __declspec(dllimport) BOOL_ __stdcall
- HeapFree(HANDLE_,DWORD_,LPVOID_);
- __declspec(dllimport) void * __stdcall
- MapViewOfFileEx (void *, unsigned long, unsigned long, unsigned long, std::size_t, void*);
- __declspec(dllimport) void * __stdcall
- OpenFileMappingA (unsigned long, int, const char *);
- __declspec(dllimport) int __stdcall
- UnmapViewOfFile(void *);
-}
-#endif
-}
-}
-}
-
#endif // BOOST_DETAIL_WINAPI_MEMORY_HPP
diff --git a/boost/detail/winapi/mutex.hpp b/boost/detail/winapi/mutex.hpp
new file mode 100644
index 0000000000..8f1975ca5c
--- /dev/null
+++ b/boost/detail/winapi/mutex.hpp
@@ -0,0 +1,181 @@
+// mutex.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_MUTEX_HPP
+#define BOOST_DETAIL_WINAPI_MUTEX_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/predef/platform.h>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+#if !defined( BOOST_PLAT_WINDOWS_RUNTIME_AVALIABLE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateMutexA(
+ ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
+ boost::detail::winapi::BOOL_ bInitialOwner,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateMutexExA(
+ ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
+ boost::detail::winapi::LPCSTR_ lpName,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwDesiredAccess);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenMutexA(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+#if !defined( BOOST_PLAT_WINDOWS_RUNTIME_AVALIABLE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateMutexW(
+ ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
+ boost::detail::winapi::BOOL_ bInitialOwner,
+ boost::detail::winapi::LPCWSTR_ lpName);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateMutexExW(
+ ::_SECURITY_ATTRIBUTES* lpMutexAttributes,
+ boost::detail::winapi::LPCWSTR_ lpName,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwDesiredAccess);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenMutexW(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ReleaseMutex(boost::detail::winapi::HANDLE_ hMutex);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::OpenMutexA;
+#endif
+using ::OpenMutexW;
+using ::ReleaseMutex;
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ MUTEX_ALL_ACCESS_ = MUTEX_ALL_ACCESS;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ CREATE_MUTEX_INITIAL_OWNER_ = CREATE_MUTEX_INITIAL_OWNER;
+#endif
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ MUTEX_ALL_ACCESS_ = 0x1F0001;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ CREATE_MUTEX_INITIAL_OWNER_ = 0x00000001;
+#endif
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ mutex_all_access = MUTEX_ALL_ACCESS_;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+const DWORD_ create_mutex_initial_owner = CREATE_MUTEX_INITIAL_OWNER_;
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ CreateMutexA(SECURITY_ATTRIBUTES_* lpMutexAttributes, BOOL_ bInitialOwner, LPCSTR_ lpName)
+{
+#if BOOST_PLAT_WINDOWS_RUNTIME && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+ const DWORD_ flags = bInitialOwner ? create_mutex_initial_owner : 0u;
+ return ::CreateMutexExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, flags, mutex_all_access);
+#else
+ return ::CreateMutexA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), bInitialOwner, lpName);
+#endif
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE HANDLE_ CreateMutexExA(
+ SECURITY_ATTRIBUTES_* lpMutexAttributes,
+ LPCSTR_ lpName,
+ DWORD_ dwFlags,
+ DWORD_ dwDesiredAccess)
+{
+ return ::CreateMutexExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, dwFlags, dwDesiredAccess);
+}
+#endif
+#endif
+
+BOOST_FORCEINLINE HANDLE_ CreateMutexW(SECURITY_ATTRIBUTES_* lpMutexAttributes, BOOL_ bInitialOwner, LPCWSTR_ lpName)
+{
+#if BOOST_PLAT_WINDOWS_RUNTIME && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+ const DWORD_ flags = bInitialOwner ? create_mutex_initial_owner : 0u;
+ return ::CreateMutexExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, flags, mutex_all_access);
+#else
+ return ::CreateMutexW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), bInitialOwner, lpName);
+#endif
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE HANDLE_ CreateMutexExW(
+ SECURITY_ATTRIBUTES_* lpMutexAttributes,
+ LPCWSTR_ lpName,
+ DWORD_ dwFlags,
+ DWORD_ dwDesiredAccess)
+{
+ return ::CreateMutexExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpMutexAttributes), lpName, dwFlags, dwDesiredAccess);
+}
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ create_mutex(SECURITY_ATTRIBUTES_* lpAttributes, BOOL_ bInitialOwner, LPCSTR_ lpName)
+{
+ return winapi::CreateMutexA(lpAttributes, bInitialOwner, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_mutex(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
+{
+ return ::OpenMutexA(dwDesiredAccess, bInheritHandle, lpName);
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_mutex(SECURITY_ATTRIBUTES_* lpAttributes, BOOL_ bInitialOwner, LPCWSTR_ lpName)
+{
+ return winapi::CreateMutexW(lpAttributes, bInitialOwner, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_mutex(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
+{
+ return ::OpenMutexW(dwDesiredAccess, bInheritHandle, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_mutex(SECURITY_ATTRIBUTES_* lpAttributes, BOOL_ bInitialOwner)
+{
+ return winapi::CreateMutexW(lpAttributes, bInitialOwner, 0);
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_MUTEX_HPP
diff --git a/boost/detail/winapi/process.hpp b/boost/detail/winapi/process.hpp
index de287b15fc..3c3de56e3e 100644
--- a/boost/detail/winapi/process.hpp
+++ b/boost/detail/winapi/process.hpp
@@ -16,21 +16,19 @@
#pragma once
#endif
-namespace boost {
-namespace detail {
-namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetCurrentProcessId;
-#else
-# ifndef UNDER_CE
+// Windows CE define GetCurrentProcessId as an inline function in kfuncs.h
+#if !defined( BOOST_USE_WINDOWS_H ) && !defined( UNDER_CE )
extern "C" {
- __declspec(dllimport) DWORD_ WINAPI GetCurrentProcessId(void);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI GetCurrentProcessId(BOOST_DETAIL_WINAPI_VOID);
}
-# else
- using ::GetCurrentProcessId;
-# endif
#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+using ::GetCurrentProcessId;
}
}
}
+
#endif // BOOST_DETAIL_WINAPI_PROCESS_HPP
diff --git a/boost/detail/winapi/security.hpp b/boost/detail/winapi/security.hpp
index 79925c6c67..4a6544519f 100644
--- a/boost/detail/winapi/security.hpp
+++ b/boost/detail/winapi/security.hpp
@@ -1,6 +1,7 @@
// security.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -15,49 +16,63 @@
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
-typedef ::SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES_;
-typedef ::PSECURITY_ATTRIBUTES PSECURITY_ATTRIBUTES_;
-typedef ::LPSECURITY_ATTRIBUTES LPSECURITY_ATTRIBUTES_;
-
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+struct _ACL;
+struct _SECURITY_DESCRIPTOR;
+#if defined( BOOST_WINAPI_IS_MINGW )
+typedef _SECURITY_DESCRIPTOR *PSECURITY_DESCRIPTOR;
#else
-extern "C" {
- struct SECURITY_DESCRIPTOR_;
- typedef SECURITY_DESCRIPTOR_* PSECURITY_DESCRIPTOR_;
- typedef struct _ACL {
- BYTE_ AclRevision;
- BYTE_ Sbz1;
- WORD_ AclSize;
- WORD_ AceCount;
- WORD_ Sbz2;
- } ACL_, *PACL_;
-
- typedef struct _SECURITY_ATTRIBUTES {
- DWORD_ nLength;
- LPVOID_ lpSecurityDescriptor;
- BOOL_ bInheritHandle;
- } SECURITY_ATTRIBUTES_, *PSECURITY_ATTRIBUTES_, *LPSECURITY_ATTRIBUTES_;
-
- __declspec(dllimport) BOOL_ __stdcall
- InitializeSecurityDescriptor(
- PSECURITY_DESCRIPTOR_ pSecurityDescriptor,
- DWORD_ dwRevision
- );
- __declspec(dllimport) BOOL_ __stdcall
- SetSecurityDescriptorDacl(
- PSECURITY_DESCRIPTOR_ pSecurityDescriptor,
- BOOL_ bDaclPresent,
- PACL_ pDacl,
- BOOL_ bDaclDefaulted
- );
+typedef boost::detail::winapi::PVOID_ PSECURITY_DESCRIPTOR;
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+InitializeSecurityDescriptor(
+ PSECURITY_DESCRIPTOR pSecurityDescriptor,
+ boost::detail::winapi::DWORD_ dwRevision);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SetSecurityDescriptorDacl(
+ PSECURITY_DESCRIPTOR pSecurityDescriptor,
+ boost::detail::winapi::BOOL_ bDaclPresent,
+ ::_ACL* pDacl,
+ boost::detail::winapi::BOOL_ bDaclDefaulted);
}
#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+typedef PVOID_ PSID_;
+typedef WORD_ SECURITY_DESCRIPTOR_CONTROL_, *PSECURITY_DESCRIPTOR_CONTROL_;
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _ACL {
+ BYTE_ AclRevision;
+ BYTE_ Sbz1;
+ WORD_ AclSize;
+ WORD_ AceCount;
+ WORD_ Sbz2;
+} ACL_, *PACL_;
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _SECURITY_DESCRIPTOR {
+ BYTE_ Revision;
+ BYTE_ Sbz1;
+ SECURITY_DESCRIPTOR_CONTROL_ Control;
+ PSID_ Owner;
+ PSID_ Group;
+ PACL_ Sacl;
+ PACL_ Dacl;
+} SECURITY_DESCRIPTOR_, *PISECURITY_DESCRIPTOR_;
+
+typedef ::PSECURITY_DESCRIPTOR PSECURITY_DESCRIPTOR_;
+
+using ::InitializeSecurityDescriptor;
+
+BOOST_FORCEINLINE BOOL_ SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR_ pSecurityDescriptor, BOOL_ bDaclPresent, PACL_ pDacl, BOOL_ bDaclDefaulted)
+{
+ return ::SetSecurityDescriptorDacl(pSecurityDescriptor, bDaclPresent, reinterpret_cast< ::_ACL* >(pDacl), bDaclDefaulted);
+}
+
}
}
}
diff --git a/boost/detail/winapi/semaphore.hpp b/boost/detail/winapi/semaphore.hpp
new file mode 100644
index 0000000000..ba71aae20b
--- /dev/null
+++ b/boost/detail/winapi/semaphore.hpp
@@ -0,0 +1,170 @@
+// semaphore.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_SEMAPHORE_HPP
+#define BOOST_DETAIL_WINAPI_SEMAPHORE_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/predef/platform.h>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+#if !defined( BOOST_PLAT_WINDOWS_RUNTIME_AVALIABLE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateSemaphoreA(
+ ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
+ boost::detail::winapi::LONG_ lInitialCount,
+ boost::detail::winapi::LONG_ lMaximumCount,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateSemaphoreExA(
+ ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
+ boost::detail::winapi::LONG_ lInitialCount,
+ boost::detail::winapi::LONG_ lMaximumCount,
+ boost::detail::winapi::LPCSTR_ lpName,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwDesiredAccess);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenSemaphoreA(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCSTR_ lpName);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateSemaphoreW(
+ ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
+ boost::detail::winapi::LONG_ lInitialCount,
+ boost::detail::winapi::LONG_ lMaximumCount,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateSemaphoreExW(
+ ::_SECURITY_ATTRIBUTES* lpSemaphoreAttributes,
+ boost::detail::winapi::LONG_ lInitialCount,
+ boost::detail::winapi::LONG_ lMaximumCount,
+ boost::detail::winapi::LPCWSTR_ lpName,
+ boost::detail::winapi::DWORD_ dwFlags,
+ boost::detail::winapi::DWORD_ dwDesiredAccess);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenSemaphoreW(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCWSTR_ lpName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+ReleaseSemaphore(
+ boost::detail::winapi::HANDLE_ hSemaphore,
+ boost::detail::winapi::LONG_ lReleaseCount,
+ boost::detail::winapi::LPLONG_ lpPreviousCount);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+#if !defined( BOOST_NO_ANSI_APIS )
+using ::OpenSemaphoreA;
+#endif
+using ::OpenSemaphoreW;
+using ::ReleaseSemaphore;
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ SEMAPHORE_ALL_ACCESS_ = SEMAPHORE_ALL_ACCESS;
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ SEMAPHORE_ALL_ACCESS_ = 0x1F0003;
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ semaphore_all_access = SEMAPHORE_ALL_ACCESS_;
+
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ CreateSemaphoreA(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCSTR_ lpName)
+{
+#if BOOST_PLAT_WINDOWS_RUNTIME && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+ return ::CreateSemaphoreExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName, 0, semaphore_all_access);
+#else
+ return ::CreateSemaphoreA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName);
+#endif
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE HANDLE_ CreateSemaphoreExA(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCSTR_ lpName, DWORD_ dwFlags, DWORD_ dwDesiredAccess)
+{
+ return ::CreateSemaphoreExA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName, dwFlags, dwDesiredAccess);
+}
+#endif
+#endif
+
+BOOST_FORCEINLINE HANDLE_ CreateSemaphoreW(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCWSTR_ lpName)
+{
+#if BOOST_PLAT_WINDOWS_RUNTIME && BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+ return ::CreateSemaphoreExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName, 0, semaphore_all_access);
+#else
+ return ::CreateSemaphoreW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName);
+#endif
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_FORCEINLINE HANDLE_ CreateSemaphoreExW(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCWSTR_ lpName, DWORD_ dwFlags, DWORD_ dwDesiredAccess)
+{
+ return ::CreateSemaphoreExW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpSemaphoreAttributes), lInitialCount, lMaximumCount, lpName, dwFlags, dwDesiredAccess);
+}
+#endif
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ create_semaphore(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCSTR_ lpName)
+{
+ return winapi::CreateSemaphoreA(lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_semaphore(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName)
+{
+ return ::OpenSemaphoreA(dwDesiredAccess, bInheritHandle, lpName);
+}
+#endif
+
+BOOST_FORCEINLINE HANDLE_ create_semaphore(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount, LPCWSTR_ lpName)
+{
+ return winapi::CreateSemaphoreW(lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ open_semaphore(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName)
+{
+ return ::OpenSemaphoreW(dwDesiredAccess, bInheritHandle, lpName);
+}
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_semaphore(SECURITY_ATTRIBUTES_* lpSemaphoreAttributes, LONG_ lInitialCount, LONG_ lMaximumCount)
+{
+ return winapi::CreateSemaphoreW(lpSemaphoreAttributes, lInitialCount, lMaximumCount, 0);
+}
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_SEMAPHORE_HPP
diff --git a/boost/detail/winapi/srw_lock.hpp b/boost/detail/winapi/srw_lock.hpp
new file mode 100644
index 0000000000..c5318f5860
--- /dev/null
+++ b/boost/detail/winapi/srw_lock.hpp
@@ -0,0 +1,105 @@
+// srw_lock.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_SRW_LOCK_HPP
+#define BOOST_DETAIL_WINAPI_SRW_LOCK_HPP
+
+#include <boost/detail/winapi/config.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+struct _RTL_SRWLOCK;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+InitializeSRWLock(::_RTL_SRWLOCK* SRWLock);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+ReleaseSRWLockExclusive(::_RTL_SRWLOCK* SRWLock);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+ReleaseSRWLockShared(::_RTL_SRWLOCK* SRWLock);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+AcquireSRWLockExclusive(::_RTL_SRWLOCK* SRWLock);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+AcquireSRWLockShared(::_RTL_SRWLOCK* SRWLock);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOLEAN_ WINAPI
+TryAcquireSRWLockExclusive(::_RTL_SRWLOCK* SRWLock);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOLEAN_ WINAPI
+TryAcquireSRWLockShared(::_RTL_SRWLOCK* SRWLock);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _RTL_SRWLOCK {
+ PVOID_ Ptr;
+} SRWLOCK_, *PSRWLOCK_;
+
+#if defined( BOOST_USE_WINDOWS_H )
+#define BOOST_DETAIL_WINAPI_SRWLOCK_INIT SRWLOCK_INIT
+#else
+#define BOOST_DETAIL_WINAPI_SRWLOCK_INIT {0}
+#endif
+
+BOOST_FORCEINLINE VOID_ InitializeSRWLock(PSRWLOCK_ SRWLock)
+{
+ ::InitializeSRWLock(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+BOOST_FORCEINLINE VOID_ ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock)
+{
+ ::ReleaseSRWLockExclusive(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+BOOST_FORCEINLINE VOID_ ReleaseSRWLockShared(PSRWLOCK_ SRWLock)
+{
+ ::ReleaseSRWLockShared(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+BOOST_FORCEINLINE VOID_ AcquireSRWLockExclusive(PSRWLOCK_ SRWLock)
+{
+ ::AcquireSRWLockExclusive(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+BOOST_FORCEINLINE VOID_ AcquireSRWLockShared(PSRWLOCK_ SRWLock)
+{
+ ::AcquireSRWLockShared(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+BOOST_FORCEINLINE BOOLEAN_ TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock)
+{
+ return ::TryAcquireSRWLockExclusive(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+BOOST_FORCEINLINE BOOLEAN_ TryAcquireSRWLockShared(PSRWLOCK_ SRWLock)
+{
+ return ::TryAcquireSRWLockShared(reinterpret_cast< ::_RTL_SRWLOCK* >(SRWLock));
+}
+
+}
+}
+}
+
+#endif // BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+
+#endif // BOOST_DETAIL_WINAPI_SRW_LOCK_HPP
diff --git a/boost/detail/winapi/synchronization.hpp b/boost/detail/winapi/synchronization.hpp
index b9497cbf7c..d4f8c04cb6 100644
--- a/boost/detail/winapi/synchronization.hpp
+++ b/boost/detail/winapi/synchronization.hpp
@@ -1,6 +1,7 @@
// synchronizaion.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -10,284 +11,18 @@
#define BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/critical_section.hpp>
+#include <boost/detail/winapi/wait.hpp>
+#include <boost/detail/winapi/event.hpp>
+#include <boost/detail/winapi/mutex.hpp>
+#include <boost/detail/winapi/semaphore.hpp>
+#include <boost/detail/winapi/init_once.hpp>
+#include <boost/detail/winapi/srw_lock.hpp>
+#include <boost/detail/winapi/condition_variable.hpp>
+#include <boost/detail/winapi/apc.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
- typedef ::CRITICAL_SECTION CRITICAL_SECTION_;
- typedef ::PAPCFUNC PAPCFUNC_;
-
-#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- typedef ::INIT_ONCE INIT_ONCE_;
- typedef ::PINIT_ONCE PINIT_ONCE_;
- typedef ::LPINIT_ONCE LPINIT_ONCE_;
- #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT INIT_ONCE_STATIC_INIT
- typedef ::PINIT_ONCE_FN PINIT_ONCE_FN_;
-
- typedef ::SRWLOCK SRWLOCK_;
- typedef ::PSRWLOCK PSRWLOCK_;
- #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT SRWLOCK_INIT
-
- typedef ::CONDITION_VARIABLE CONDITION_VARIABLE_;
- typedef ::PCONDITION_VARIABLE PCONDITION_VARIABLE_;
- #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT CONDITION_VARIABLE_INIT
-#endif
-
- using ::InitializeCriticalSection;
-#if BOOST_USE_WINAPI_VERSION >= 0x0403
- using ::InitializeCriticalSectionAndSpinCount;
-#endif
- using ::EnterCriticalSection;
- using ::TryEnterCriticalSection;
- using ::LeaveCriticalSection;
- using ::DeleteCriticalSection;
-
-# ifdef BOOST_NO_ANSI_APIS
- using ::CreateMutexW;
- using ::OpenMutexW;
- using ::CreateEventW;
- using ::OpenEventW;
- using ::CreateSemaphoreW;
- using ::OpenSemaphoreW;
-# else
- using ::CreateMutexA;
- using ::OpenMutexA;
- using ::CreateEventA;
- using ::OpenEventA;
- using ::CreateSemaphoreA;
- using ::OpenSemaphoreA;
-# endif
- using ::ReleaseMutex;
- using ::ReleaseSemaphore;
- using ::SetEvent;
- using ::ResetEvent;
- using ::WaitForMultipleObjects;
- using ::WaitForSingleObject;
- using ::QueueUserAPC;
-
-#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- using ::InitOnceInitialize;
- using ::InitOnceExecuteOnce;
- using ::InitOnceBeginInitialize;
- using ::InitOnceComplete;
-
- using ::InitializeSRWLock;
- using ::AcquireSRWLockExclusive;
- using ::TryAcquireSRWLockExclusive;
- using ::ReleaseSRWLockExclusive;
- using ::AcquireSRWLockShared;
- using ::TryAcquireSRWLockShared;
- using ::ReleaseSRWLockShared;
-
- using ::InitializeConditionVariable;
- using ::WakeConditionVariable;
- using ::WakeAllConditionVariable;
- using ::SleepConditionVariableCS;
- using ::SleepConditionVariableSRW;
-#endif
-
- const DWORD_ infinite = INFINITE;
- const DWORD_ wait_abandoned = WAIT_ABANDONED;
- const DWORD_ wait_object_0 = WAIT_OBJECT_0;
- const DWORD_ wait_timeout = WAIT_TIMEOUT;
- const DWORD_ wait_failed = WAIT_FAILED;
-
-#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- const DWORD_ init_once_async = INIT_ONCE_ASYNC;
- const DWORD_ init_once_check_only = INIT_ONCE_CHECK_ONLY;
- const DWORD_ init_once_init_failed = INIT_ONCE_INIT_FAILED;
- const DWORD_ init_once_ctx_reserved_bits = INIT_ONCE_CTX_RESERVED_BITS;
-
- const ULONG_ condition_variable_lockmode_shared = CONDITION_VARIABLE_LOCKMODE_SHARED;
-#endif
-
-#else // defined( BOOST_USE_WINDOWS_H )
-
-extern "C" {
-
- typedef struct CRITICAL_SECTION_
- {
- struct critical_section_debug * DebugInfo;
- long LockCount;
- long RecursionCount;
- void * OwningThread;
- void * LockSemaphore;
- #if defined(_WIN64)
- unsigned __int64 SpinCount;
- #else
- unsigned long SpinCount;
- #endif
- }
- *PCRITICAL_SECTION_;
-
-#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- typedef union INIT_ONCE_
- {
- PVOID_ Ptr;
- }
- *PINIT_ONCE_, *LPINIT_ONCE_;
- #define BOOST_DETAIL_WINAPI_INIT_ONCE_STATIC_INIT {0}
- typedef BOOL_ (WINAPI *PINIT_ONCE_FN_)(PINIT_ONCE_ InitOnce, PVOID_ Parameter, PVOID_ *Context);
-
- typedef struct SRWLOCK_
- {
- PVOID_ Ptr;
- }
- * PSRWLOCK_;
- #define BOOST_DETAIL_WINAPI_SRWLOCK_INIT {0}
-
- typedef struct CONDITION_VARIABLE_
- {
- PVOID_ Ptr;
- }
- * PCONDITION_VARIABLE_;
- #define BOOST_DETAIL_WINAPI_CONDITION_VARIABLE_INIT {0}
-
-#endif
-
- __declspec(dllimport) void WINAPI
- InitializeCriticalSection(PCRITICAL_SECTION_);
-#if BOOST_USE_WINAPI_VERSION >= 0x0403
- __declspec(dllimport) BOOL_ WINAPI
- InitializeCriticalSectionAndSpinCount(CRITICAL_SECTION_* lpCS, DWORD_ dwSpinCount);
-#endif
- __declspec(dllimport) void WINAPI
- EnterCriticalSection(PCRITICAL_SECTION_);
- __declspec(dllimport) BOOL_ WINAPI
- TryEnterCriticalSection(PCRITICAL_SECTION_);
- __declspec(dllimport) void WINAPI
- LeaveCriticalSection(PCRITICAL_SECTION_);
- __declspec(dllimport) void WINAPI
- DeleteCriticalSection(PCRITICAL_SECTION_);
-
- struct _SECURITY_ATTRIBUTES;
-# ifdef BOOST_NO_ANSI_APIS
- __declspec(dllimport) HANDLE_ WINAPI
- CreateMutexW(_SECURITY_ATTRIBUTES*, BOOL_, LPCWSTR_);
- __declspec(dllimport) HANDLE_ WINAPI
- OpenMutexW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName);
- __declspec(dllimport) HANDLE_ WINAPI
- CreateSemaphoreW(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCWSTR_);
- __declspec(dllimport) HANDLE_ WINAPI
- OpenSemaphoreW(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCWSTR_ lpName);
- __declspec(dllimport) HANDLE_ WINAPI
- CreateEventW(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCWSTR_);
- __declspec(dllimport) HANDLE_ WINAPI
- OpenEventW(DWORD_, BOOL_, LPCWSTR_);
-# else
- __declspec(dllimport) HANDLE_ WINAPI
- CreateMutexA(_SECURITY_ATTRIBUTES*, BOOL_, LPCSTR_);
- __declspec(dllimport) HANDLE_ WINAPI
- OpenMutexA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName);
- __declspec(dllimport) HANDLE_ WINAPI
- CreateSemaphoreA(_SECURITY_ATTRIBUTES*, LONG_, LONG_, LPCSTR_);
- __declspec(dllimport) HANDLE_ WINAPI
- OpenSemaphoreA(DWORD_ dwDesiredAccess, BOOL_ bInheritHandle, LPCSTR_ lpName);
- __declspec(dllimport) HANDLE_ WINAPI
- CreateEventA(_SECURITY_ATTRIBUTES*, BOOL_, BOOL_, LPCSTR_);
- __declspec(dllimport) HANDLE_ WINAPI
- OpenEventA(DWORD_, BOOL_, LPCSTR_);
-# endif
- __declspec(dllimport) BOOL_ WINAPI
- ReleaseMutex(HANDLE_);
- __declspec(dllimport) DWORD_ WINAPI
- WaitForSingleObject(HANDLE_, DWORD_);
- __declspec(dllimport) DWORD_ WINAPI
- WaitForMultipleObjects(DWORD_ nCount,
- HANDLE_ const * lpHandles,
- BOOL_ bWaitAll,
- DWORD_ dwMilliseconds);
- __declspec(dllimport) BOOL_ WINAPI
- ReleaseSemaphore(HANDLE_, LONG_, LONG_*);
- __declspec(dllimport) BOOL_ WINAPI
- SetEvent(HANDLE_);
- __declspec(dllimport) BOOL_ WINAPI
- ResetEvent(HANDLE_);
-
- typedef void (__stdcall *PAPCFUNC_)(ULONG_PTR_);
- __declspec(dllimport) DWORD_ WINAPI
- QueueUserAPC(PAPCFUNC_, HANDLE_, ULONG_PTR_);
-
-#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- __declspec(dllimport) void WINAPI InitOnceInitialize(PINIT_ONCE_);
- __declspec(dllimport) BOOL_ WINAPI InitOnceExecuteOnce(PINIT_ONCE_ InitOnce, PINIT_ONCE_FN_ InitFn, PVOID_ Parameter, LPVOID_* Context);
- __declspec(dllimport) BOOL_ WINAPI InitOnceBeginInitialize(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, BOOL_* fPending, LPVOID_* lpContext);
- __declspec(dllimport) BOOL_ WINAPI InitOnceComplete(LPINIT_ONCE_ lpInitOnce, DWORD_ dwFlags, LPVOID_* lpContext);
-
-
- __declspec(dllimport) void WINAPI InitializeSRWLock(PSRWLOCK_ SRWLock);
- __declspec(dllimport) void WINAPI AcquireSRWLockExclusive(PSRWLOCK_ SRWLock);
- __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockExclusive(PSRWLOCK_ SRWLock);
- __declspec(dllimport) void WINAPI ReleaseSRWLockExclusive(PSRWLOCK_ SRWLock);
- __declspec(dllimport) void WINAPI AcquireSRWLockShared(PSRWLOCK_ SRWLock);
- __declspec(dllimport) BOOLEAN_ WINAPI TryAcquireSRWLockShared(PSRWLOCK_ SRWLock);
- __declspec(dllimport) void WINAPI ReleaseSRWLockShared(PSRWLOCK_ SRWLock);
-
- __declspec(dllimport) void WINAPI InitializeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
- __declspec(dllimport) void WINAPI WakeConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
- __declspec(dllimport) void WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE_ ConditionVariable);
- __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableCS(PCONDITION_VARIABLE_ ConditionVariable, PCRITICAL_SECTION_ CriticalSection, DWORD_ dwMilliseconds);
- __declspec(dllimport) BOOL_ WINAPI SleepConditionVariableSRW(PCONDITION_VARIABLE_ ConditionVariable, PSRWLOCK_ SRWLock, DWORD_ dwMilliseconds, ULONG_ Flags);
-#endif
-
-} // extern "C"
-
-const DWORD_ infinite = (DWORD_)0xFFFFFFFF;
-const DWORD_ wait_abandoned = 0x00000080L;
-const DWORD_ wait_object_0 = 0x00000000L;
-const DWORD_ wait_timeout = 0x00000102L;
-const DWORD_ wait_failed = (DWORD_)0xFFFFFFFF;
-
-#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
-const DWORD_ init_once_async = 0x00000002UL;
-const DWORD_ init_once_check_only = 0x00000001UL;
-const DWORD_ init_once_init_failed = 0x00000004UL;
-const DWORD_ init_once_ctx_reserved_bits = 2;
-
-const ULONG_ condition_variable_lockmode_shared = 0x00000001;
-#endif
-
-#endif // defined( BOOST_USE_WINDOWS_H )
-
-const DWORD_ max_non_infinite_wait = (DWORD_)0xFFFFFFFE;
-
-BOOST_FORCEINLINE HANDLE_ create_anonymous_mutex(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bInitialOwner)
-{
-#ifdef BOOST_NO_ANSI_APIS
- return CreateMutexW(lpAttributes, bInitialOwner, 0);
-#else
- return CreateMutexA(lpAttributes, bInitialOwner, 0);
-#endif
-}
-
-BOOST_FORCEINLINE HANDLE_ create_anonymous_semaphore(_SECURITY_ATTRIBUTES* lpAttributes, LONG_ lInitialCount, LONG_ lMaximumCount)
-{
-#ifdef BOOST_NO_ANSI_APIS
- return CreateSemaphoreW(lpAttributes, lInitialCount, lMaximumCount, 0);
-#else
- return CreateSemaphoreA(lpAttributes, lInitialCount, lMaximumCount, 0);
-#endif
-}
-
-BOOST_FORCEINLINE HANDLE_ create_anonymous_event(_SECURITY_ATTRIBUTES* lpAttributes, BOOL_ bManualReset, BOOL_ bInitialState)
-{
-#ifdef BOOST_NO_ANSI_APIS
- return CreateEventW(lpAttributes, bManualReset, bInitialState, 0);
-#else
- return CreateEventA(lpAttributes, bManualReset, bInitialState, 0);
-#endif
-}
-
-}
-}
-}
-
#endif // BOOST_DETAIL_WINAPI_SYNCHRONIZATION_HPP
diff --git a/boost/detail/winapi/system.hpp b/boost/detail/winapi/system.hpp
index 2c2d82a8a9..93a5eeb11c 100644
--- a/boost/detail/winapi/system.hpp
+++ b/boost/detail/winapi/system.hpp
@@ -2,6 +2,7 @@
// Copyright 2010 Vicente J. Botet Escriba
// Copyright (c) Microsoft Corporation 2014
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -16,47 +17,57 @@
#pragma once
#endif
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+struct _SYSTEM_INFO;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+GetSystemInfo(::_SYSTEM_INFO* lpSystemInfo);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+GetNativeSystemInfo(::_SYSTEM_INFO* lpSystemInfo);
+#endif
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
- typedef ::SYSTEM_INFO SYSTEM_INFO_;
-# if BOOST_USE_WINAPI_VERSION < BOOST_WINAPI_VERSION_WINXP
-extern "C" __declspec(dllimport) void __stdcall GetSystemInfo (struct system_info *);
-# else
-extern "C" __declspec(dllimport) void __stdcall GetNativeSystemInfo (struct system_info *);
-# endif
-#else
-extern "C" {
- typedef struct _SYSTEM_INFO {
- union {
- DWORD_ dwOemId;
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _SYSTEM_INFO {
+ union {
+ DWORD_ dwOemId;
struct {
- WORD_ wProcessorArchitecture;
- WORD_ wReserved;
- } dummy;
- } ;
- DWORD_ dwPageSize;
- LPVOID_ lpMinimumApplicationAddress;
- LPVOID_ lpMaximumApplicationAddress;
- DWORD_PTR_ dwActiveProcessorMask;
- DWORD_ dwNumberOfProcessors;
- DWORD_ dwProcessorType;
- DWORD_ dwAllocationGranularity;
- WORD_ wProcessorLevel;
- WORD_ wProcessorRevision;
- } SYSTEM_INFO_;
-
-# if BOOST_USE_WINAPI_VERSION < BOOST_WINAPI_VERSION_WINXP
- __declspec(dllimport) void __stdcall
- GetSystemInfo (struct system_info *);
-# else
- __declspec(dllimport) void __stdcall
- GetNativeSystemInfo (struct system_info *);
-# endif
-}
+ WORD_ wProcessorArchitecture;
+ WORD_ wReserved;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ DWORD_ dwPageSize;
+ LPVOID_ lpMinimumApplicationAddress;
+ LPVOID_ lpMaximumApplicationAddress;
+ DWORD_PTR_ dwActiveProcessorMask;
+ DWORD_ dwNumberOfProcessors;
+ DWORD_ dwProcessorType;
+ DWORD_ dwAllocationGranularity;
+ WORD_ wProcessorLevel;
+ WORD_ wProcessorRevision;
+} SYSTEM_INFO_, *LPSYSTEM_INFO_;
+
+BOOST_FORCEINLINE VOID_ GetSystemInfo(LPSYSTEM_INFO_ lpSystemInfo)
+{
+ ::GetSystemInfo(reinterpret_cast< ::_SYSTEM_INFO* >(lpSystemInfo));
+}
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WINXP
+BOOST_FORCEINLINE VOID_ GetNativeSystemInfo(LPSYSTEM_INFO_ lpSystemInfo)
+{
+ ::GetNativeSystemInfo(reinterpret_cast< ::_SYSTEM_INFO* >(lpSystemInfo));
+}
#endif
+
}
}
}
+
#endif // BOOST_DETAIL_WINAPI_SYSTEM_HPP
diff --git a/boost/detail/winapi/thread.hpp b/boost/detail/winapi/thread.hpp
index ee0dac6242..9367d46bd0 100644
--- a/boost/detail/winapi/thread.hpp
+++ b/boost/detail/winapi/thread.hpp
@@ -1,6 +1,7 @@
// thread.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -16,32 +17,28 @@
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
- using ::GetCurrentThreadId;
- using ::SleepEx;
- using ::Sleep;
- using ::SwitchToThread;
-#else
+#if !defined( BOOST_USE_WINDOWS_H )
extern "C" {
-# ifndef UNDER_CE
- __declspec(dllimport) DWORD_ WINAPI GetCurrentThreadId(void);
- __declspec(dllimport) DWORD_ WINAPI SleepEx(DWORD_, BOOL_);
- __declspec(dllimport) void WINAPI Sleep(DWORD_);
- __declspec(dllimport) BOOL_ WINAPI SwitchToThread(void);
-#else
- using ::GetCurrentThreadId;
- using ::SleepEx;
- using ::Sleep;
- using ::SwitchToThread;
+// Windows CE define GetCurrentThreadId as an inline function in kfuncs.h
+#if !defined( UNDER_CE )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI GetCurrentThreadId(BOOST_DETAIL_WINAPI_VOID);
#endif
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+SleepEx(
+ boost::detail::winapi::DWORD_ dwMilliseconds,
+ boost::detail::winapi::BOOL_ bAlertable);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI Sleep(boost::detail::winapi::DWORD_ dwMilliseconds);
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI SwitchToThread(BOOST_DETAIL_WINAPI_VOID);
}
#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+using ::GetCurrentThreadId;
+using ::SleepEx;
+using ::Sleep;
+using ::SwitchToThread;
}
}
}
diff --git a/boost/detail/winapi/thread_pool.hpp b/boost/detail/winapi/thread_pool.hpp
index 57059dc1b2..f81c545961 100644
--- a/boost/detail/winapi/thread_pool.hpp
+++ b/boost/detail/winapi/thread_pool.hpp
@@ -9,7 +9,7 @@
#ifndef BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
#define BOOST_DETAIL_WINAPI_THREAD_POOL_HPP
-#include <boost/detail/winapi/basic_types.hpp>
+#include <boost/detail/winapi/config.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
@@ -17,13 +17,41 @@
#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN2K
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
+#include <boost/detail/winapi/basic_types.hpp>
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+typedef boost::detail::winapi::VOID_ (NTAPI *WAITORTIMERCALLBACKFUNC)
+(boost::detail::winapi::PVOID_, boost::detail::winapi::BOOLEAN_);
+typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+RegisterWaitForSingleObject(
+ boost::detail::winapi::PHANDLE_ phNewWaitObject,
+ boost::detail::winapi::HANDLE_ hObject,
+ WAITORTIMERCALLBACK Callback,
+ boost::detail::winapi::PVOID_ Context,
+ boost::detail::winapi::ULONG_ dwMilliseconds,
+ boost::detail::winapi::ULONG_ dwFlags);
+}
+#endif
+
+// MinGW is buggy - it is missing these function declarations for Win2000
+#if !defined( BOOST_USE_WINDOWS_H ) || (defined(BOOST_WINAPI_IS_MINGW) && BOOST_USE_WINAPI_VERSION < BOOST_WINAPI_VERSION_WINXP)
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+UnregisterWait(boost::detail::winapi::HANDLE_ WaitHandle);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+UnregisterWaitEx(
+ boost::detail::winapi::HANDLE_ WaitHandle,
+ boost::detail::winapi::HANDLE_ CompletionEvent);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
typedef ::WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACKFUNC_;
typedef ::WAITORTIMERCALLBACK WAITORTIMERCALLBACK_;
@@ -32,61 +60,63 @@ using ::RegisterWaitForSingleObject;
using ::UnregisterWait;
using ::UnregisterWaitEx;
-const ULONG_ wt_execute_default = WT_EXECUTEDEFAULT;
-const ULONG_ wt_execute_in_io_thread = WT_EXECUTEINIOTHREAD;
-const ULONG_ wt_execute_in_ui_thread = WT_EXECUTEINUITHREAD;
-const ULONG_ wt_execute_in_wait_thread = WT_EXECUTEINWAITTHREAD;
-const ULONG_ wt_execute_only_once = WT_EXECUTEONLYONCE;
-const ULONG_ wt_execute_in_timer_thread = WT_EXECUTEINTIMERTHREAD;
-const ULONG_ wt_execute_long_function = WT_EXECUTELONGFUNCTION;
-const ULONG_ wt_execute_in_persistent_io_thread = WT_EXECUTEINPERSISTENTIOTHREAD;
-const ULONG_ wt_execute_in_persistent_thread = WT_EXECUTEINPERSISTENTTHREAD;
-const ULONG_ wt_transfer_impersonation = WT_TRANSFER_IMPERSONATION;
+#if defined( BOOST_USE_WINDOWS_H )
+
+const ULONG_ WT_EXECUTEDEFAULT_ = WT_EXECUTEDEFAULT;
+const ULONG_ WT_EXECUTEINIOTHREAD_ = WT_EXECUTEINIOTHREAD;
+#if defined( BOOST_WINAPI_IS_MINGW )
+const ULONG_ WT_EXECUTEINUITHREAD_ = 0x00000002;
+#else
+const ULONG_ WT_EXECUTEINUITHREAD_ = WT_EXECUTEINUITHREAD;
+#endif
+const ULONG_ WT_EXECUTEINWAITTHREAD_ = WT_EXECUTEINWAITTHREAD;
+const ULONG_ WT_EXECUTEONLYONCE_ = WT_EXECUTEONLYONCE;
+const ULONG_ WT_EXECUTEINTIMERTHREAD_ = WT_EXECUTEINTIMERTHREAD;
+const ULONG_ WT_EXECUTELONGFUNCTION_ = WT_EXECUTELONGFUNCTION;
+#if defined( BOOST_WINAPI_IS_MINGW )
+const ULONG_ WT_EXECUTEINPERSISTENTIOTHREAD_ = 0x00000040;
+#else
+const ULONG_ WT_EXECUTEINPERSISTENTIOTHREAD_ = WT_EXECUTEINPERSISTENTIOTHREAD;
+#endif
+const ULONG_ WT_EXECUTEINPERSISTENTTHREAD_ = WT_EXECUTEINPERSISTENTTHREAD;
+const ULONG_ WT_TRANSFER_IMPERSONATION_ = WT_TRANSFER_IMPERSONATION;
inline ULONG_ wt_set_max_threadpool_threads(ULONG_ flags, ULONG_ limit)
{
return WT_SET_MAX_THREADPOOL_THREADS(flags, limit);
}
-#else
-
-extern "C" {
+#else // defined( BOOST_USE_WINDOWS_H )
-typedef void (NTAPI* WAITORTIMERCALLBACKFUNC_) (PVOID_, BOOLEAN_);
-typedef WAITORTIMERCALLBACKFUNC_ WAITORTIMERCALLBACK_;
-
-__declspec(dllimport) BOOL_ WINAPI RegisterWaitForSingleObject
-(
- HANDLE_* phNewWaitObject,
- HANDLE_ hObject,
- WAITORTIMERCALLBACK_ Callback,
- PVOID_ Context,
- ULONG_ dwMilliseconds,
- ULONG_ dwFlags
-);
-
-__declspec(dllimport) BOOL_ WINAPI UnregisterWait(HANDLE_ WaitHandle);
-__declspec(dllimport) BOOL_ WINAPI UnregisterWaitEx(HANDLE_ WaitHandle, HANDLE_ CompletionEvent);
-
-} // extern "C"
-
-const ULONG_ wt_execute_default = 0x00000000;
-const ULONG_ wt_execute_in_io_thread = 0x00000001;
-const ULONG_ wt_execute_in_ui_thread = 0x00000002;
-const ULONG_ wt_execute_in_wait_thread = 0x00000004;
-const ULONG_ wt_execute_only_once = 0x00000008;
-const ULONG_ wt_execute_in_timer_thread = 0x00000020;
-const ULONG_ wt_execute_long_function = 0x00000010;
-const ULONG_ wt_execute_in_persistent_io_thread = 0x00000040;
-const ULONG_ wt_execute_in_persistent_thread = 0x00000080;
-const ULONG_ wt_transfer_impersonation = 0x00000100;
+const ULONG_ WT_EXECUTEDEFAULT_ = 0x00000000;
+const ULONG_ WT_EXECUTEINIOTHREAD_ = 0x00000001;
+const ULONG_ WT_EXECUTEINUITHREAD_ = 0x00000002;
+const ULONG_ WT_EXECUTEINWAITTHREAD_ = 0x00000004;
+const ULONG_ WT_EXECUTEONLYONCE_ = 0x00000008;
+const ULONG_ WT_EXECUTEINTIMERTHREAD_ = 0x00000020;
+const ULONG_ WT_EXECUTELONGFUNCTION_ = 0x00000010;
+const ULONG_ WT_EXECUTEINPERSISTENTIOTHREAD_ = 0x00000040;
+const ULONG_ WT_EXECUTEINPERSISTENTTHREAD_ = 0x00000080;
+const ULONG_ WT_TRANSFER_IMPERSONATION_ = 0x00000100;
inline ULONG_ wt_set_max_threadpool_threads(ULONG_ flags, ULONG_ limit)
{
return flags | (limit << 16);
}
-#endif
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const ULONG_ wt_execute_default = WT_EXECUTEDEFAULT_;
+const ULONG_ wt_execute_in_io_thread = WT_EXECUTEINIOTHREAD_;
+const ULONG_ wt_execute_in_ui_thread = WT_EXECUTEINUITHREAD_;
+const ULONG_ wt_execute_in_wait_thread = WT_EXECUTEINWAITTHREAD_;
+const ULONG_ wt_execute_only_once = WT_EXECUTEONLYONCE_;
+const ULONG_ wt_execute_in_timer_thread = WT_EXECUTEINTIMERTHREAD_;
+const ULONG_ wt_execute_long_function = WT_EXECUTELONGFUNCTION_;
+const ULONG_ wt_execute_in_persistent_io_thread = WT_EXECUTEINPERSISTENTIOTHREAD_;
+const ULONG_ wt_execute_in_persistent_thread = WT_EXECUTEINPERSISTENTTHREAD_;
+const ULONG_ wt_transfer_impersonation = WT_TRANSFER_IMPERSONATION_;
+
}
}
}
diff --git a/boost/detail/winapi/time.hpp b/boost/detail/winapi/time.hpp
index 6a6b447117..0f69f47744 100644
--- a/boost/detail/winapi/time.hpp
+++ b/boost/detail/winapi/time.hpp
@@ -2,6 +2,7 @@
// Copyright 2010 Vicente J. Botet Escriba
// Copyright (c) Microsoft Corporation 2014
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -11,90 +12,123 @@
#define BOOST_DETAIL_WINAPI_TIME_HPP
#include <boost/detail/winapi/basic_types.hpp>
-#include <boost/predef.h>
+#include <boost/predef/platform.h>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+struct _FILETIME;
+struct _SYSTEMTIME;
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+GetSystemTime(::_SYSTEMTIME* lpSystemTime);
+
+#ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME // Windows CE does not define GetSystemTimeAsFileTime
+BOOST_SYMBOL_IMPORT boost::detail::winapi::VOID_ WINAPI
+GetSystemTimeAsFileTime(::_FILETIME* lpSystemTimeAsFileTime);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SystemTimeToFileTime(
+ const ::_SYSTEMTIME* lpSystemTime,
+ ::_FILETIME* lpFileTime);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FileTimeToSystemTime(
+ const ::_FILETIME* lpFileTime,
+ ::_SYSTEMTIME* lpSystemTime);
+
+#if BOOST_PLAT_WINDOWS_DESKTOP
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+FileTimeToLocalFileTime(
+ const ::_FILETIME* lpFileTime,
+ ::_FILETIME* lpLocalFileTime);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+LocalFileTimeToFileTime(
+ const ::_FILETIME* lpLocalFileTime,
+ ::_FILETIME* lpFileTime);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+GetTickCount(BOOST_DETAIL_WINAPI_VOID);
+#endif
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+BOOST_SYMBOL_IMPORT boost::detail::winapi::ULONGLONG_ WINAPI
+GetTickCount64(BOOST_DETAIL_WINAPI_VOID);
+#endif
+}
+#endif
+
namespace boost {
namespace detail {
namespace winapi {
-#if defined( BOOST_USE_WINDOWS_H )
-
- typedef FILETIME FILETIME_;
- typedef PFILETIME PFILETIME_;
- typedef LPFILETIME LPFILETIME_;
-
- typedef SYSTEMTIME SYSTEMTIME_;
- typedef SYSTEMTIME* PSYSTEMTIME_;
-
- #ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME // Windows CE does not define GetSystemTimeAsFileTime
- using ::GetSystemTimeAsFileTime;
- #endif
- #if BOOST_PLAT_WINDOWS_DESKTOP
- using ::FileTimeToLocalFileTime;
- #endif
- using ::GetSystemTime;
- using ::SystemTimeToFileTime;
-
- #if BOOST_PLAT_WINDOWS_DESKTOP
- using ::GetTickCount;
- #endif
- #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- using ::GetTickCount64;
- #endif
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _FILETIME {
+ DWORD_ dwLowDateTime;
+ DWORD_ dwHighDateTime;
+} FILETIME_, *PFILETIME_, *LPFILETIME_;
+
+typedef struct BOOST_DETAIL_WINAPI_MAY_ALIAS _SYSTEMTIME {
+ WORD_ wYear;
+ WORD_ wMonth;
+ WORD_ wDayOfWeek;
+ WORD_ wDay;
+ WORD_ wHour;
+ WORD_ wMinute;
+ WORD_ wSecond;
+ WORD_ wMilliseconds;
+} SYSTEMTIME_, *PSYSTEMTIME_, *LPSYSTEMTIME_;
+
+#if BOOST_PLAT_WINDOWS_DESKTOP
+using ::GetTickCount;
+#endif
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
+using ::GetTickCount64;
+#endif
+BOOST_FORCEINLINE VOID_ GetSystemTime(LPSYSTEMTIME_ lpSystemTime)
+{
+ ::GetSystemTime(reinterpret_cast< ::_SYSTEMTIME* >(lpSystemTime));
+}
+
+#if defined( BOOST_HAS_GETSYSTEMTIMEASFILETIME )
+BOOST_FORCEINLINE VOID_ GetSystemTimeAsFileTime(LPFILETIME_ lpSystemTimeAsFileTime)
+{
+ ::GetSystemTimeAsFileTime(reinterpret_cast< ::_FILETIME* >(lpSystemTimeAsFileTime));
+}
#else
+// Windows CE does not define GetSystemTimeAsFileTime
+BOOST_FORCEINLINE VOID_ GetSystemTimeAsFileTime(FILETIME_* lpFileTime)
+{
+ boost::detail::winapi::SYSTEMTIME_ st;
+ boost::detail::winapi::GetSystemTime(&st);
+ boost::detail::winapi::SystemTimeToFileTime(&st, lpFileTime);
+}
+#endif
-extern "C" {
- typedef struct _FILETIME {
- DWORD_ dwLowDateTime;
- DWORD_ dwHighDateTime;
- } FILETIME_, *PFILETIME_, *LPFILETIME_;
-
- typedef struct _SYSTEMTIME {
- WORD_ wYear;
- WORD_ wMonth;
- WORD_ wDayOfWeek;
- WORD_ wDay;
- WORD_ wHour;
- WORD_ wMinute;
- WORD_ wSecond;
- WORD_ wMilliseconds;
- } SYSTEMTIME_, *PSYSTEMTIME_;
-
- #ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME // Windows CE does not define GetSystemTimeAsFileTime
- __declspec(dllimport) void WINAPI
- GetSystemTimeAsFileTime(FILETIME_* lpFileTime);
- #endif
- __declspec(dllimport) int WINAPI
- FileTimeToLocalFileTime(const FILETIME_* lpFileTime,
- FILETIME_* lpLocalFileTime);
- __declspec(dllimport) void WINAPI
- GetSystemTime(SYSTEMTIME_* lpSystemTime);
- __declspec(dllimport) int WINAPI
- SystemTimeToFileTime(const SYSTEMTIME_* lpSystemTime,
- FILETIME_* lpFileTime);
- #if BOOST_PLAT_WINDOWS_DESKTOP
- __declspec(dllimport) DWORD_ WINAPI
- GetTickCount();
- #endif
- #if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
- __declspec(dllimport) ULONGLONG_ WINAPI
- GetTickCount64();
- #endif
+BOOST_FORCEINLINE BOOL_ SystemTimeToFileTime(const SYSTEMTIME_* lpSystemTime, FILETIME_* lpFileTime)
+{
+ return ::SystemTimeToFileTime(reinterpret_cast< const ::_SYSTEMTIME* >(lpSystemTime), reinterpret_cast< ::_FILETIME* >(lpFileTime));
}
-#endif
+BOOST_FORCEINLINE BOOL_ FileTimeToSystemTime(const FILETIME_* lpFileTime, SYSTEMTIME_* lpSystemTime)
+{
+ return ::FileTimeToSystemTime(reinterpret_cast< const ::_FILETIME* >(lpFileTime), reinterpret_cast< ::_SYSTEMTIME* >(lpSystemTime));
+}
+
+#if BOOST_PLAT_WINDOWS_DESKTOP
+BOOST_FORCEINLINE BOOL_ FileTimeToLocalFileTime(const FILETIME_* lpFileTime, FILETIME_* lpLocalFileTime)
+{
+ return ::FileTimeToLocalFileTime(reinterpret_cast< const ::_FILETIME* >(lpFileTime), reinterpret_cast< ::_FILETIME* >(lpLocalFileTime));
+}
-#ifndef BOOST_HAS_GETSYSTEMTIMEASFILETIME
-inline void WINAPI GetSystemTimeAsFileTime(FILETIME_* lpFileTime)
+BOOST_FORCEINLINE BOOL_ LocalFileTimeToFileTime(const FILETIME_* lpLocalFileTime, FILETIME_* lpFileTime)
{
- SYSTEMTIME_ st;
- GetSystemTime(&st);
- SystemTimeToFileTime(&st, lpFileTime);
+ return ::LocalFileTimeToFileTime(reinterpret_cast< const ::_FILETIME* >(lpLocalFileTime), reinterpret_cast< ::_FILETIME* >(lpFileTime));
}
#endif
diff --git a/boost/detail/winapi/timers.hpp b/boost/detail/winapi/timers.hpp
index 04c6dfbc41..c3bf826100 100644
--- a/boost/detail/winapi/timers.hpp
+++ b/boost/detail/winapi/timers.hpp
@@ -1,6 +1,7 @@
// timers.hpp --------------------------------------------------------------//
// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
// Distributed under the Boost Software License, Version 1.0.
// See http://www.boost.org/LICENSE_1_0.txt
@@ -15,28 +16,31 @@
#pragma once
#endif
-namespace boost
-{
-namespace detail
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+QueryPerformanceCounter(::_LARGE_INTEGER* lpPerformanceCount);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+QueryPerformanceFrequency(::_LARGE_INTEGER* lpFrequency);
+}
+#endif
+
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+BOOST_FORCEINLINE BOOL_ QueryPerformanceCounter(LARGE_INTEGER_* lpPerformanceCount)
{
-namespace winapi
+ return ::QueryPerformanceCounter(reinterpret_cast< ::_LARGE_INTEGER* >(lpPerformanceCount));
+}
+
+BOOST_FORCEINLINE BOOL_ QueryPerformanceFrequency(LARGE_INTEGER_* lpFrequency)
{
-#if defined( BOOST_USE_WINDOWS_H )
- using ::QueryPerformanceCounter;
- using ::QueryPerformanceFrequency;
-#else
-extern "C" {
- __declspec(dllimport) BOOL_ WINAPI
- QueryPerformanceCounter(
- LARGE_INTEGER_ *lpPerformanceCount
- );
-
- __declspec(dllimport) BOOL_ WINAPI
- QueryPerformanceFrequency(
- LARGE_INTEGER_ *lpFrequency
- );
+ return ::QueryPerformanceFrequency(reinterpret_cast< ::_LARGE_INTEGER* >(lpFrequency));
}
-#endif
+
}
}
}
diff --git a/boost/detail/winapi/tls.hpp b/boost/detail/winapi/tls.hpp
index d948693cc9..bcdd7dc977 100644
--- a/boost/detail/winapi/tls.hpp
+++ b/boost/detail/winapi/tls.hpp
@@ -15,33 +15,44 @@
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+#if !defined( UNDER_CE )
+// Windows CE define TlsAlloc and TlsFree as inline functions in kfuncs.h
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+TlsAlloc(BOOST_DETAIL_WINAPI_VOID);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+TlsFree(boost::detail::winapi::DWORD_ dwTlsIndex);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::LPVOID_ WINAPI
+TlsGetValue(boost::detail::winapi::DWORD_ dwTlsIndex);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+TlsSetValue(
+ boost::detail::winapi::DWORD_ dwTlsIndex,
+ boost::detail::winapi::LPVOID_ lpTlsValue);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
using ::TlsAlloc;
+using ::TlsFree;
using ::TlsGetValue;
using ::TlsSetValue;
-using ::TlsFree;
-
-const DWORD_ tls_out_of_indexes = TLS_OUT_OF_INDEXES;
+#if defined( BOOST_USE_WINDOWS_H )
+const DWORD_ TLS_OUT_OF_INDEXES_ = TLS_OUT_OF_INDEXES;
#else
+const DWORD_ TLS_OUT_OF_INDEXES_ = 0xFFFFFFFF;
+#endif
-extern "C" {
-__declspec(dllimport) DWORD_ WINAPI TlsAlloc(void);
-__declspec(dllimport) LPVOID_ WINAPI TlsGetValue(DWORD_ dwTlsIndex);
-__declspec(dllimport) BOOL_ WINAPI TlsSetValue(DWORD_ dwTlsIndex, LPVOID_ lpTlsValue);
-__declspec(dllimport) BOOL_ WINAPI TlsFree(DWORD_ dwTlsIndex);
-}
-
-const DWORD_ tls_out_of_indexes = 0xFFFFFFFF;
+const DWORD_ tls_out_of_indexes = TLS_OUT_OF_INDEXES_;
-#endif
}
}
}
diff --git a/boost/detail/winapi/wait.hpp b/boost/detail/winapi/wait.hpp
new file mode 100644
index 0000000000..bd20d46826
--- /dev/null
+++ b/boost/detail/winapi/wait.hpp
@@ -0,0 +1,84 @@
+// wait.hpp --------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+// Copyright 2015 Andrey Semashev
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+
+#ifndef BOOST_DETAIL_WINAPI_WAIT_HPP
+#define BOOST_DETAIL_WINAPI_WAIT_HPP
+
+#include <boost/detail/winapi/basic_types.hpp>
+
+#ifdef BOOST_HAS_PRAGMA_ONCE
+#pragma once
+#endif
+
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+WaitForSingleObject(
+ boost::detail::winapi::HANDLE_ hHandle,
+ boost::detail::winapi::DWORD_ dwMilliseconds);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+WaitForMultipleObjects(
+ boost::detail::winapi::DWORD_ nCount,
+ boost::detail::winapi::HANDLE_ const* lpHandles,
+ boost::detail::winapi::BOOL_ bWaitAll,
+ boost::detail::winapi::DWORD_ dwMilliseconds);
+
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+BOOST_SYMBOL_IMPORT boost::detail::winapi::DWORD_ WINAPI
+SignalObjectAndWait(
+ boost::detail::winapi::HANDLE_ hObjectToSignal,
+ boost::detail::winapi::HANDLE_ hObjectToWaitOn,
+ boost::detail::winapi::DWORD_ dwMilliseconds,
+ boost::detail::winapi::BOOL_ bAlertable);
+#endif
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
+
+using ::WaitForMultipleObjects;
+using ::WaitForSingleObject;
+#if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_NT4
+using ::SignalObjectAndWait;
+#endif
+
+#if defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ INFINITE_ = INFINITE;
+const DWORD_ WAIT_ABANDONED_ = WAIT_ABANDONED;
+const DWORD_ WAIT_OBJECT_0_ = WAIT_OBJECT_0;
+const DWORD_ WAIT_TIMEOUT_ = WAIT_TIMEOUT;
+const DWORD_ WAIT_FAILED_ = WAIT_FAILED;
+
+#else // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ INFINITE_ = (DWORD_)0xFFFFFFFF;
+const DWORD_ WAIT_ABANDONED_ = 0x00000080L;
+const DWORD_ WAIT_OBJECT_0_ = 0x00000000L;
+const DWORD_ WAIT_TIMEOUT_ = 0x00000102L;
+const DWORD_ WAIT_FAILED_ = (DWORD_)0xFFFFFFFF;
+
+#endif // defined( BOOST_USE_WINDOWS_H )
+
+const DWORD_ infinite = INFINITE_;
+const DWORD_ wait_abandoned = WAIT_ABANDONED_;
+const DWORD_ wait_object_0 = WAIT_OBJECT_0_;
+const DWORD_ wait_timeout = WAIT_TIMEOUT_;
+const DWORD_ wait_failed = WAIT_FAILED_;
+
+const DWORD_ max_non_infinite_wait = (DWORD_)0xFFFFFFFE;
+
+}
+}
+}
+
+#endif // BOOST_DETAIL_WINAPI_WAIT_HPP
diff --git a/boost/detail/winapi/waitable_timer.hpp b/boost/detail/winapi/waitable_timer.hpp
index 52a7338a20..842cb040d4 100644
--- a/boost/detail/winapi/waitable_timer.hpp
+++ b/boost/detail/winapi/waitable_timer.hpp
@@ -15,91 +15,107 @@
#pragma once
#endif
-namespace boost
-{
-namespace detail
-{
-namespace winapi
-{
-#if defined( BOOST_USE_WINDOWS_H )
+#if !defined( BOOST_USE_WINDOWS_H )
+extern "C" {
+typedef boost::detail::winapi::VOID_
+(WINAPI *PTIMERAPCROUTINE)(
+ boost::detail::winapi::LPVOID_ lpArgToCompletionRoutine,
+ boost::detail::winapi::DWORD_ dwTimerLowValue,
+ boost::detail::winapi::DWORD_ dwTimerHighValue);
+
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateWaitableTimerA(
+ ::_SECURITY_ATTRIBUTES* lpTimerAttributes,
+ boost::detail::winapi::BOOL_ bManualReset,
+ boost::detail::winapi::LPCSTR_ lpTimerName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenWaitableTimerA(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCSTR_ lpTimerName);
+#endif
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+CreateWaitableTimerW(
+ ::_SECURITY_ATTRIBUTES* lpTimerAttributes,
+ boost::detail::winapi::BOOL_ bManualReset,
+ boost::detail::winapi::LPCWSTR_ lpTimerName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::HANDLE_ WINAPI
+OpenWaitableTimerW(
+ boost::detail::winapi::DWORD_ dwDesiredAccess,
+ boost::detail::winapi::BOOL_ bInheritHandle,
+ boost::detail::winapi::LPCWSTR_ lpTimerName);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+SetWaitableTimer(
+ boost::detail::winapi::HANDLE_ hTimer,
+ const ::_LARGE_INTEGER* lpDueTime,
+ boost::detail::winapi::LONG_ lPeriod,
+ PTIMERAPCROUTINE pfnCompletionRoutine,
+ boost::detail::winapi::LPVOID_ lpArgToCompletionRoutine,
+ boost::detail::winapi::BOOL_ fResume);
+
+BOOST_SYMBOL_IMPORT boost::detail::winapi::BOOL_ WINAPI
+CancelWaitableTimer(boost::detail::winapi::HANDLE_ hTimer);
+}
+#endif
+
+namespace boost {
+namespace detail {
+namespace winapi {
typedef ::PTIMERAPCROUTINE PTIMERAPCROUTINE_;
-# ifdef BOOST_NO_ANSI_APIS
-using ::CreateWaitableTimerW;
-using ::OpenWaitableTimerW;
-# else
-using ::CreateWaitableTimerA;
+#if !defined( BOOST_NO_ANSI_APIS )
using ::OpenWaitableTimerA;
-# endif
-using ::SetWaitableTimer;
+#endif
+using ::OpenWaitableTimerW;
using ::CancelWaitableTimer;
-#else
-
-extern "C" {
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ CreateWaitableTimerA(PSECURITY_ATTRIBUTES_ lpTimerAttributes, BOOL_ bManualReset, LPCSTR_ lpTimerName)
+{
+ return ::CreateWaitableTimerA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpTimerAttributes), bManualReset, lpTimerName);
+}
+#endif
-struct _SECURITY_ATTRIBUTES;
+BOOST_FORCEINLINE HANDLE_ CreateWaitableTimerW(PSECURITY_ATTRIBUTES_ lpTimerAttributes, BOOL_ bManualReset, LPCWSTR_ lpTimerName)
+{
+ return ::CreateWaitableTimerW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpTimerAttributes), bManualReset, lpTimerName);
+}
-typedef void (WINAPI* PTIMERAPCROUTINE_)
-(
- LPVOID_ lpArgToCompletionRoutine,
- DWORD_ dwTimerLowValue,
- DWORD_ dwTimerHighValue
-);
-
-# ifdef BOOST_NO_ANSI_APIS
-__declspec(dllimport) HANDLE_ WINAPI CreateWaitableTimerW
-(
- _SECURITY_ATTRIBUTES* lpTimerAttributes,
- BOOL_ bManualReset,
- LPCWSTR_ lpTimerName
-);
-
-__declspec(dllimport) HANDLE_ WINAPI OpenWaitableTimerW
-(
- DWORD_ dwDesiredAccess,
- BOOL_ bInheritHandle,
- LPCWSTR_ lpTimerName
-);
-# else
-__declspec(dllimport) HANDLE_ WINAPI CreateWaitableTimerA
-(
- _SECURITY_ATTRIBUTES* lpTimerAttributes,
- BOOL_ bManualReset,
- LPCSTR_ lpTimerName
-);
-
-__declspec(dllimport) HANDLE_ WINAPI OpenWaitableTimerA
-(
- DWORD_ dwDesiredAccess,
- BOOL_ bInheritHandle,
- LPCSTR_ lpTimerName
-);
-# endif
-
-__declspec(dllimport) BOOL_ WINAPI SetWaitableTimer
-(
+BOOST_FORCEINLINE BOOL_ SetWaitableTimer(
HANDLE_ hTimer,
- const LARGE_INTEGER_ *lpDueTime,
+ const LARGE_INTEGER_* lpDueTime,
LONG_ lPeriod,
PTIMERAPCROUTINE_ pfnCompletionRoutine,
LPVOID_ lpArgToCompletionRoutine,
- BOOL_ fResume
-);
-
-__declspec(dllimport) BOOL_ WINAPI CancelWaitableTimer(HANDLE_ hTimer);
-
+ BOOL_ fResume)
+{
+ return ::SetWaitableTimer(hTimer, reinterpret_cast< const ::_LARGE_INTEGER* >(lpDueTime), lPeriod, pfnCompletionRoutine, lpArgToCompletionRoutine, fResume);
}
+#if !defined( BOOST_NO_ANSI_APIS )
+BOOST_FORCEINLINE HANDLE_ create_waitable_timer(PSECURITY_ATTRIBUTES_ lpTimerAttributes, BOOL_ bManualReset, LPCSTR_ lpTimerName)
+{
+ return ::CreateWaitableTimerA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpTimerAttributes), bManualReset, lpTimerName);
+}
#endif
-BOOST_FORCEINLINE HANDLE_ create_anonymous_waitable_timer(_SECURITY_ATTRIBUTES* lpTimerAttributes, BOOL_ bManualReset)
+BOOST_FORCEINLINE HANDLE_ create_waitable_timer(PSECURITY_ATTRIBUTES_ lpTimerAttributes, BOOL_ bManualReset, LPCWSTR_ lpTimerName)
+{
+ return ::CreateWaitableTimerW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpTimerAttributes), bManualReset, lpTimerName);
+}
+
+BOOST_FORCEINLINE HANDLE_ create_anonymous_waitable_timer(PSECURITY_ATTRIBUTES_ lpTimerAttributes, BOOL_ bManualReset)
{
#ifdef BOOST_NO_ANSI_APIS
- return CreateWaitableTimerW(lpTimerAttributes, bManualReset, 0);
+ return ::CreateWaitableTimerW(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpTimerAttributes), bManualReset, 0);
#else
- return CreateWaitableTimerA(lpTimerAttributes, bManualReset, 0);
+ return ::CreateWaitableTimerA(reinterpret_cast< ::_SECURITY_ATTRIBUTES* >(lpTimerAttributes), bManualReset, 0);
#endif
}
diff --git a/boost/endian/conversion.hpp b/boost/endian/conversion.hpp
index 1d89596ebf..7c145d9506 100644
--- a/boost/endian/conversion.hpp
+++ b/boost/endian/conversion.hpp
@@ -23,7 +23,6 @@ namespace boost
{
namespace endian
{
-#ifndef BOOST_ENDIAN_ORDER_ENUM_DEFINED
BOOST_SCOPED_ENUM_START(order)
{
big, little,
@@ -33,8 +32,6 @@ namespace endian
native = little
# endif
}; BOOST_SCOPED_ENUM_END
-# define BOOST_ENDIAN_ORDER_ENUM_DEFINED
-#endif
//--------------------------------------------------------------------------------------//
// //
@@ -52,7 +49,11 @@ namespace endian
// //
//--------------------------------------------------------------------------------------//
- // customization for exact-length arithmetic types. See doc/conversion.html/#FAQ
+ // customization for exact-length arithmetic types. See doc/conversion.html/#FAQ.
+ // Note: The omission of an overloads for the arithmetic type (typically long, or
+ // long long) not assigned to one of the exact length typedefs is a deliberate
+ // design decision. Such overloads would be non-portable and thus error prone.
+
inline int8_t endian_reverse(int8_t x) BOOST_NOEXCEPT;
inline int16_t endian_reverse(int16_t x) BOOST_NOEXCEPT;
inline int32_t endian_reverse(int32_t x) BOOST_NOEXCEPT;
diff --git a/boost/exception/exception.hpp b/boost/exception/exception.hpp
index d762cf827e..1f2bd9c200 100644
--- a/boost/exception/exception.hpp
+++ b/boost/exception/exception.hpp
@@ -432,6 +432,11 @@ boost
{
}
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+# pragma GCC visibility push (default)
+# endif
+#endif
template <class T>
class
clone_impl:
@@ -473,6 +478,11 @@ boost
}
};
}
+#if defined(__GNUC__)
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+# pragma GCC visibility pop
+# endif
+#endif
template <class T>
inline
diff --git a/boost/filesystem.hpp b/boost/filesystem.hpp
index 1a753026c8..0122634d36 100644
--- a/boost/filesystem.hpp
+++ b/boost/filesystem.hpp
@@ -16,5 +16,6 @@
# include <boost/filesystem/path.hpp>
# include <boost/filesystem/operations.hpp>
# include <boost/filesystem/convenience.hpp>
+# include <boost/filesystem/string_file.hpp>
#endif // BOOST_FILESYSTEM_FILESYSTEM_HPP
diff --git a/boost/filesystem/config.hpp b/boost/filesystem/config.hpp
index ca695f4114..815976959a 100644
--- a/boost/filesystem/config.hpp
+++ b/boost/filesystem/config.hpp
@@ -27,12 +27,13 @@
#include <boost/config.hpp>
#include <boost/system/api_config.hpp> // for BOOST_POSIX_API or BOOST_WINDOWS_API
-#include <boost/detail/workaround.hpp>
+#include <boost/detail/workaround.hpp>
// BOOST_FILESYSTEM_DEPRECATED needed for source compiles -----------------------------//
# ifdef BOOST_FILESYSTEM_SOURCE
# define BOOST_FILESYSTEM_DEPRECATED
+# undef BOOST_FILESYSTEM_NO_DEPRECATED // fixes #9454, src bld fails if NO_DEP defined
# endif
// throw an exception ----------------------------------------------------------------//
diff --git a/boost/filesystem/operations.hpp b/boost/filesystem/operations.hpp
index f0e09b9db7..47bc07476b 100644
--- a/boost/filesystem/operations.hpp
+++ b/boost/filesystem/operations.hpp
@@ -31,7 +31,6 @@
#include <boost/shared_ptr.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
-#include <boost/iterator.hpp>
#include <boost/cstdint.hpp>
#include <boost/range/mutable_iterator.hpp>
#include <boost/range/const_iterator.hpp>
@@ -256,41 +255,81 @@ namespace boost
class BOOST_FILESYSTEM_DECL file_status
{
public:
- file_status() : m_value(status_error), m_perms(perms_not_known) {}
- explicit file_status(file_type v, perms prms = perms_not_known)
- : m_value(v), m_perms(prms) {}
+ file_status() BOOST_NOEXCEPT
+ : m_value(status_error), m_perms(perms_not_known) {}
+ explicit file_status(file_type v) BOOST_NOEXCEPT
+ : m_value(v), m_perms(perms_not_known) {}
+ file_status(file_type v, perms prms) BOOST_NOEXCEPT
+ : m_value(v), m_perms(prms) {}
+
+ // As of October 2015 the interaction between noexcept and =default is so troublesome
+ // for VC++, GCC, and probably other compilers, that =default is not used with noexcept
+ // functions. GCC is not even consistent for the same release on different platforms.
+
+ file_status(const file_status& rhs) BOOST_NOEXCEPT
+ : m_value(rhs.m_value), m_perms(rhs.m_perms) {}
+ file_status& operator=(const file_status& rhs) BOOST_NOEXCEPT
+ {
+ m_value = rhs.m_value;
+ m_perms = rhs.m_perms;
+ return *this;
+ }
+
+# if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ file_status(file_status&& rhs) BOOST_NOEXCEPT
+ {
+ m_value = std::move(rhs.m_value);
+ m_perms = std::move(rhs.m_perms);
+ }
+ file_status& operator=(file_status&& rhs) BOOST_NOEXCEPT
+ {
+ m_value = std::move(rhs.m_value);
+ m_perms = std::move(rhs.m_perms);
+ return *this;
+ }
+# endif
+
// observers
- file_type type() const { return m_value; }
- perms permissions() const { return m_perms; }
+ file_type type() const BOOST_NOEXCEPT { return m_value; }
+ perms permissions() const BOOST_NOEXCEPT { return m_perms; }
// modifiers
- void type(file_type v) { m_value = v; }
- void permissions(perms prms) { m_perms = prms; }
+ void type(file_type v) BOOST_NOEXCEPT { m_value = v; }
+ void permissions(perms prms) BOOST_NOEXCEPT { m_perms = prms; }
- bool operator==(const file_status& rhs) const { return type() == rhs.type() &&
- permissions() == rhs.permissions(); }
- bool operator!=(const file_status& rhs) const { return !(*this == rhs); }
+ bool operator==(const file_status& rhs) const BOOST_NOEXCEPT
+ { return type() == rhs.type() &&
+ permissions() == rhs.permissions(); }
+ bool operator!=(const file_status& rhs) const BOOST_NOEXCEPT
+ { return !(*this == rhs); }
private:
file_type m_value;
enum perms m_perms;
};
- inline bool type_present(file_status f) { return f.type() != status_error; }
- inline bool permissions_present(file_status f)
+ inline bool type_present(file_status f) BOOST_NOEXCEPT
+ { return f.type() != status_error; }
+ inline bool permissions_present(file_status f) BOOST_NOEXCEPT
{return f.permissions() != perms_not_known;}
- inline bool status_known(file_status f) { return type_present(f) && permissions_present(f); }
- inline bool exists(file_status f) { return f.type() != status_error
+ inline bool status_known(file_status f) BOOST_NOEXCEPT
+ { return type_present(f) && permissions_present(f); }
+ inline bool exists(file_status f) BOOST_NOEXCEPT
+ { return f.type() != status_error
&& f.type() != file_not_found; }
- inline bool is_regular_file(file_status f){ return f.type() == regular_file; }
- inline bool is_directory(file_status f) { return f.type() == directory_file; }
- inline bool is_symlink(file_status f) { return f.type() == symlink_file; }
- inline bool is_other(file_status f) { return exists(f) && !is_regular_file(f)
+ inline bool is_regular_file(file_status f) BOOST_NOEXCEPT
+ { return f.type() == regular_file; }
+ inline bool is_directory(file_status f) BOOST_NOEXCEPT
+ { return f.type() == directory_file; }
+ inline bool is_symlink(file_status f) BOOST_NOEXCEPT
+ { return f.type() == symlink_file; }
+ inline bool is_other(file_status f) BOOST_NOEXCEPT
+ { return exists(f) && !is_regular_file(f)
&& !is_directory(f) && !is_symlink(f); }
# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
- inline bool is_regular(file_status f) { return f.type() == regular_file; }
+ inline bool is_regular(file_status f) BOOST_NOEXCEPT { return f.type() == regular_file; }
# endif
struct space_info
@@ -332,7 +371,7 @@ namespace boost
void copy_directory(const path& from, const path& to, system::error_code* ec=0);
BOOST_FILESYSTEM_DECL
void copy_file(const path& from, const path& to, // See ticket #2925
- detail::copy_option option, system::error_code* ec=0);
+ detail::copy_option option, system::error_code* ec=0);
BOOST_FILESYSTEM_DECL
void copy_symlink(const path& existing_symlink, const path& new_symlink, system::error_code* ec=0);
BOOST_FILESYSTEM_DECL
@@ -366,7 +405,8 @@ namespace boost
BOOST_FILESYSTEM_DECL
path read_symlink(const path& p, system::error_code* ec=0);
BOOST_FILESYSTEM_DECL
- // For standardization, if the committee doesn't like "remove", consider "eliminate"
+ path relative(const path& p, const path& base, system::error_code* ec = 0);
+ BOOST_FILESYSTEM_DECL
bool remove(const path& p, system::error_code* ec=0);
BOOST_FILESYSTEM_DECL
boost::uintmax_t remove_all(const path& p, system::error_code* ec=0);
@@ -382,7 +422,9 @@ namespace boost
path temp_directory_path(system::error_code* ec=0);
BOOST_FILESYSTEM_DECL
path unique_path(const path& p, system::error_code* ec=0);
- } // namespace detail
+ BOOST_FILESYSTEM_DECL
+ path weakly_canonical(const path& p, system::error_code* ec = 0);
+ } // namespace detail
//--------------------------------------------------------------------------------------//
// //
@@ -482,13 +524,13 @@ namespace boost
void copy(const path& from, const path& to) {detail::copy(from, to);}
inline
- void copy(const path& from, const path& to, system::error_code& ec)
+ void copy(const path& from, const path& to, system::error_code& ec) BOOST_NOEXCEPT
{detail::copy(from, to, &ec);}
inline
void copy_directory(const path& from, const path& to)
{detail::copy_directory(from, to);}
inline
- void copy_directory(const path& from, const path& to, system::error_code& ec)
+ void copy_directory(const path& from, const path& to, system::error_code& ec) BOOST_NOEXCEPT
{detail::copy_directory(from, to, &ec);}
inline
void copy_file(const path& from, const path& to, // See ticket #2925
@@ -503,12 +545,12 @@ namespace boost
}
inline
void copy_file(const path& from, const path& to, // See ticket #2925
- BOOST_SCOPED_ENUM(copy_option) option, system::error_code& ec)
+ BOOST_SCOPED_ENUM(copy_option) option, system::error_code& ec) BOOST_NOEXCEPT
{
detail::copy_file(from, to, static_cast<detail::copy_option>(option), &ec);
}
inline
- void copy_file(const path& from, const path& to, system::error_code& ec)
+ void copy_file(const path& from, const path& to, system::error_code& ec) BOOST_NOEXCEPT
{
detail::copy_file(from, to, detail::fail_if_exists, &ec);
}
@@ -517,67 +559,68 @@ namespace boost
const path& new_symlink) {detail::copy_symlink(existing_symlink, new_symlink);}
inline
- void copy_symlink(const path& existing_symlink, const path& new_symlink, system::error_code& ec)
+ void copy_symlink(const path& existing_symlink, const path& new_symlink,
+ system::error_code& ec) BOOST_NOEXCEPT
{detail::copy_symlink(existing_symlink, new_symlink, &ec);}
inline
bool create_directories(const path& p) {return detail::create_directories(p);}
inline
- bool create_directories(const path& p, system::error_code& ec)
+ bool create_directories(const path& p, system::error_code& ec) BOOST_NOEXCEPT
{return detail::create_directories(p, &ec);}
inline
bool create_directory(const path& p) {return detail::create_directory(p);}
inline
- bool create_directory(const path& p, system::error_code& ec)
+ bool create_directory(const path& p, system::error_code& ec) BOOST_NOEXCEPT
{return detail::create_directory(p, &ec);}
inline
void create_directory_symlink(const path& to, const path& from)
{detail::create_directory_symlink(to, from);}
inline
- void create_directory_symlink(const path& to, const path& from, system::error_code& ec)
+ void create_directory_symlink(const path& to, const path& from, system::error_code& ec) BOOST_NOEXCEPT
{detail::create_directory_symlink(to, from, &ec);}
inline
void create_hard_link(const path& to, const path& new_hard_link) {detail::create_hard_link(to, new_hard_link);}
inline
- void create_hard_link(const path& to, const path& new_hard_link, system::error_code& ec)
+ void create_hard_link(const path& to, const path& new_hard_link, system::error_code& ec) BOOST_NOEXCEPT
{detail::create_hard_link(to, new_hard_link, &ec);}
inline
void create_symlink(const path& to, const path& new_symlink) {detail::create_symlink(to, new_symlink);}
inline
- void create_symlink(const path& to, const path& new_symlink, system::error_code& ec)
+ void create_symlink(const path& to, const path& new_symlink, system::error_code& ec) BOOST_NOEXCEPT
{detail::create_symlink(to, new_symlink, &ec);}
inline
path current_path() {return detail::current_path();}
inline
- path current_path(system::error_code& ec) {return detail::current_path(&ec);}
+ path current_path(system::error_code& ec) BOOST_NOEXCEPT {return detail::current_path(&ec);}
inline
void current_path(const path& p) {detail::current_path(p);}
inline
- void current_path(const path& p, system::error_code& ec) {detail::current_path(p, &ec);}
+ void current_path(const path& p, system::error_code& ec) BOOST_NOEXCEPT {detail::current_path(p, &ec);}
inline
bool equivalent(const path& p1, const path& p2) {return detail::equivalent(p1, p2);}
inline
- bool equivalent(const path& p1, const path& p2, system::error_code& ec)
+ bool equivalent(const path& p1, const path& p2, system::error_code& ec) BOOST_NOEXCEPT
{return detail::equivalent(p1, p2, &ec);}
inline
boost::uintmax_t file_size(const path& p) {return detail::file_size(p);}
inline
- boost::uintmax_t file_size(const path& p, system::error_code& ec)
+ boost::uintmax_t file_size(const path& p, system::error_code& ec) BOOST_NOEXCEPT
{return detail::file_size(p, &ec);}
inline
boost::uintmax_t hard_link_count(const path& p) {return detail::hard_link_count(p);}
inline
- boost::uintmax_t hard_link_count(const path& p, system::error_code& ec)
+ boost::uintmax_t hard_link_count(const path& p, system::error_code& ec) BOOST_NOEXCEPT
{return detail::hard_link_count(p, &ec);}
inline
path initial_path() {return detail::initial_path();}
@@ -594,19 +637,20 @@ namespace boost
std::time_t last_write_time(const path& p) {return detail::last_write_time(p);}
inline
- std::time_t last_write_time(const path& p, system::error_code& ec)
+ std::time_t last_write_time(const path& p, system::error_code& ec) BOOST_NOEXCEPT
{return detail::last_write_time(p, &ec);}
inline
void last_write_time(const path& p, const std::time_t new_time)
{detail::last_write_time(p, new_time);}
inline
- void last_write_time(const path& p, const std::time_t new_time, system::error_code& ec)
+ void last_write_time(const path& p, const std::time_t new_time,
+ system::error_code& ec) BOOST_NOEXCEPT
{detail::last_write_time(p, new_time, &ec);}
inline
void permissions(const path& p, perms prms)
{detail::permissions(p, prms);}
inline
- void permissions(const path& p, perms prms, system::error_code& ec)
+ void permissions(const path& p, perms prms, system::error_code& ec) BOOST_NOEXCEPT
{detail::permissions(p, prms, &ec);}
inline
@@ -620,31 +664,42 @@ namespace boost
bool remove(const path& p) {return detail::remove(p);}
inline
- bool remove(const path& p, system::error_code& ec) {return detail::remove(p, &ec);}
+ bool remove(const path& p, system::error_code& ec) BOOST_NOEXCEPT
+ {return detail::remove(p, &ec);}
inline
boost::uintmax_t remove_all(const path& p) {return detail::remove_all(p);}
inline
- boost::uintmax_t remove_all(const path& p, system::error_code& ec)
+ boost::uintmax_t remove_all(const path& p, system::error_code& ec) BOOST_NOEXCEPT
{return detail::remove_all(p, &ec);}
inline
void rename(const path& old_p, const path& new_p) {detail::rename(old_p, new_p);}
inline
- void rename(const path& old_p, const path& new_p, system::error_code& ec)
+ void rename(const path& old_p, const path& new_p, system::error_code& ec) BOOST_NOEXCEPT
{detail::rename(old_p, new_p, &ec);}
inline // name suggested by Scott McMurray
void resize_file(const path& p, uintmax_t size) {detail::resize_file(p, size);}
inline
- void resize_file(const path& p, uintmax_t size, system::error_code& ec)
+ void resize_file(const path& p, uintmax_t size, system::error_code& ec) BOOST_NOEXCEPT
{detail::resize_file(p, size, &ec);}
inline
+ path relative(const path& p, const path& base=current_path())
+ {return detail::relative(p, base);}
+ inline
+ path relative(const path& p, system::error_code& ec)
+ {return detail::relative(p, current_path(), &ec);}
+ inline
+ path relative(const path& p, const path& base, system::error_code& ec)
+ {return detail::relative(p, base, &ec);}
+ inline
space_info space(const path& p) {return detail::space(p);}
inline
- space_info space(const path& p, system::error_code& ec) {return detail::space(p, &ec);}
+ space_info space(const path& p, system::error_code& ec) BOOST_NOEXCEPT
+ {return detail::space(p, &ec);}
# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
inline bool symbolic_link_exists(const path& p)
@@ -665,10 +720,16 @@ namespace boost
{return detail::temp_directory_path(&ec);}
inline
path unique_path(const path& p="%%%%-%%%%-%%%%-%%%%")
- { return detail::unique_path(p); }
+ {return detail::unique_path(p);}
inline
path unique_path(const path& p, system::error_code& ec)
- { return detail::unique_path(p, &ec); }
+ {return detail::unique_path(p, &ec);}
+ inline
+ path weakly_canonical(const path& p) {return detail::weakly_canonical(p);}
+
+ inline
+ path weakly_canonical(const path& p, system::error_code& ec)
+ {return detail::weakly_canonical(p, &ec);}
//--------------------------------------------------------------------------------------//
// //
@@ -683,14 +744,46 @@ namespace boost
class BOOST_FILESYSTEM_DECL directory_entry
{
public:
+ typedef boost::filesystem::path::value_type value_type; // enables class path ctor taking directory_entry
- // compiler generated copy constructor, copy assignment, and destructor apply
-
- directory_entry() {}
- explicit directory_entry(const boost::filesystem::path& p,
- file_status st = file_status(), file_status symlink_st=file_status())
- : m_path(p), m_status(st), m_symlink_status(symlink_st)
+ directory_entry() BOOST_NOEXCEPT {}
+ explicit directory_entry(const boost::filesystem::path& p)
+ : m_path(p), m_status(file_status()), m_symlink_status(file_status())
{}
+ directory_entry(const boost::filesystem::path& p,
+ file_status st, file_status symlink_st = file_status())
+ : m_path(p), m_status(st), m_symlink_status(symlink_st) {}
+
+ directory_entry(const directory_entry& rhs)
+ : m_path(rhs.m_path), m_status(rhs.m_status), m_symlink_status(rhs.m_symlink_status){}
+
+ directory_entry& operator=(const directory_entry& rhs)
+ {
+ m_path = rhs.m_path;
+ m_status = rhs.m_status;
+ m_symlink_status = rhs.m_symlink_status;
+ return *this;
+ }
+
+ // As of October 2015 the interaction between noexcept and =default is so troublesome
+ // for VC++, GCC, and probably other compilers, that =default is not used with noexcept
+ // functions. GCC is not even consistent for the same release on different platforms.
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ directory_entry(directory_entry&& rhs) BOOST_NOEXCEPT
+ {
+ m_path = std::move(rhs.m_path);
+ m_status = std::move(rhs.m_status);
+ m_symlink_status = std::move(rhs.m_symlink_status);
+ }
+ directory_entry& operator=(directory_entry&& rhs) BOOST_NOEXCEPT
+ {
+ m_path = std::move(rhs.m_path);
+ m_status = std::move(rhs.m_status);
+ m_symlink_status = std::move(rhs.m_symlink_status);
+ return *this;
+ }
+#endif
void assign(const boost::filesystem::path& p,
file_status st = file_status(), file_status symlink_st = file_status())
@@ -711,18 +804,22 @@ public:
{ replace_filename(p, st, symlink_st); }
# endif
- const boost::filesystem::path& path() const {return m_path;}
- file_status status() const {return m_get_status();}
- file_status status(system::error_code& ec) const {return m_get_status(&ec);}
- file_status symlink_status() const {return m_get_symlink_status();}
- file_status symlink_status(system::error_code& ec) const {return m_get_symlink_status(&ec);}
-
- bool operator==(const directory_entry& rhs) {return m_path == rhs.m_path;}
- bool operator!=(const directory_entry& rhs) {return m_path != rhs.m_path;}
- bool operator< (const directory_entry& rhs) {return m_path < rhs.m_path;}
- bool operator<=(const directory_entry& rhs) {return m_path <= rhs.m_path;}
- bool operator> (const directory_entry& rhs) {return m_path > rhs.m_path;}
- bool operator>=(const directory_entry& rhs) {return m_path >= rhs.m_path;}
+ const boost::filesystem::path& path() const BOOST_NOEXCEPT {return m_path;}
+ operator const boost::filesystem::path&() const BOOST_NOEXCEPT
+ {return m_path;}
+ file_status status() const {return m_get_status();}
+ file_status status(system::error_code& ec) const BOOST_NOEXCEPT
+ {return m_get_status(&ec); }
+ file_status symlink_status() const {return m_get_symlink_status();}
+ file_status symlink_status(system::error_code& ec) const BOOST_NOEXCEPT
+ {return m_get_symlink_status(&ec); }
+
+ bool operator==(const directory_entry& rhs) const BOOST_NOEXCEPT {return m_path == rhs.m_path; }
+ bool operator!=(const directory_entry& rhs) const BOOST_NOEXCEPT {return m_path != rhs.m_path;}
+ bool operator< (const directory_entry& rhs) const BOOST_NOEXCEPT {return m_path < rhs.m_path;}
+ bool operator<=(const directory_entry& rhs) const BOOST_NOEXCEPT {return m_path <= rhs.m_path;}
+ bool operator> (const directory_entry& rhs) const BOOST_NOEXCEPT {return m_path > rhs.m_path;}
+ bool operator>=(const directory_entry& rhs) const BOOST_NOEXCEPT {return m_path >= rhs.m_path;}
private:
boost::filesystem::path m_path;
@@ -797,7 +894,7 @@ namespace detail
{
public:
- directory_iterator(){} // creates the "end" iterator
+ directory_iterator() BOOST_NOEXCEPT {} // creates the "end" iterator
// iterator_facade derived classes don't seem to like implementations in
// separate translation unit dll's, so forward to detail functions
@@ -805,13 +902,13 @@ namespace detail
: m_imp(new detail::dir_itr_imp)
{ detail::directory_iterator_construct(*this, p, 0); }
- directory_iterator(const path& p, system::error_code& ec)
+ directory_iterator(const path& p, system::error_code& ec) BOOST_NOEXCEPT
: m_imp(new detail::dir_itr_imp)
{ detail::directory_iterator_construct(*this, p, &ec); }
- ~directory_iterator() {} // never throws
+ ~directory_iterator() {}
- directory_iterator& increment(system::error_code& ec)
+ directory_iterator& increment(system::error_code& ec) BOOST_NOEXCEPT
{
detail::directory_iterator_increment(*this, &ec);
return *this;
@@ -852,18 +949,23 @@ namespace detail
// auto - thus the top-level const is stripped - so returning const is harmless and
// emphasizes begin() is just a pass through.
inline
- const directory_iterator& begin(const directory_iterator& iter) {return iter;}
+ const directory_iterator& begin(const directory_iterator& iter) BOOST_NOEXCEPT
+ {return iter;}
inline
- directory_iterator end(const directory_iterator&) {return directory_iterator();}
+ directory_iterator end(const directory_iterator&) BOOST_NOEXCEPT
+ {return directory_iterator();}
// enable directory_iterator BOOST_FOREACH -----------------------------------------//
inline
- directory_iterator& range_begin(directory_iterator& iter) {return iter;}
+ directory_iterator& range_begin(directory_iterator& iter) BOOST_NOEXCEPT
+ {return iter;}
inline
- directory_iterator range_begin(const directory_iterator& iter) {return iter;}
+ directory_iterator range_begin(const directory_iterator& iter) BOOST_NOEXCEPT
+ {return iter;}
inline
- directory_iterator range_end(const directory_iterator&) {return directory_iterator();}
+ directory_iterator range_end(const directory_iterator&) BOOST_NOEXCEPT
+ {return directory_iterator();}
} // namespace filesystem
// namespace boost template specializations
@@ -1041,10 +1143,19 @@ namespace filesystem
{
public:
- recursive_directory_iterator(){} // creates the "end" iterator
+ recursive_directory_iterator() BOOST_NOEXCEPT {} // creates the "end" iterator
+
+ explicit recursive_directory_iterator(const path& dir_path) // throws if !exists()
+ : m_imp(new detail::recur_dir_itr_imp)
+ {
+ m_imp->m_options = symlink_option::none;
+ m_imp->m_stack.push(directory_iterator(dir_path));
+ if (m_imp->m_stack.top() == directory_iterator())
+ { m_imp.reset(); }
+ }
- explicit recursive_directory_iterator(const path& dir_path,
- BOOST_SCOPED_ENUM(symlink_option) opt = symlink_option::none)
+ recursive_directory_iterator(const path& dir_path,
+ BOOST_SCOPED_ENUM(symlink_option) opt) // throws if !exists()
: m_imp(new detail::recur_dir_itr_imp)
{
m_imp->m_options = opt;
@@ -1055,7 +1166,7 @@ namespace filesystem
recursive_directory_iterator(const path& dir_path,
BOOST_SCOPED_ENUM(symlink_option) opt,
- system::error_code & ec)
+ system::error_code & ec) BOOST_NOEXCEPT
: m_imp(new detail::recur_dir_itr_imp)
{
m_imp->m_options = opt;
@@ -1065,7 +1176,7 @@ namespace filesystem
}
recursive_directory_iterator(const path& dir_path,
- system::error_code & ec)
+ system::error_code & ec) BOOST_NOEXCEPT
: m_imp(new detail::recur_dir_itr_imp)
{
m_imp->m_options = symlink_option::none;
@@ -1074,7 +1185,7 @@ namespace filesystem
{ m_imp.reset (); }
}
- recursive_directory_iterator& increment(system::error_code& ec)
+ recursive_directory_iterator& increment(system::error_code& ec) BOOST_NOEXCEPT
{
BOOST_ASSERT_MSG(m_imp.get(),
"increment() on end recursive_directory_iterator");
@@ -1084,23 +1195,27 @@ namespace filesystem
return *this;
}
- int level() const
+ int depth() const BOOST_NOEXCEPT
{
BOOST_ASSERT_MSG(m_imp.get(),
- "level() on end recursive_directory_iterator");
+ "depth() on end recursive_directory_iterator");
return m_imp->m_level;
}
+
+ int level() const BOOST_NOEXCEPT { return depth(); }
- bool no_push_pending() const
+ bool recursion_pending() const BOOST_NOEXCEPT
{
BOOST_ASSERT_MSG(m_imp.get(),
"is_no_push_requested() on end recursive_directory_iterator");
return (m_imp->m_options & symlink_option::_detail_no_push)
== symlink_option::_detail_no_push;
}
+
+ bool no_push_pending() const BOOST_NOEXCEPT { return recursion_pending(); }
# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
- bool no_push_request() const { return no_push_pending(); }
+ bool no_push_request() const BOOST_NOEXCEPT { return no_push_pending(); }
# endif
void pop()
@@ -1111,7 +1226,7 @@ namespace filesystem
if (m_imp->m_stack.empty()) m_imp.reset(); // done, so make end iterator
}
- void no_push(bool value=true)
+ void disable_recursion_pending(bool value=true) BOOST_NOEXCEPT
{
BOOST_ASSERT_MSG(m_imp.get(),
"no_push() on end recursive_directory_iterator");
@@ -1120,6 +1235,8 @@ namespace filesystem
else
m_imp->m_options &= ~symlink_option::_detail_no_push;
}
+
+ void no_push(bool value=true) BOOST_NOEXCEPT { disable_recursion_pending(value); }
file_status status() const
{
@@ -1174,22 +1291,25 @@ namespace filesystem
// auto - thus the top-level const is stripped - so returning const is harmless and
// emphasizes begin() is just a pass through.
inline
- const recursive_directory_iterator& begin(const recursive_directory_iterator& iter)
- {return iter;}
+ const recursive_directory_iterator&
+ begin(const recursive_directory_iterator& iter) BOOST_NOEXCEPT
+ {return iter;}
inline
- recursive_directory_iterator end(const recursive_directory_iterator&)
+ recursive_directory_iterator end(const recursive_directory_iterator&) BOOST_NOEXCEPT
{return recursive_directory_iterator();}
// enable recursive directory iterator BOOST_FOREACH -------------------------------//
inline
- recursive_directory_iterator& range_begin(recursive_directory_iterator& iter)
- {return iter;}
+ recursive_directory_iterator&
+ range_begin(recursive_directory_iterator& iter) BOOST_NOEXCEPT
+ {return iter;}
inline
- recursive_directory_iterator range_begin(const recursive_directory_iterator& iter)
- {return iter;}
+ recursive_directory_iterator
+ range_begin(const recursive_directory_iterator& iter) BOOST_NOEXCEPT
+ {return iter;}
inline
- recursive_directory_iterator range_end(const recursive_directory_iterator&)
+ recursive_directory_iterator range_end(const recursive_directory_iterator&) BOOST_NOEXCEPT
{return recursive_directory_iterator();}
} // namespace filesystem
diff --git a/boost/filesystem/path.hpp b/boost/filesystem/path.hpp
index 7ae4d2fd0d..af5bfcc8c2 100644
--- a/boost/filesystem/path.hpp
+++ b/boost/filesystem/path.hpp
@@ -46,6 +46,7 @@ namespace boost
{
namespace filesystem
{
+
//------------------------------------------------------------------------------------//
// //
// class path //
@@ -128,8 +129,7 @@ namespace filesystem
// ----- constructors -----
- path(){}
-
+ path() BOOST_NOEXCEPT {}
path(const path& p) : m_pathname(p.m_pathname) {}
template <class Source>
@@ -145,6 +145,16 @@ namespace filesystem
path(const string_type& s) : m_pathname(s) {}
path(string_type& s) : m_pathname(s) {}
+ // As of October 2015 the interaction between noexcept and =default is so troublesome
+ // for VC++, GCC, and probably other compilers, that =default is not used with noexcept
+ // functions. GCC is not even consistent for the same release on different platforms.
+
+# if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ path(path&& p) BOOST_NOEXCEPT { m_pathname = std::move(p.m_pathname); }
+ path& operator=(path&& p) BOOST_NOEXCEPT
+ { m_pathname = std::move(p.m_pathname); return *this; }
+# endif
+
template <class Source>
path(Source const& source, const codecvt_type& cvt)
{
@@ -351,7 +361,7 @@ namespace filesystem
// ----- modifiers -----
- void clear() { m_pathname.clear(); }
+ void clear() BOOST_NOEXCEPT { m_pathname.clear(); }
path& make_preferred()
# ifdef BOOST_POSIX_API
{ return *this; } // POSIX no effect
@@ -361,7 +371,7 @@ namespace filesystem
path& remove_filename();
path& remove_trailing_separator();
path& replace_extension(const path& new_extension = path());
- void swap(path& rhs) { m_pathname.swap(rhs.m_pathname); }
+ void swap(path& rhs) BOOST_NOEXCEPT { m_pathname.swap(rhs.m_pathname); }
// ----- observers -----
@@ -384,8 +394,9 @@ namespace filesystem
// ----- native format observers -----
- const string_type& native() const { return m_pathname; } // Throws: nothing
- const value_type* c_str() const { return m_pathname.c_str(); } // Throws: nothing
+ const string_type& native() const BOOST_NOEXCEPT { return m_pathname; }
+ const value_type* c_str() const BOOST_NOEXCEPT { return m_pathname.c_str(); }
+ string_type::size_type size() const BOOST_NOEXCEPT { return m_pathname.size(); }
template <class String>
String string() const;
@@ -441,6 +452,21 @@ namespace filesystem
// ----- generic format observers -----
+ // Experimental generic function returning generic formatted path (i.e. separators
+ // are forward slashes). Motivation: simpler than a family of generic_*string
+ // functions.
+ path generic() const
+ {
+# ifdef BOOST_WINDOWS_API
+ path tmp;
+ std::replace_copy(m_pathname.begin(), m_pathname.end(),
+ std::back_inserter(tmp.m_pathname), L'\\', L'/');
+ return tmp;
+# else
+ return path(*this);
+# endif
+ }
+
template <class String>
String generic_string() const;
@@ -482,7 +508,7 @@ namespace filesystem
// ----- query -----
- bool empty() const { return m_pathname.empty(); } // name consistent with std containers
+ bool empty() const BOOST_NOEXCEPT{ return m_pathname.empty(); }
bool has_root_path() const { return has_root_directory() || has_root_name(); }
bool has_root_name() const { return !root_name().empty(); }
bool has_root_directory() const { return !root_directory().empty(); }
@@ -491,6 +517,7 @@ namespace filesystem
bool has_filename() const { return !m_pathname.empty(); }
bool has_stem() const { return !stem().empty(); }
bool has_extension() const { return !extension().empty(); }
+ bool is_relative() const { return !is_absolute(); }
bool is_absolute() const
{
# ifdef BOOST_WINDOWS_API
@@ -499,20 +526,33 @@ namespace filesystem
return has_root_directory();
# endif
}
- bool is_relative() const { return !is_absolute(); }
+
+ // ----- lexical operations -----
+
+ path lexically_normal() const;
+ path lexically_relative(const path& base) const;
+ path lexically_proximate(const path& base) const
+ {
+ path tmp(lexically_relative(base));
+ return tmp.empty() ? *this : tmp;
+ }
// ----- iterators -----
class iterator;
typedef iterator const_iterator;
+ class reverse_iterator;
+ typedef reverse_iterator const_reverse_iterator;
iterator begin() const;
iterator end() const;
+ reverse_iterator rbegin() const;
+ reverse_iterator rend() const;
// ----- static member functions -----
- static std::locale imbue(const std::locale& loc);
- static const codecvt_type& codecvt();
+ static std::locale imbue(const std::locale& loc);
+ static const codecvt_type& codecvt();
// ----- deprecated functions -----
@@ -522,7 +562,11 @@ namespace filesystem
# if !defined(BOOST_FILESYSTEM_NO_DEPRECATED)
// recently deprecated functions supplied by default
- path& normalize() { return m_normalize(); }
+ path& normalize() {
+ path tmp(lexically_normal());
+ m_pathname.swap(tmp.m_pathname);
+ return *this;
+ }
path& remove_leaf() { return remove_filename(); }
path leaf() const { return filename(); }
path branch_path() const { return parent_path(); }
@@ -557,6 +601,7 @@ namespace filesystem
//--------------------------------------------------------------------------------------//
private:
+
# if defined(_MSC_VER)
# pragma warning(push) // Save warning settings
# pragma warning(disable : 4251) // disable warning: class 'std::basic_string<_Elem,_Traits,_Ax>'
@@ -623,6 +668,7 @@ namespace filesystem
private:
friend class boost::iterator_core_access;
friend class boost::filesystem::path;
+ friend class boost::filesystem::path::reverse_iterator;
friend void m_path_iterator_increment(path::iterator & it);
friend void m_path_iterator_decrement(path::iterator & it);
@@ -649,6 +695,53 @@ namespace filesystem
}; // path::iterator
//------------------------------------------------------------------------------------//
+ // class path::reverse_iterator //
+ //------------------------------------------------------------------------------------//
+
+ class path::reverse_iterator
+ : public boost::iterator_facade<
+ path::reverse_iterator,
+ path const,
+ boost::bidirectional_traversal_tag >
+ {
+ public:
+
+ explicit reverse_iterator(iterator itr) : m_itr(itr)
+ {
+ if (itr != itr.m_path_ptr->begin())
+ m_element = *--itr;
+ }
+ private:
+ friend class boost::iterator_core_access;
+ friend class boost::filesystem::path;
+
+ const path& dereference() const { return m_element; }
+ bool equal(const reverse_iterator& rhs) const { return m_itr == rhs.m_itr; }
+ void increment()
+ {
+ --m_itr;
+ if (m_itr != m_itr.m_path_ptr->begin())
+ {
+ iterator tmp = m_itr;
+ m_element = *--tmp;
+ }
+ }
+ void decrement()
+ {
+ m_element = *m_itr;
+ ++m_itr;
+ }
+
+ iterator m_itr;
+ path m_element;
+
+ }; // path::reverse_iterator
+
+ inline path::reverse_iterator path::rbegin() const { return reverse_iterator(end()); }
+ inline path::reverse_iterator path::rend() const { return reverse_iterator(begin()); }
+
+
+ //------------------------------------------------------------------------------------//
// //
// non-member functions //
// //
diff --git a/boost/filesystem/string_file.hpp b/boost/filesystem/string_file.hpp
new file mode 100644
index 0000000000..015f659080
--- /dev/null
+++ b/boost/filesystem/string_file.hpp
@@ -0,0 +1,43 @@
+// filesystem/string_file.hpp --------------------------------------------------------//
+
+// Copyright Beman Dawes 2015
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+// Library home page: http://www.boost.org/libs/filesystem
+
+#ifndef BOOST_FILESYSTEM_STRING_FILE_HPP
+#define BOOST_FILESYSTEM_STRING_FILE_HPP
+
+#include <string>
+#include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem/operations.hpp>
+
+namespace boost
+{
+namespace filesystem
+{
+inline
+void save_string_file(const path& p, const std::string& str)
+{
+ ofstream file;
+ file.exceptions(std::ofstream::failbit | std::ofstream::badbit);
+ file.open(p, std::ios_base::binary);
+ file.write(str.c_str(), str.size());
+}
+
+inline
+void load_string_file(const path& p, std::string& str)
+{
+ ifstream file;
+ file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
+ file.open(p, std::ios_base::binary);
+ std::size_t sz = static_cast<std::size_t>(file_size(p));
+ str.resize(sz, '\0');
+ file.read(&str[0], sz);
+}
+} // namespace filesystem
+} // namespace boost
+
+#endif // include guard
diff --git a/boost/flyweight/assoc_container_factory.hpp b/boost/flyweight/assoc_container_factory.hpp
index 96deee3ee9..9b35b16ab6 100644
--- a/boost/flyweight/assoc_container_factory.hpp
+++ b/boost/flyweight/assoc_container_factory.hpp
@@ -1,4 +1,4 @@
-/* Copyright 2006-2014 Joaquin M Lopez Munoz.
+/* Copyright 2006-2015 Joaquin M Lopez Munoz.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
@@ -27,8 +27,8 @@
#endif
namespace boost{namespace flyweights{namespace detail{
-BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(iterator);
-BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(value_type);
+BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(iterator)
+BOOST_FLYWEIGHT_NESTED_XXX_IF_NOT_PLACEHOLDER_EXPRESSION_DEF(value_type)
}}} /* namespace boost::flyweights::detail */
/* Factory class using a given associative container.
diff --git a/boost/flyweight/flyweight.hpp b/boost/flyweight/flyweight.hpp
index 1fb2009fcf..0895850182 100644
--- a/boost/flyweight/flyweight.hpp
+++ b/boost/flyweight/flyweight.hpp
@@ -1,6 +1,6 @@
/* Flyweight class.
*
- * Copyright 2006-2014 Joaquin M Lopez Munoz.
+ * Copyright 2006-2015 Joaquin M Lopez Munoz.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
@@ -445,8 +445,10 @@ BOOST_TEMPLATED_STREAM(istream,ElemType,Traits)& operator>>(
namespace std{
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)>
-struct hash<boost::flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> >
+BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD
+hash<boost::flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> >
{
+public:
typedef std::size_t result_type;
typedef boost::flyweight<
T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> argument_type;
diff --git a/boost/flyweight/flyweight_fwd.hpp b/boost/flyweight/flyweight_fwd.hpp
index 81e2aef97d..73fbf678cc 100644
--- a/boost/flyweight/flyweight_fwd.hpp
+++ b/boost/flyweight/flyweight_fwd.hpp
@@ -1,4 +1,4 @@
-/* Copyright 2006-2014 Joaquin M Lopez Munoz.
+/* Copyright 2006-2015 Joaquin M Lopez Munoz.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
@@ -15,6 +15,7 @@
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
#include <boost/detail/templated_streams.hpp>
+#include <boost/detail/workaround.hpp>
#include <boost/parameter/parameters.hpp>
#include <boost/preprocessor/punctuation/comma.hpp>
#include <iosfwd>
@@ -167,9 +168,16 @@ using flyweights::flyweight;
#if !defined(BOOST_FLYWEIGHT_DISABLE_HASH_SUPPORT)
#if !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
+#if BOOST_WORKAROUND(_CPPLIB_VER,==520)
+/* Dinkumware 5.20 defines std::hash as class rather than struct */
+#define BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD class
+#else
+#define BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD struct
+#endif
+
#if !defined(_LIBCPP_VERSION)
namespace std{
-template <class T> struct hash;
+template <class T> BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD hash;
}
#else
/* As discussed in http://lists.boost.org/Archives/boost/2011/02/177218.php */
@@ -179,7 +187,8 @@ template <class T> struct hash;
namespace std{
template<typename T,BOOST_FLYWEIGHT_TYPENAME_TEMPL_ARGS(_)>
-struct hash<boost::flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> >;
+BOOST_FLYWEIGHT_STD_HASH_STRUCT_KEYWORD
+hash<boost::flyweight<T,BOOST_FLYWEIGHT_TEMPL_ARGS(_)> >;
} /* namespace std */
#endif /* !defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) */
diff --git a/boost/flyweight/serialize.hpp b/boost/flyweight/serialize.hpp
index c222670415..73a1f4e45c 100644
--- a/boost/flyweight/serialize.hpp
+++ b/boost/flyweight/serialize.hpp
@@ -1,4 +1,4 @@
-/* Copyright 2006-2014 Joaquin M Lopez Munoz.
+/* Copyright 2006-2015 Joaquin M Lopez Munoz.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
@@ -46,7 +46,7 @@ template<
>
void save(
Archive& ar,const ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3>& f,
- const unsigned int version)
+ const unsigned int /*version*/)
{
typedef ::boost::flyweights::flyweight<T,Arg1,Arg2,Arg3> flyweight;
typedef ::boost::flyweights::detail::save_helper<flyweight> helper;
diff --git a/boost/format/feed_args.hpp b/boost/format/feed_args.hpp
index 95bbe5e252..fa45d215d8 100644
--- a/boost/format/feed_args.hpp
+++ b/boost/format/feed_args.hpp
@@ -172,6 +172,10 @@ namespace detail {
typedef typename string_type::size_type size_type;
basic_oaltstringstream<Ch, Tr, Alloc> oss( &buf);
+
+ if(loc_p != NULL)
+ oss.imbue(*loc_p);
+
specs.fmtstate_.apply_on(oss, loc_p);
// the stream format state can be modified by manipulators in the argument :
diff --git a/boost/functional/hash/hash.hpp b/boost/functional/hash/hash.hpp
index 3e5ab5bcf9..2fb9f21116 100644
--- a/boost/functional/hash/hash.hpp
+++ b/boost/functional/hash/hash.hpp
@@ -411,7 +411,7 @@ namespace boost
// passed by copy.
//
// BOOST_HASH_SPECIALIZE_REF - define a specialization for a type which is
- // passed by copy.
+ // passed by const reference.
//
// These are undefined later.
diff --git a/boost/fusion/algorithm/iteration/accumulate.hpp b/boost/fusion/algorithm/iteration/accumulate.hpp
index fe7112e323..7d524a15c2 100644
--- a/boost/fusion/algorithm/iteration/accumulate.hpp
+++ b/boost/fusion/algorithm/iteration/accumulate.hpp
@@ -1,5 +1,6 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -10,8 +11,6 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/algorithm/iteration/accumulate_fwd.hpp>
#include <boost/fusion/algorithm/iteration/fold.hpp>
-#include <boost/fusion/support/is_sequence.hpp>
-#include <boost/utility/enable_if.hpp>
namespace boost { namespace fusion
{
@@ -27,11 +26,7 @@ namespace boost { namespace fusion
template <typename Sequence, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- inline typename
- lazy_enable_if<
- traits::is_sequence<Sequence>
- , result_of::accumulate<Sequence, State const, F>
- >::type
+ inline typename result_of::accumulate<Sequence, State const, F>::type
accumulate(Sequence& seq, State const& state, F f)
{
return fusion::fold(seq, state, f);
@@ -39,11 +34,7 @@ namespace boost { namespace fusion
template <typename Sequence, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- inline typename
- lazy_enable_if<
- traits::is_sequence<Sequence>
- , result_of::accumulate<Sequence const, State const, F>
- >::type
+ inline typename result_of::accumulate<Sequence const, State const, F>::type
accumulate(Sequence const& seq, State const& state, F f)
{
return fusion::fold(seq, state, f);
diff --git a/boost/fusion/algorithm/iteration/accumulate_fwd.hpp b/boost/fusion/algorithm/iteration/accumulate_fwd.hpp
index 50c4d39d4e..f00e67f966 100644
--- a/boost/fusion/algorithm/iteration/accumulate_fwd.hpp
+++ b/boost/fusion/algorithm/iteration/accumulate_fwd.hpp
@@ -1,5 +1,6 @@
/*=============================================================================
Copyright (c) 2011 Eric Niebler
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,8 +9,6 @@
#define BOOST_FUSION_ACCUMULATE_FWD_HPP_INCLUDED
#include <boost/fusion/support/config.hpp>
-#include <boost/fusion/support/is_sequence.hpp>
-#include <boost/utility/enable_if.hpp>
namespace boost { namespace fusion
{
@@ -21,20 +20,12 @@ namespace boost { namespace fusion
template <typename Sequence, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- inline typename
- lazy_enable_if<
- traits::is_sequence<Sequence>
- , result_of::accumulate<Sequence, State const, F>
- >::type
+ inline typename result_of::accumulate<Sequence, State const, F>::type
accumulate(Sequence& seq, State const& state, F f);
template <typename Sequence, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- inline typename
- lazy_enable_if<
- traits::is_sequence<Sequence>
- , result_of::accumulate<Sequence const, State const, F>
- >::type
+ inline typename result_of::accumulate<Sequence const, State const, F>::type
accumulate(Sequence const& seq, State const& state, F f);
}}
diff --git a/boost/fusion/algorithm/iteration/detail/fold.hpp b/boost/fusion/algorithm/iteration/detail/fold.hpp
index 1813bd247a..4c82b80029 100644
--- a/boost/fusion/algorithm/iteration/detail/fold.hpp
+++ b/boost/fusion/algorithm/iteration/detail/fold.hpp
@@ -2,12 +2,15 @@
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden
Copyright (c) 2009-2010 Christopher Schmidt
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#include <boost/preprocessor/cat.hpp>
+#define FUSION_HASH #
+
#ifdef BOOST_FUSION_REVERSE_FOLD
# ifdef BOOST_FUSION_ITER_FOLD
# define BOOST_FUSION_FOLD_NAME reverse_iter_fold
@@ -41,378 +44,193 @@
# define BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(IT) fusion::deref(IT)
#endif
+#if (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+FUSION_HASH if BOOST_WORKAROUND BOOST_PREVENT_MACRO_SUBSTITUTION (BOOST_MSVC, < 1500)
+FUSION_HASH define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
+FUSION_HASH else
+FUSION_HASH define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
+FUSION_HASH endif
+#else
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1500)
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
+# else
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
+# endif
+#endif
+
namespace boost { namespace fusion
{
namespace detail
{
- template<typename State, typename It, typename F>
- struct BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)
- : fusion::detail::result_of_with_decltype<
- F(
- typename add_reference<typename add_const<State>::type>::type,
- BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(It))
- >
+ template<int SeqSize, typename It, typename State, typename F, typename = void
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH if BOOST_WORKAROUND BOOST_PREVENT_MACRO_SUBSTITUTION (BOOST_MSVC, < 1500)
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1500) || \
+ (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+ // Dirty hack: those compilers cannot choose exactly one partial specialization.
+ , bool = SeqSize == 0
+#endif
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH endif
+#endif
+ >
+ struct BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)
{};
- template<typename Result,int N>
- struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)
- {
- template<typename State3, typename It3, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_3(State3 const& state3,It3 const& it3,F& f)
- {
- return BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<
- Result
- , N-4
- >::call(
- f(state3,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it3)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it3),
- f);
- }
-
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return call_3(
- f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it2),
- f);
- }
-
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1),
- f);
- }
-
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0),
- f);
- }
- };
-
- template<typename Result>
- struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,3>
- {
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2));
- }
-
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1),
- f);
- }
-
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0),
- f);
- }
- };
-
- template<typename Result>
- struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,2>
- {
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1));
- }
-
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)),
- fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0),
- f);
- }
- };
-
- template<typename Result>
- struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,1>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return f(state,
- BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0));
- }
- };
-
- template<typename Result>
- struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,0>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const&, F)
- {
- return static_cast<Result>(state);
- }
- };
-
- template<typename StateRef, typename It0, typename F, int N>
- struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)
- {
- typedef typename
- BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
- It0 const
- >::type
- it1;
- typedef typename
- BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- rest1
- , it1
- , F
- >::type
- rest2;
- typedef typename
- result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<it1>::type
- it2;
- typedef typename
- BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- rest2
- , it2
- , F
- >::type
- rest3;
- typedef typename
- result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<it2>::type
- it3;
-
- typedef typename
- BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)<
- typename BOOST_PP_CAT(
- BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- rest3
- , it3
- , F
- >::type
- , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
- it3
- >::type
- , F
- , N-4
- >::type
- type;
- };
-
- template<typename StateRef, typename It0, typename F>
- struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)<
- StateRef
- , It0
- , F
- , 3
- >
+ template<typename It, typename State, typename F>
+ struct BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)<0,It,State,F
+ , typename boost::enable_if_has_type<BOOST_FUSION_FOLD_IMPL_ENABLER(State)>::type
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH if BOOST_WORKAROUND BOOST_PREVENT_MACRO_SUBSTITUTION (BOOST_MSVC, < 1500)
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1500) || \
+ (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+ , true
+#endif
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH endif
+#endif
+ >
{
- typedef typename
- BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
- It0 const
- >::type
- it1;
-
- typedef typename
- BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- typename BOOST_PP_CAT(
- BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- rest1
- , it1
- , F
- >::type
- , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
- it1 const
- >::type const
- , F
- >::type
- type;
+ typedef typename State::type type;
};
- template<typename StateRef, typename It0, typename F>
- struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)<
- StateRef
- , It0
- , F
- , 2
- >
- : BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- StateRef
- , It0 const
- , F
- >::type
- , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
- It0 const
- >::type const
+ template<int SeqSize, typename It, typename State, typename F>
+ struct BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)<SeqSize,It,State,F
+ , typename boost::enable_if_has_type<
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH if BOOST_WORKAROUND BOOST_PREVENT_MACRO_SUBSTITUTION (BOOST_MSVC, >= 1500)
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1500) || \
+ (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+ // Following SFINAE enables to avoid MSVC 9's partial specialization
+ // ambiguous bug but MSVC 8 don't compile, and moreover MSVC 8 style
+ // workaround won't work with MSVC 9.
+ typename boost::disable_if_c<SeqSize == 0, State>::type::type
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH else
+ BOOST_FUSION_FOLD_IMPL_ENABLER(State)
+#endif
+#else
+ BOOST_FUSION_FOLD_IMPL_ENABLER(State)
+#endif
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH endif
+#endif
+ >::type
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH if BOOST_WORKAROUND BOOST_PREVENT_MACRO_SUBSTITUTION (BOOST_MSVC, < 1500)
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1500) || \
+ (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+ , false
+#endif
+#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
+FUSION_HASH endif
+#endif
+ >
+ : BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)<
+ SeqSize-1
+ , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(It const)
+ )
+ >
, F
>
{};
- template<typename StateRef, typename It0, typename F>
- struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)<
- StateRef
- , It0
+ template<typename It, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)<
+ 0
+ , It
+ , State
, F
- , 1
- >
- : BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<
- StateRef
- , It0 const
+ >::type
+ BOOST_PP_CAT(it_,BOOST_FUSION_FOLD_NAME)(mpl::int_<0>, It const&, typename State::type state, F&)
+ {
+ return state;
+ }
+
+ template<typename It, typename State, typename F, int SeqSize>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename lazy_enable_if_c<
+ SeqSize != 0
+ , BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)<
+ SeqSize
+ , It
+ , State
, F
>
- {};
-
- template<typename StateRef, typename It0, typename F>
- struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)<
- StateRef
- , It0
- , F
- , 0
- >
- {
- typedef StateRef type;
- };
-
- template<typename StateRef, typename It0, typename F, int SeqSize>
- struct BOOST_PP_CAT(result_of_first_unrolled,BOOST_FUSION_FOLD_NAME)
- {
- typedef typename
- BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)<
- typename fusion::detail::result_of_with_decltype<
- F(
- StateRef,
- BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(
- It0 const)
- )
- >::type
- , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
- It0 const
- >::type
- , F
- , SeqSize-1
- >::type
- type;
- };
-
- template<int SeqSize, typename StateRef, typename Seq, typename F>
- struct BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME,_impl)
+ >::type
+ BOOST_PP_CAT(it_,BOOST_FUSION_FOLD_NAME)(mpl::int_<SeqSize>, It const& it, typename State::type state, F& f)
{
- typedef typename
- BOOST_PP_CAT(
- result_of_first_unrolled,BOOST_FUSION_FOLD_NAME)<
- StateRef
- , BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM(
- typename result_of::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION<Seq>::type
+ return BOOST_PP_CAT(it_,BOOST_FUSION_FOLD_NAME)<
+ typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(It const)
)
- , F
- , SeqSize
- >::type
- type;
-
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static type
- call(StateRef state, Seq& seq, F f)
- {
- typedef
- BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<
- type
- , SeqSize
- >
- unrolled_impl;
-
- return unrolled_impl::call(
- state,
- BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM(
- fusion::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION(seq)),
- f);
- }
- };
-
- template<typename StateRef, typename Seq, typename F>
- struct BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME,_impl)<0,StateRef,Seq,F>
- {
- typedef StateRef type;
-
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static StateRef
- call(StateRef state, Seq&, F)
- {
- return static_cast<StateRef>(state);
- }
- };
+ >
+ , F
+ >(
+ mpl::int_<SeqSize-1>()
+ , fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it)
+ , f(state, BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it))
+ , f
+ );
+ }
+
+ template<typename Seq, typename State, typename F
+ , bool = traits::is_sequence<Seq>::value
+ , bool = traits::is_segmented<Seq>::value>
+ struct BOOST_PP_CAT(result_of_,BOOST_FUSION_FOLD_NAME)
+ {};
- template<typename Seq, typename State, typename F, bool IsSegmented>
- struct BOOST_PP_CAT(result_of_, BOOST_FUSION_FOLD_NAME)
- : BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME,_impl)<
+ template<typename Seq, typename State, typename F>
+ struct BOOST_PP_CAT(result_of_,BOOST_FUSION_FOLD_NAME)<Seq, State, F, true, false>
+ : BOOST_PP_CAT(result_of_it_,BOOST_FUSION_FOLD_NAME)<
result_of::size<Seq>::value
- , typename add_reference<
- typename add_const<State>::type
- >::type
- , Seq
+ , BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM(
+ typename result_of::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION<Seq>::type
+ )
+ , add_reference<State>
, F
>
{};
+
+ template<typename Seq, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename BOOST_PP_CAT(result_of_,BOOST_FUSION_FOLD_NAME)<Seq, State, F>::type
+ BOOST_FUSION_FOLD_NAME(Seq& seq, State& state, F& f)
+ {
+ return BOOST_PP_CAT(it_,BOOST_FUSION_FOLD_NAME)<
+ BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM(
+ typename result_of::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION<Seq>::type
+ )
+ , add_reference<State>
+ , F
+ >(
+ typename result_of::size<Seq>::type()
+ , BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM(
+ fusion::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION(seq)
+ )
+ , state
+ , f
+ );
+ }
}
namespace result_of
{
template<typename Seq, typename State, typename F>
struct BOOST_FUSION_FOLD_NAME
- : detail::BOOST_PP_CAT(result_of_, BOOST_FUSION_FOLD_NAME)<
- Seq
- , State
- , F
- , traits::is_segmented<Seq>::type::value
- >
+ : detail::BOOST_PP_CAT(result_of_,BOOST_FUSION_FOLD_NAME)<Seq, State, F>
{};
}
@@ -425,10 +243,7 @@ namespace boost { namespace fusion
>::type
BOOST_FUSION_FOLD_NAME(Seq& seq, State const& state, F f)
{
- return result_of::BOOST_FUSION_FOLD_NAME<Seq,State const,F>::call(
- state,
- seq,
- f);
+ return detail::BOOST_FUSION_FOLD_NAME<Seq, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
@@ -440,47 +255,40 @@ namespace boost { namespace fusion
>::type
BOOST_FUSION_FOLD_NAME(Seq const& seq, State const& state, F f)
{
- return result_of::BOOST_FUSION_FOLD_NAME<Seq const,State const,F>::call(
- state,
- seq,
- f);
+ return detail::BOOST_FUSION_FOLD_NAME<Seq const, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::BOOST_FUSION_FOLD_NAME<
Seq
- , State const
+ , State
, F
>::type
BOOST_FUSION_FOLD_NAME(Seq& seq, State& state, F f)
{
- return result_of::BOOST_FUSION_FOLD_NAME<Seq,State,F>::call(
- state,
- seq,
- f);
+ return detail::BOOST_FUSION_FOLD_NAME<Seq, State, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::BOOST_FUSION_FOLD_NAME<
Seq const
- , State const
+ , State
, F
>::type
BOOST_FUSION_FOLD_NAME(Seq const& seq, State& state, F f)
{
- return result_of::BOOST_FUSION_FOLD_NAME<Seq const,State,F>::call(
- state,
- seq,
- f);
+ return detail::BOOST_FUSION_FOLD_NAME<Seq const, State, F>(seq, state, f);
}
}}
#undef BOOST_FUSION_FOLD_NAME
+#undef BOOST_FUSION_FOLD_IMPL_ENABLER
#undef BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION
#undef BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION
#undef BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM
#undef BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM
#undef BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM
#undef BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM
+#undef FUSION_HASH
diff --git a/boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp b/boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp
index bd3b1dbdac..c23ba16c28 100644
--- a/boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp
+++ b/boost/fusion/algorithm/iteration/detail/preprocessed/fold.hpp
@@ -8,345 +8,138 @@
This is an auto-generated file. Do not edit!
==============================================================================*/
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
+# else
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
+# endif
namespace boost { namespace fusion
{
namespace detail
{
- template<typename State, typename It, typename F>
- struct fold_lvalue_state
- : fusion::detail::result_of_with_decltype<
- F(
- typename add_reference<typename add_const<State>::type>::type,
- typename fusion::result_of::deref<It>::type)
- >
- {};
- template<typename Result,int N>
- struct unrolled_fold
- {
- template<typename State3, typename It3, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_3(State3 const& state3,It3 const& it3,F& f)
- {
- return unrolled_fold<
- Result
- , N-4
- >::call(
- f(state3,fusion::deref(it3)),
- fusion::next(it3),
- f);
- }
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return call_3(
- f(state2,fusion::deref(it2)),
- fusion::next(it2),
- f);
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,fusion::deref(it1)),
- fusion::next(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,fusion::deref(it0)),
- fusion::next(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_fold<Result,3>
- {
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return f(state2,fusion::deref(it2));
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,fusion::deref(it1)),
- fusion::next(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,fusion::deref(it0)),
- fusion::next(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_fold<Result,2>
- {
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return f(state1,fusion::deref(it1));
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,fusion::deref(it0)),
- fusion::next(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_fold<Result,1>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return f(state,
- fusion::deref(it0));
- }
- };
- template<typename Result>
- struct unrolled_fold<Result,0>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const&, F)
- {
- return static_cast<Result>(state);
- }
- };
- template<typename StateRef, typename It0, typename F, int N>
- struct result_of_unrolled_fold
- {
- typedef typename
- fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::next<
- It0 const
- >::type
- it1;
- typedef typename
- fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- rest2;
- typedef typename
- result_of::next<it1>::type
- it2;
- typedef typename
- fold_lvalue_state<
- rest2
- , it2
- , F
- >::type
- rest3;
- typedef typename
- result_of::next<it2>::type
- it3;
- typedef typename
- result_of_unrolled_fold<
- typename fold_lvalue_state<
- rest3
- , it3
- , F
- >::type
- , typename result_of::next<
- it3
- >::type
- , F
- , N-4
- >::type
- type;
- };
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_fold<
- StateRef
- , It0
- , F
- , 3
+ template<int SeqSize, typename It, typename State, typename F, typename = void
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+
+ , bool = SeqSize == 0
+# endif
>
+ struct result_of_it_fold
+ {};
+ template<typename It, typename State, typename F>
+ struct result_of_it_fold<0,It,State,F
+ , typename boost::enable_if_has_type<BOOST_FUSION_FOLD_IMPL_ENABLER(State)>::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , true
+# endif
+ >
{
- typedef typename
- fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::next<
- It0 const
- >::type
- it1;
- typedef typename
- fold_lvalue_state<
- typename fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- , typename result_of::next<
- it1 const
- >::type const
- , F
- >::type
- type;
+ typedef typename State::type type;
};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_fold<
- StateRef
- , It0
- , F
- , 2
- >
- : fold_lvalue_state<
- typename fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- , typename result_of::next<
- It0 const
- >::type const
+ template<int SeqSize, typename It, typename State, typename F>
+ struct result_of_it_fold<SeqSize,It,State,F
+ , typename boost::enable_if_has_type<
+# if BOOST_WORKAROUND (BOOST_MSVC, >= 1500)
+
+
+
+ typename boost::disable_if_c<SeqSize == 0, State>::type::type
+# else
+ BOOST_FUSION_FOLD_IMPL_ENABLER(State)
+# endif
+ >::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , false
+# endif
+ >
+ : result_of_it_fold<
+ SeqSize-1
+ , typename result_of::next<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ typename fusion::result_of::deref<It const>::type
+ )
+ >
, F
>
{};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_fold<
- StateRef
- , It0
+ template<typename It, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_it_fold<
+ 0
+ , It
+ , State
, F
- , 1
- >
- : fold_lvalue_state<
- StateRef
- , It0 const
+ >::type
+ it_fold(mpl::int_<0>, It const&, typename State::type state, F&)
+ {
+ return state;
+ }
+ template<typename It, typename State, typename F, int SeqSize>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename lazy_enable_if_c<
+ SeqSize != 0
+ , result_of_it_fold<
+ SeqSize
+ , It
+ , State
, F
>
- {};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_fold<
- StateRef
- , It0
- , F
- , 0
- >
+ >::type
+ it_fold(mpl::int_<SeqSize>, It const& it, typename State::type state, F& f)
{
- typedef StateRef type;
- };
- template<typename StateRef, typename It0, typename F, int SeqSize>
- struct result_of_first_unrolledfold
- {
- typedef typename
- result_of_unrolled_fold<
- typename fusion::detail::result_of_with_decltype<
- F(
- StateRef,
- typename fusion::result_of::deref< It0 const>::type
- )
- >::type
- , typename result_of::next<
- It0 const
- >::type
- , F
- , SeqSize-1
- >::type
- type;
- };
- template<int SeqSize, typename StateRef, typename Seq, typename F>
- struct fold_impl
- {
- typedef typename
- result_of_first_unrolledfold<
- StateRef
- , typename result_of::begin<Seq>::type
- , F
- , SeqSize
- >::type
- type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static type
- call(StateRef state, Seq& seq, F f)
- {
- typedef
- unrolled_fold<
- type
- , SeqSize
- >
- unrolled_impl;
- return unrolled_impl::call(
- state,
- fusion::begin(seq),
- f);
- }
- };
- template<typename StateRef, typename Seq, typename F>
- struct fold_impl<0,StateRef,Seq,F>
- {
- typedef StateRef type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static StateRef
- call(StateRef state, Seq&, F)
- {
- return static_cast<StateRef>(state);
- }
- };
- template<typename Seq, typename State, typename F, bool IsSegmented>
+ return it_fold<
+ typename result_of::next<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ typename fusion::result_of::deref<It const>::type
+ )
+ >
+ , F
+ >(
+ mpl::int_<SeqSize-1>()
+ , fusion::next(it)
+ , f(state, fusion::deref(it))
+ , f
+ );
+ }
+ template<typename Seq, typename State, typename F
+ , bool = traits::is_sequence<Seq>::value
+ , bool = traits::is_segmented<Seq>::value>
struct result_of_fold
- : fold_impl<
+ {};
+ template<typename Seq, typename State, typename F>
+ struct result_of_fold<Seq, State, F, true, false>
+ : result_of_it_fold<
result_of::size<Seq>::value
- , typename add_reference<
- typename add_const<State>::type
- >::type
- , Seq
+ , typename result_of::begin<Seq>::type
+ , add_reference<State>
, F
>
{};
+ template<typename Seq, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_fold<Seq, State, F>::type
+ fold(Seq& seq, State& state, F& f)
+ {
+ return it_fold<
+ typename result_of::begin<Seq>::type
+ , add_reference<State>
+ , F
+ >(
+ typename result_of::size<Seq>::type()
+ , fusion::begin(seq)
+ , state
+ , f
+ );
+ }
}
namespace result_of
{
template<typename Seq, typename State, typename F>
struct fold
- : detail::result_of_fold<
- Seq
- , State
- , F
- , traits::is_segmented<Seq>::type::value
- >
+ : detail::result_of_fold<Seq, State, F>
{};
}
template<typename Seq, typename State, typename F>
@@ -358,10 +151,7 @@ namespace boost { namespace fusion
>::type
fold(Seq& seq, State const& state, F f)
{
- return result_of::fold<Seq,State const,F>::call(
- state,
- seq,
- f);
+ return detail::fold<Seq, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@@ -372,37 +162,28 @@ namespace boost { namespace fusion
>::type
fold(Seq const& seq, State const& state, F f)
{
- return result_of::fold<Seq const,State const,F>::call(
- state,
- seq,
- f);
+ return detail::fold<Seq const, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::fold<
Seq
- , State const
+ , State
, F
>::type
fold(Seq& seq, State& state, F f)
{
- return result_of::fold<Seq,State,F>::call(
- state,
- seq,
- f);
+ return detail::fold<Seq, State, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::fold<
Seq const
- , State const
+ , State
, F
>::type
fold(Seq const& seq, State& state, F f)
{
- return result_of::fold<Seq const,State,F>::call(
- state,
- seq,
- f);
+ return detail::fold<Seq const, State, F>(seq, state, f);
}
}}
diff --git a/boost/fusion/algorithm/iteration/detail/preprocessed/iter_fold.hpp b/boost/fusion/algorithm/iteration/detail/preprocessed/iter_fold.hpp
index 1d294a8722..d49a868568 100644
--- a/boost/fusion/algorithm/iteration/detail/preprocessed/iter_fold.hpp
+++ b/boost/fusion/algorithm/iteration/detail/preprocessed/iter_fold.hpp
@@ -7,345 +7,138 @@
This is an auto-generated file. Do not edit!
==============================================================================*/
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
+# else
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
+# endif
namespace boost { namespace fusion
{
namespace detail
{
- template<typename State, typename It, typename F>
- struct iter_fold_lvalue_state
- : fusion::detail::result_of_with_decltype<
- F(
- typename add_reference<typename add_const<State>::type>::type,
- It&)
- >
- {};
- template<typename Result,int N>
- struct unrolled_iter_fold
- {
- template<typename State3, typename It3, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_3(State3 const& state3,It3 const& it3,F& f)
- {
- return unrolled_iter_fold<
- Result
- , N-4
- >::call(
- f(state3,it3),
- fusion::next(it3),
- f);
- }
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return call_3(
- f(state2,it2),
- fusion::next(it2),
- f);
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,it1),
- fusion::next(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,it0),
- fusion::next(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_iter_fold<Result,3>
- {
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return f(state2,it2);
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,it1),
- fusion::next(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,it0),
- fusion::next(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_iter_fold<Result,2>
- {
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return f(state1,it1);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,it0),
- fusion::next(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_iter_fold<Result,1>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return f(state,
- it0);
- }
- };
- template<typename Result>
- struct unrolled_iter_fold<Result,0>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const&, F)
- {
- return static_cast<Result>(state);
- }
- };
- template<typename StateRef, typename It0, typename F, int N>
- struct result_of_unrolled_iter_fold
- {
- typedef typename
- iter_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::next<
- It0 const
- >::type
- it1;
- typedef typename
- iter_fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- rest2;
- typedef typename
- result_of::next<it1>::type
- it2;
- typedef typename
- iter_fold_lvalue_state<
- rest2
- , it2
- , F
- >::type
- rest3;
- typedef typename
- result_of::next<it2>::type
- it3;
- typedef typename
- result_of_unrolled_iter_fold<
- typename iter_fold_lvalue_state<
- rest3
- , it3
- , F
- >::type
- , typename result_of::next<
- it3
- >::type
- , F
- , N-4
- >::type
- type;
- };
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_iter_fold<
- StateRef
- , It0
- , F
- , 3
+ template<int SeqSize, typename It, typename State, typename F, typename = void
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+
+ , bool = SeqSize == 0
+# endif
>
+ struct result_of_it_iter_fold
+ {};
+ template<typename It, typename State, typename F>
+ struct result_of_it_iter_fold<0,It,State,F
+ , typename boost::enable_if_has_type<BOOST_FUSION_FOLD_IMPL_ENABLER(State)>::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , true
+# endif
+ >
{
- typedef typename
- iter_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::next<
- It0 const
- >::type
- it1;
- typedef typename
- iter_fold_lvalue_state<
- typename iter_fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- , typename result_of::next<
- it1 const
- >::type const
- , F
- >::type
- type;
+ typedef typename State::type type;
};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_iter_fold<
- StateRef
- , It0
- , F
- , 2
- >
- : iter_fold_lvalue_state<
- typename iter_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- , typename result_of::next<
- It0 const
- >::type const
+ template<int SeqSize, typename It, typename State, typename F>
+ struct result_of_it_iter_fold<SeqSize,It,State,F
+ , typename boost::enable_if_has_type<
+# if BOOST_WORKAROUND (BOOST_MSVC, >= 1500)
+
+
+
+ typename boost::disable_if_c<SeqSize == 0, State>::type::type
+# else
+ BOOST_FUSION_FOLD_IMPL_ENABLER(State)
+# endif
+ >::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , false
+# endif
+ >
+ : result_of_it_iter_fold<
+ SeqSize-1
+ , typename result_of::next<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ It const&
+ )
+ >
, F
>
{};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_iter_fold<
- StateRef
- , It0
+ template<typename It, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_it_iter_fold<
+ 0
+ , It
+ , State
, F
- , 1
- >
- : iter_fold_lvalue_state<
- StateRef
- , It0 const
+ >::type
+ it_iter_fold(mpl::int_<0>, It const&, typename State::type state, F&)
+ {
+ return state;
+ }
+ template<typename It, typename State, typename F, int SeqSize>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename lazy_enable_if_c<
+ SeqSize != 0
+ , result_of_it_iter_fold<
+ SeqSize
+ , It
+ , State
, F
>
- {};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_iter_fold<
- StateRef
- , It0
- , F
- , 0
- >
+ >::type
+ it_iter_fold(mpl::int_<SeqSize>, It const& it, typename State::type state, F& f)
{
- typedef StateRef type;
- };
- template<typename StateRef, typename It0, typename F, int SeqSize>
- struct result_of_first_unrollediter_fold
- {
- typedef typename
- result_of_unrolled_iter_fold<
- typename fusion::detail::result_of_with_decltype<
- F(
- StateRef,
- It0 const&
- )
- >::type
- , typename result_of::next<
- It0 const
- >::type
- , F
- , SeqSize-1
- >::type
- type;
- };
- template<int SeqSize, typename StateRef, typename Seq, typename F>
- struct iter_fold_impl
- {
- typedef typename
- result_of_first_unrollediter_fold<
- StateRef
- , typename result_of::begin<Seq>::type
- , F
- , SeqSize
- >::type
- type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static type
- call(StateRef state, Seq& seq, F f)
- {
- typedef
- unrolled_iter_fold<
- type
- , SeqSize
- >
- unrolled_impl;
- return unrolled_impl::call(
- state,
- fusion::begin(seq),
- f);
- }
- };
- template<typename StateRef, typename Seq, typename F>
- struct iter_fold_impl<0,StateRef,Seq,F>
- {
- typedef StateRef type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static StateRef
- call(StateRef state, Seq&, F)
- {
- return static_cast<StateRef>(state);
- }
- };
- template<typename Seq, typename State, typename F, bool IsSegmented>
+ return it_iter_fold<
+ typename result_of::next<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ It const&
+ )
+ >
+ , F
+ >(
+ mpl::int_<SeqSize-1>()
+ , fusion::next(it)
+ , f(state, it)
+ , f
+ );
+ }
+ template<typename Seq, typename State, typename F
+ , bool = traits::is_sequence<Seq>::value
+ , bool = traits::is_segmented<Seq>::value>
struct result_of_iter_fold
- : iter_fold_impl<
+ {};
+ template<typename Seq, typename State, typename F>
+ struct result_of_iter_fold<Seq, State, F, true, false>
+ : result_of_it_iter_fold<
result_of::size<Seq>::value
- , typename add_reference<
- typename add_const<State>::type
- >::type
- , Seq
+ , typename result_of::begin<Seq>::type
+ , add_reference<State>
, F
>
{};
+ template<typename Seq, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_iter_fold<Seq, State, F>::type
+ iter_fold(Seq& seq, State& state, F& f)
+ {
+ return it_iter_fold<
+ typename result_of::begin<Seq>::type
+ , add_reference<State>
+ , F
+ >(
+ typename result_of::size<Seq>::type()
+ , fusion::begin(seq)
+ , state
+ , f
+ );
+ }
}
namespace result_of
{
template<typename Seq, typename State, typename F>
struct iter_fold
- : detail::result_of_iter_fold<
- Seq
- , State
- , F
- , traits::is_segmented<Seq>::type::value
- >
+ : detail::result_of_iter_fold<Seq, State, F>
{};
}
template<typename Seq, typename State, typename F>
@@ -357,10 +150,7 @@ namespace boost { namespace fusion
>::type
iter_fold(Seq& seq, State const& state, F f)
{
- return result_of::iter_fold<Seq,State const,F>::call(
- state,
- seq,
- f);
+ return detail::iter_fold<Seq, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@@ -371,37 +161,28 @@ namespace boost { namespace fusion
>::type
iter_fold(Seq const& seq, State const& state, F f)
{
- return result_of::iter_fold<Seq const,State const,F>::call(
- state,
- seq,
- f);
+ return detail::iter_fold<Seq const, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::iter_fold<
Seq
- , State const
+ , State
, F
>::type
iter_fold(Seq& seq, State& state, F f)
{
- return result_of::iter_fold<Seq,State,F>::call(
- state,
- seq,
- f);
+ return detail::iter_fold<Seq, State, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::iter_fold<
Seq const
- , State const
+ , State
, F
>::type
iter_fold(Seq const& seq, State& state, F f)
{
- return result_of::iter_fold<Seq const,State,F>::call(
- state,
- seq,
- f);
+ return detail::iter_fold<Seq const, State, F>(seq, state, f);
}
}}
diff --git a/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_fold.hpp b/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_fold.hpp
index 947897821a..4b3b3b1e09 100644
--- a/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_fold.hpp
+++ b/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_fold.hpp
@@ -7,345 +7,138 @@
This is an auto-generated file. Do not edit!
==============================================================================*/
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
+# else
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
+# endif
namespace boost { namespace fusion
{
namespace detail
{
- template<typename State, typename It, typename F>
- struct reverse_fold_lvalue_state
- : fusion::detail::result_of_with_decltype<
- F(
- typename add_reference<typename add_const<State>::type>::type,
- typename fusion::result_of::deref<It>::type)
- >
- {};
- template<typename Result,int N>
- struct unrolled_reverse_fold
- {
- template<typename State3, typename It3, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_3(State3 const& state3,It3 const& it3,F& f)
- {
- return unrolled_reverse_fold<
- Result
- , N-4
- >::call(
- f(state3,fusion::deref(it3)),
- fusion::prior(it3),
- f);
- }
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return call_3(
- f(state2,fusion::deref(it2)),
- fusion::prior(it2),
- f);
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,fusion::deref(it1)),
- fusion::prior(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,fusion::deref(it0)),
- fusion::prior(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_reverse_fold<Result,3>
- {
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return f(state2,fusion::deref(it2));
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,fusion::deref(it1)),
- fusion::prior(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,fusion::deref(it0)),
- fusion::prior(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_reverse_fold<Result,2>
- {
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return f(state1,fusion::deref(it1));
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,fusion::deref(it0)),
- fusion::prior(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_reverse_fold<Result,1>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return f(state,
- fusion::deref(it0));
- }
- };
- template<typename Result>
- struct unrolled_reverse_fold<Result,0>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const&, F)
- {
- return static_cast<Result>(state);
- }
- };
- template<typename StateRef, typename It0, typename F, int N>
- struct result_of_unrolled_reverse_fold
- {
- typedef typename
- reverse_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::prior<
- It0 const
- >::type
- it1;
- typedef typename
- reverse_fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- rest2;
- typedef typename
- result_of::prior<it1>::type
- it2;
- typedef typename
- reverse_fold_lvalue_state<
- rest2
- , it2
- , F
- >::type
- rest3;
- typedef typename
- result_of::prior<it2>::type
- it3;
- typedef typename
- result_of_unrolled_reverse_fold<
- typename reverse_fold_lvalue_state<
- rest3
- , it3
- , F
- >::type
- , typename result_of::prior<
- it3
- >::type
- , F
- , N-4
- >::type
- type;
- };
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_fold<
- StateRef
- , It0
- , F
- , 3
+ template<int SeqSize, typename It, typename State, typename F, typename = void
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+
+ , bool = SeqSize == 0
+# endif
>
+ struct result_of_it_reverse_fold
+ {};
+ template<typename It, typename State, typename F>
+ struct result_of_it_reverse_fold<0,It,State,F
+ , typename boost::enable_if_has_type<BOOST_FUSION_FOLD_IMPL_ENABLER(State)>::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , true
+# endif
+ >
{
- typedef typename
- reverse_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::prior<
- It0 const
- >::type
- it1;
- typedef typename
- reverse_fold_lvalue_state<
- typename reverse_fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- , typename result_of::prior<
- it1 const
- >::type const
- , F
- >::type
- type;
+ typedef typename State::type type;
};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_fold<
- StateRef
- , It0
- , F
- , 2
- >
- : reverse_fold_lvalue_state<
- typename reverse_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- , typename result_of::prior<
- It0 const
- >::type const
+ template<int SeqSize, typename It, typename State, typename F>
+ struct result_of_it_reverse_fold<SeqSize,It,State,F
+ , typename boost::enable_if_has_type<
+# if BOOST_WORKAROUND (BOOST_MSVC, >= 1500)
+
+
+
+ typename boost::disable_if_c<SeqSize == 0, State>::type::type
+# else
+ BOOST_FUSION_FOLD_IMPL_ENABLER(State)
+# endif
+ >::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , false
+# endif
+ >
+ : result_of_it_reverse_fold<
+ SeqSize-1
+ , typename result_of::prior<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ typename fusion::result_of::deref<It const>::type
+ )
+ >
, F
>
{};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_fold<
- StateRef
- , It0
+ template<typename It, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_it_reverse_fold<
+ 0
+ , It
+ , State
, F
- , 1
- >
- : reverse_fold_lvalue_state<
- StateRef
- , It0 const
+ >::type
+ it_reverse_fold(mpl::int_<0>, It const&, typename State::type state, F&)
+ {
+ return state;
+ }
+ template<typename It, typename State, typename F, int SeqSize>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename lazy_enable_if_c<
+ SeqSize != 0
+ , result_of_it_reverse_fold<
+ SeqSize
+ , It
+ , State
, F
>
- {};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_fold<
- StateRef
- , It0
- , F
- , 0
- >
+ >::type
+ it_reverse_fold(mpl::int_<SeqSize>, It const& it, typename State::type state, F& f)
{
- typedef StateRef type;
- };
- template<typename StateRef, typename It0, typename F, int SeqSize>
- struct result_of_first_unrolledreverse_fold
- {
- typedef typename
- result_of_unrolled_reverse_fold<
- typename fusion::detail::result_of_with_decltype<
- F(
- StateRef,
- typename fusion::result_of::deref< It0 const>::type
- )
- >::type
- , typename result_of::prior<
- It0 const
- >::type
- , F
- , SeqSize-1
- >::type
- type;
- };
- template<int SeqSize, typename StateRef, typename Seq, typename F>
- struct reverse_fold_impl
- {
- typedef typename
- result_of_first_unrolledreverse_fold<
- StateRef
- , typename fusion::result_of::prior< typename result_of::end<Seq>::type >::type
- , F
- , SeqSize
- >::type
- type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static type
- call(StateRef state, Seq& seq, F f)
- {
- typedef
- unrolled_reverse_fold<
- type
- , SeqSize
- >
- unrolled_impl;
- return unrolled_impl::call(
- state,
- fusion::prior( fusion::end(seq)),
- f);
- }
- };
- template<typename StateRef, typename Seq, typename F>
- struct reverse_fold_impl<0,StateRef,Seq,F>
- {
- typedef StateRef type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static StateRef
- call(StateRef state, Seq&, F)
- {
- return static_cast<StateRef>(state);
- }
- };
- template<typename Seq, typename State, typename F, bool IsSegmented>
+ return it_reverse_fold<
+ typename result_of::prior<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ typename fusion::result_of::deref<It const>::type
+ )
+ >
+ , F
+ >(
+ mpl::int_<SeqSize-1>()
+ , fusion::prior(it)
+ , f(state, fusion::deref(it))
+ , f
+ );
+ }
+ template<typename Seq, typename State, typename F
+ , bool = traits::is_sequence<Seq>::value
+ , bool = traits::is_segmented<Seq>::value>
struct result_of_reverse_fold
- : reverse_fold_impl<
+ {};
+ template<typename Seq, typename State, typename F>
+ struct result_of_reverse_fold<Seq, State, F, true, false>
+ : result_of_it_reverse_fold<
result_of::size<Seq>::value
- , typename add_reference<
- typename add_const<State>::type
- >::type
- , Seq
+ , typename fusion::result_of::prior< typename result_of::end<Seq>::type >::type
+ , add_reference<State>
, F
>
{};
+ template<typename Seq, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_reverse_fold<Seq, State, F>::type
+ reverse_fold(Seq& seq, State& state, F& f)
+ {
+ return it_reverse_fold<
+ typename fusion::result_of::prior< typename result_of::end<Seq>::type >::type
+ , add_reference<State>
+ , F
+ >(
+ typename result_of::size<Seq>::type()
+ , fusion::prior( fusion::end(seq) )
+ , state
+ , f
+ );
+ }
}
namespace result_of
{
template<typename Seq, typename State, typename F>
struct reverse_fold
- : detail::result_of_reverse_fold<
- Seq
- , State
- , F
- , traits::is_segmented<Seq>::type::value
- >
+ : detail::result_of_reverse_fold<Seq, State, F>
{};
}
template<typename Seq, typename State, typename F>
@@ -357,10 +150,7 @@ namespace boost { namespace fusion
>::type
reverse_fold(Seq& seq, State const& state, F f)
{
- return result_of::reverse_fold<Seq,State const,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_fold<Seq, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@@ -371,37 +161,28 @@ namespace boost { namespace fusion
>::type
reverse_fold(Seq const& seq, State const& state, F f)
{
- return result_of::reverse_fold<Seq const,State const,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_fold<Seq const, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_fold<
Seq
- , State const
+ , State
, F
>::type
reverse_fold(Seq& seq, State& state, F f)
{
- return result_of::reverse_fold<Seq,State,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_fold<Seq, State, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_fold<
Seq const
- , State const
+ , State
, F
>::type
reverse_fold(Seq const& seq, State& state, F f)
{
- return result_of::reverse_fold<Seq const,State,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_fold<Seq const, State, F>(seq, state, f);
}
}}
diff --git a/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_iter_fold.hpp b/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_iter_fold.hpp
index bf1edca53d..10bd9c7d3b 100644
--- a/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_iter_fold.hpp
+++ b/boost/fusion/algorithm/iteration/detail/preprocessed/reverse_iter_fold.hpp
@@ -7,345 +7,138 @@
This is an auto-generated file. Do not edit!
==============================================================================*/
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) void
+# else
+# define BOOST_FUSION_FOLD_IMPL_ENABLER(T) typename T::type
+# endif
namespace boost { namespace fusion
{
namespace detail
{
- template<typename State, typename It, typename F>
- struct reverse_iter_fold_lvalue_state
- : fusion::detail::result_of_with_decltype<
- F(
- typename add_reference<typename add_const<State>::type>::type,
- It&)
- >
- {};
- template<typename Result,int N>
- struct unrolled_reverse_iter_fold
- {
- template<typename State3, typename It3, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_3(State3 const& state3,It3 const& it3,F& f)
- {
- return unrolled_reverse_iter_fold<
- Result
- , N-4
- >::call(
- f(state3,it3),
- fusion::prior(it3),
- f);
- }
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return call_3(
- f(state2,it2),
- fusion::prior(it2),
- f);
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,it1),
- fusion::prior(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,it0),
- fusion::prior(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_reverse_iter_fold<Result,3>
- {
- template<typename State2, typename It2, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_2(State2 const& state2,It2 const& it2,F& f)
- {
- return f(state2,it2);
- }
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return call_2(
- f(state1,it1),
- fusion::prior(it1),
- f);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,it0),
- fusion::prior(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_reverse_iter_fold<Result,2>
- {
- template<typename State1, typename It1, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call_1(State1 const& state1,It1 const& it1,F& f)
- {
- return f(state1,it1);
- }
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return call_1(
- f(state,it0),
- fusion::prior(it0),
- f);
- }
- };
- template<typename Result>
- struct unrolled_reverse_iter_fold<Result,1>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const& it0,F f)
- {
- return f(state,
- it0);
- }
- };
- template<typename Result>
- struct unrolled_reverse_iter_fold<Result,0>
- {
- template<typename State, typename It0, typename F>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static Result
- call(State const& state,It0 const&, F)
- {
- return static_cast<Result>(state);
- }
- };
- template<typename StateRef, typename It0, typename F, int N>
- struct result_of_unrolled_reverse_iter_fold
- {
- typedef typename
- reverse_iter_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::prior<
- It0 const
- >::type
- it1;
- typedef typename
- reverse_iter_fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- rest2;
- typedef typename
- result_of::prior<it1>::type
- it2;
- typedef typename
- reverse_iter_fold_lvalue_state<
- rest2
- , it2
- , F
- >::type
- rest3;
- typedef typename
- result_of::prior<it2>::type
- it3;
- typedef typename
- result_of_unrolled_reverse_iter_fold<
- typename reverse_iter_fold_lvalue_state<
- rest3
- , it3
- , F
- >::type
- , typename result_of::prior<
- it3
- >::type
- , F
- , N-4
- >::type
- type;
- };
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_iter_fold<
- StateRef
- , It0
- , F
- , 3
+ template<int SeqSize, typename It, typename State, typename F, typename = void
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+
+ , bool = SeqSize == 0
+# endif
>
+ struct result_of_it_reverse_iter_fold
+ {};
+ template<typename It, typename State, typename F>
+ struct result_of_it_reverse_iter_fold<0,It,State,F
+ , typename boost::enable_if_has_type<BOOST_FUSION_FOLD_IMPL_ENABLER(State)>::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , true
+# endif
+ >
{
- typedef typename
- reverse_iter_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- rest1;
- typedef typename
- result_of::prior<
- It0 const
- >::type
- it1;
- typedef typename
- reverse_iter_fold_lvalue_state<
- typename reverse_iter_fold_lvalue_state<
- rest1
- , it1
- , F
- >::type
- , typename result_of::prior<
- it1 const
- >::type const
- , F
- >::type
- type;
+ typedef typename State::type type;
};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_iter_fold<
- StateRef
- , It0
- , F
- , 2
- >
- : reverse_iter_fold_lvalue_state<
- typename reverse_iter_fold_lvalue_state<
- StateRef
- , It0 const
- , F
- >::type
- , typename result_of::prior<
- It0 const
- >::type const
+ template<int SeqSize, typename It, typename State, typename F>
+ struct result_of_it_reverse_iter_fold<SeqSize,It,State,F
+ , typename boost::enable_if_has_type<
+# if BOOST_WORKAROUND (BOOST_MSVC, >= 1500)
+
+
+
+ typename boost::disable_if_c<SeqSize == 0, State>::type::type
+# else
+ BOOST_FUSION_FOLD_IMPL_ENABLER(State)
+# endif
+ >::type
+# if BOOST_WORKAROUND (BOOST_MSVC, < 1500)
+ , false
+# endif
+ >
+ : result_of_it_reverse_iter_fold<
+ SeqSize-1
+ , typename result_of::prior<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ It const&
+ )
+ >
, F
>
{};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_iter_fold<
- StateRef
- , It0
+ template<typename It, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_it_reverse_iter_fold<
+ 0
+ , It
+ , State
, F
- , 1
- >
- : reverse_iter_fold_lvalue_state<
- StateRef
- , It0 const
+ >::type
+ it_reverse_iter_fold(mpl::int_<0>, It const&, typename State::type state, F&)
+ {
+ return state;
+ }
+ template<typename It, typename State, typename F, int SeqSize>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename lazy_enable_if_c<
+ SeqSize != 0
+ , result_of_it_reverse_iter_fold<
+ SeqSize
+ , It
+ , State
, F
>
- {};
- template<typename StateRef, typename It0, typename F>
- struct result_of_unrolled_reverse_iter_fold<
- StateRef
- , It0
- , F
- , 0
- >
+ >::type
+ it_reverse_iter_fold(mpl::int_<SeqSize>, It const& it, typename State::type state, F& f)
{
- typedef StateRef type;
- };
- template<typename StateRef, typename It0, typename F, int SeqSize>
- struct result_of_first_unrolledreverse_iter_fold
- {
- typedef typename
- result_of_unrolled_reverse_iter_fold<
- typename fusion::detail::result_of_with_decltype<
- F(
- StateRef,
- It0 const&
- )
- >::type
- , typename result_of::prior<
- It0 const
- >::type
- , F
- , SeqSize-1
- >::type
- type;
- };
- template<int SeqSize, typename StateRef, typename Seq, typename F>
- struct reverse_iter_fold_impl
- {
- typedef typename
- result_of_first_unrolledreverse_iter_fold<
- StateRef
- , typename fusion::result_of::prior< typename result_of::end<Seq>::type >::type
- , F
- , SeqSize
- >::type
- type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static type
- call(StateRef state, Seq& seq, F f)
- {
- typedef
- unrolled_reverse_iter_fold<
- type
- , SeqSize
- >
- unrolled_impl;
- return unrolled_impl::call(
- state,
- fusion::prior( fusion::end(seq)),
- f);
- }
- };
- template<typename StateRef, typename Seq, typename F>
- struct reverse_iter_fold_impl<0,StateRef,Seq,F>
- {
- typedef StateRef type;
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static StateRef
- call(StateRef state, Seq&, F)
- {
- return static_cast<StateRef>(state);
- }
- };
- template<typename Seq, typename State, typename F, bool IsSegmented>
+ return it_reverse_iter_fold<
+ typename result_of::prior<It>::type
+ , boost::result_of<
+ F(
+ typename add_reference<typename State::type>::type,
+ It const&
+ )
+ >
+ , F
+ >(
+ mpl::int_<SeqSize-1>()
+ , fusion::prior(it)
+ , f(state, it)
+ , f
+ );
+ }
+ template<typename Seq, typename State, typename F
+ , bool = traits::is_sequence<Seq>::value
+ , bool = traits::is_segmented<Seq>::value>
struct result_of_reverse_iter_fold
- : reverse_iter_fold_impl<
+ {};
+ template<typename Seq, typename State, typename F>
+ struct result_of_reverse_iter_fold<Seq, State, F, true, false>
+ : result_of_it_reverse_iter_fold<
result_of::size<Seq>::value
- , typename add_reference<
- typename add_const<State>::type
- >::type
- , Seq
+ , typename fusion::result_of::prior< typename result_of::end<Seq>::type >::type
+ , add_reference<State>
, F
>
{};
+ template<typename Seq, typename State, typename F>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of_reverse_iter_fold<Seq, State, F>::type
+ reverse_iter_fold(Seq& seq, State& state, F& f)
+ {
+ return it_reverse_iter_fold<
+ typename fusion::result_of::prior< typename result_of::end<Seq>::type >::type
+ , add_reference<State>
+ , F
+ >(
+ typename result_of::size<Seq>::type()
+ , fusion::prior( fusion::end(seq) )
+ , state
+ , f
+ );
+ }
}
namespace result_of
{
template<typename Seq, typename State, typename F>
struct reverse_iter_fold
- : detail::result_of_reverse_iter_fold<
- Seq
- , State
- , F
- , traits::is_segmented<Seq>::type::value
- >
+ : detail::result_of_reverse_iter_fold<Seq, State, F>
{};
}
template<typename Seq, typename State, typename F>
@@ -357,10 +150,7 @@ namespace boost { namespace fusion
>::type
reverse_iter_fold(Seq& seq, State const& state, F f)
{
- return result_of::reverse_iter_fold<Seq,State const,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_iter_fold<Seq, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@@ -371,37 +161,28 @@ namespace boost { namespace fusion
>::type
reverse_iter_fold(Seq const& seq, State const& state, F f)
{
- return result_of::reverse_iter_fold<Seq const,State const,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_iter_fold<Seq const, State const, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_iter_fold<
Seq
- , State const
+ , State
, F
>::type
reverse_iter_fold(Seq& seq, State& state, F f)
{
- return result_of::reverse_iter_fold<Seq,State,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_iter_fold<Seq, State, F>(seq, state, f);
}
template<typename Seq, typename State, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_iter_fold<
Seq const
- , State const
+ , State
, F
>::type
reverse_iter_fold(Seq const& seq, State& state, F f)
{
- return result_of::reverse_iter_fold<Seq const,State,F>::call(
- state,
- seq,
- f);
+ return detail::reverse_iter_fold<Seq const, State, F>(seq, state, f);
}
}}
diff --git a/boost/fusion/algorithm/iteration/detail/segmented_fold.hpp b/boost/fusion/algorithm/iteration/detail/segmented_fold.hpp
index 4ff679af2e..350bff75b3 100644
--- a/boost/fusion/algorithm/iteration/detail/segmented_fold.hpp
+++ b/boost/fusion/algorithm/iteration/detail/segmented_fold.hpp
@@ -10,6 +10,7 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/algorithm/iteration/fold_fwd.hpp>
#include <boost/fusion/support/segmented_fold_until.hpp>
+#include <boost/mpl/bool.hpp>
namespace boost { namespace fusion { namespace detail
{
@@ -38,11 +39,11 @@ namespace boost { namespace fusion { namespace detail
};
// The default implementation of this lives in detail/fold.hpp
- template <typename Sequence, typename State, typename Fun, bool IsSegmented>
+ template <typename Sequence, typename State, typename Fun, bool IsSequence, bool IsSegmented>
struct result_of_fold;
template <typename Sequence, typename State, typename Fun>
- struct result_of_fold<Sequence, State, Fun, true>
+ struct result_of_fold<Sequence, State, Fun, true, true>
{
typedef
typename result_of::segmented_fold_until<
@@ -53,7 +54,7 @@ namespace boost { namespace fusion { namespace detail
type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
- static type call(State& state, Sequence& seq, Fun fun)
+ static type call(Sequence& seq, State& state, Fun& fun)
{
return fusion::segmented_fold_until(seq, state, segmented_fold_fun<Fun>(fun));
}
diff --git a/boost/fusion/algorithm/iteration/fold.hpp b/boost/fusion/algorithm/iteration/fold.hpp
index a2a0146ab4..039e01c0c7 100644
--- a/boost/fusion/algorithm/iteration/fold.hpp
+++ b/boost/fusion/algorithm/iteration/fold.hpp
@@ -2,6 +2,7 @@
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2007 Dan Marsden
Copyright (c) 2009-2010 Christopher Schmidt
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -10,24 +11,17 @@
#define BOOST_FUSION_ALGORITHM_ITERATION_FOLD_HPP
#include <boost/fusion/support/config.hpp>
-#include <boost/fusion/support/detail/result_of.hpp>
#include <boost/fusion/algorithm/iteration/fold_fwd.hpp>
#include <boost/config.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
-#include <boost/fusion/sequence/intrinsic/end.hpp>
-#include <boost/fusion/sequence/intrinsic/empty.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/support/is_segmented.hpp>
-#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/iterator/deref.hpp>
#include <boost/fusion/iterator/value_of.hpp>
-#include <boost/fusion/iterator/prior.hpp>
#include <boost/fusion/iterator/next.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/bool.hpp>
#include <boost/utility/result_of.hpp>
-#include <boost/type_traits/add_const.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/type_traits/add_reference.hpp>
#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
diff --git a/boost/fusion/algorithm/iteration/fold_fwd.hpp b/boost/fusion/algorithm/iteration/fold_fwd.hpp
index f8328e80f9..0dbac7618b 100644
--- a/boost/fusion/algorithm/iteration/fold_fwd.hpp
+++ b/boost/fusion/algorithm/iteration/fold_fwd.hpp
@@ -38,7 +38,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::fold<
Seq
- , State const
+ , State
, F
>::type
fold(Seq& seq, State& state, F f);
@@ -47,7 +47,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::fold<
Seq const
- , State const
+ , State
, F
>::type
fold(Seq const& seq, State& state, F f);
diff --git a/boost/fusion/algorithm/iteration/iter_fold.hpp b/boost/fusion/algorithm/iteration/iter_fold.hpp
index b59a6957bc..cff5b4edf9 100644
--- a/boost/fusion/algorithm/iteration/iter_fold.hpp
+++ b/boost/fusion/algorithm/iteration/iter_fold.hpp
@@ -1,6 +1,7 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,20 +14,14 @@
#include <boost/fusion/algorithm/iteration/iter_fold_fwd.hpp>
#include <boost/config.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
-#include <boost/fusion/sequence/intrinsic/end.hpp>
-#include <boost/fusion/sequence/intrinsic/empty.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/support/is_segmented.hpp>
-#include <boost/fusion/support/detail/result_of.hpp>
-#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/iterator/deref.hpp>
#include <boost/fusion/iterator/value_of.hpp>
-#include <boost/fusion/iterator/prior.hpp>
#include <boost/fusion/iterator/next.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/type_traits/add_const.hpp>
+#include <boost/utility/result_of.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/type_traits/add_reference.hpp>
#define BOOST_FUSION_ITER_FOLD
diff --git a/boost/fusion/algorithm/iteration/iter_fold_fwd.hpp b/boost/fusion/algorithm/iteration/iter_fold_fwd.hpp
index 6c595cf198..1d8543ca5f 100644
--- a/boost/fusion/algorithm/iteration/iter_fold_fwd.hpp
+++ b/boost/fusion/algorithm/iteration/iter_fold_fwd.hpp
@@ -38,7 +38,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::iter_fold<
Seq
- , State const
+ , State
, F
>::type
iter_fold(Seq& seq, State& state, F f);
@@ -47,7 +47,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::iter_fold<
Seq const
- , State const
+ , State
, F
>::type
iter_fold(Seq const& seq, State& state, F f);
diff --git a/boost/fusion/algorithm/iteration/reverse_fold.hpp b/boost/fusion/algorithm/iteration/reverse_fold.hpp
index dffff79e14..252ad30836 100644
--- a/boost/fusion/algorithm/iteration/reverse_fold.hpp
+++ b/boost/fusion/algorithm/iteration/reverse_fold.hpp
@@ -1,6 +1,7 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -10,24 +11,17 @@
#define BOOST_FUSION_ALGORITHM_ITERATION_REVERSE_FOLD_HPP
#include <boost/fusion/support/config.hpp>
-#include <boost/fusion/support/detail/result_of.hpp>
#include <boost/fusion/algorithm/iteration/reverse_fold_fwd.hpp>
#include <boost/config.hpp>
-#include <boost/fusion/sequence/intrinsic/begin.hpp>
#include <boost/fusion/sequence/intrinsic/end.hpp>
-#include <boost/fusion/sequence/intrinsic/empty.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/support/is_segmented.hpp>
-#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/iterator/deref.hpp>
#include <boost/fusion/iterator/value_of.hpp>
#include <boost/fusion/iterator/prior.hpp>
-#include <boost/fusion/iterator/next.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/bool.hpp>
#include <boost/utility/result_of.hpp>
-#include <boost/type_traits/add_const.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/type_traits/add_reference.hpp>
#define BOOST_FUSION_REVERSE_FOLD
diff --git a/boost/fusion/algorithm/iteration/reverse_fold_fwd.hpp b/boost/fusion/algorithm/iteration/reverse_fold_fwd.hpp
index 42c8ac2163..c5e24b34a9 100644
--- a/boost/fusion/algorithm/iteration/reverse_fold_fwd.hpp
+++ b/boost/fusion/algorithm/iteration/reverse_fold_fwd.hpp
@@ -38,7 +38,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_fold<
Seq
- , State const
+ , State
, F
>::type
reverse_fold(Seq& seq, State& state, F f);
@@ -47,7 +47,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_fold<
Seq const
- , State const
+ , State
, F
>::type
reverse_fold(Seq const& seq, State& state, F f);
diff --git a/boost/fusion/algorithm/iteration/reverse_iter_fold.hpp b/boost/fusion/algorithm/iteration/reverse_iter_fold.hpp
index d36861f37b..3276bbde57 100644
--- a/boost/fusion/algorithm/iteration/reverse_iter_fold.hpp
+++ b/boost/fusion/algorithm/iteration/reverse_iter_fold.hpp
@@ -1,6 +1,7 @@
/*=============================================================================
Copyright (c) 2010 Christopher Schmidt
Copyright (c) 2001-2011 Joel de Guzman
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,24 +10,17 @@
#define BOOST_FUSION_ALGORITHM_ITERATION_REVERSE_ITER_FOLD_HPP
#include <boost/fusion/support/config.hpp>
-#include <boost/fusion/support/detail/result_of.hpp>
#include <boost/fusion/algorithm/iteration/reverse_iter_fold_fwd.hpp>
#include <boost/config.hpp>
-#include <boost/fusion/sequence/intrinsic/begin.hpp>
#include <boost/fusion/sequence/intrinsic/end.hpp>
-#include <boost/fusion/sequence/intrinsic/empty.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/support/is_segmented.hpp>
-#include <boost/fusion/iterator/equal_to.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/iterator/deref.hpp>
#include <boost/fusion/iterator/value_of.hpp>
#include <boost/fusion/iterator/prior.hpp>
-#include <boost/fusion/iterator/next.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/bool.hpp>
#include <boost/utility/result_of.hpp>
-#include <boost/type_traits/add_const.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/type_traits/add_reference.hpp>
#define BOOST_FUSION_REVERSE_FOLD
diff --git a/boost/fusion/algorithm/iteration/reverse_iter_fold_fwd.hpp b/boost/fusion/algorithm/iteration/reverse_iter_fold_fwd.hpp
index 21d99deead..76f0186392 100644
--- a/boost/fusion/algorithm/iteration/reverse_iter_fold_fwd.hpp
+++ b/boost/fusion/algorithm/iteration/reverse_iter_fold_fwd.hpp
@@ -38,7 +38,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_iter_fold<
Seq
- , State const
+ , State
, F
>::type
reverse_iter_fold(Seq& seq, State& state, F f);
@@ -47,7 +47,7 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
inline typename result_of::reverse_iter_fold<
Seq const
- , State const
+ , State
, F
>::type
reverse_iter_fold(Seq const& seq, State& state, F f);
diff --git a/boost/fusion/algorithm/transformation/erase.hpp b/boost/fusion/algorithm/transformation/erase.hpp
index 0f3b8a1519..8eebc357bb 100644
--- a/boost/fusion/algorithm/transformation/erase.hpp
+++ b/boost/fusion/algorithm/transformation/erase.hpp
@@ -10,7 +10,6 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/iterator/equal_to.hpp>
#include <boost/fusion/iterator/mpl/convert_iterator.hpp>
-#include <boost/fusion/container/vector/vector10.hpp>
#include <boost/fusion/view/joint_view/joint_view.hpp>
#include <boost/fusion/view/iterator_range/iterator_range.hpp>
#include <boost/fusion/support/detail/as_fusion_element.hpp>
diff --git a/boost/fusion/algorithm/transformation/flatten.hpp b/boost/fusion/algorithm/transformation/flatten.hpp
index e3cfa983a5..43ac34dfe6 100644
--- a/boost/fusion/algorithm/transformation/flatten.hpp
+++ b/boost/fusion/algorithm/transformation/flatten.hpp
@@ -1,9 +1,9 @@
-/*//////////////////////////////////////////////////////////////////////////////
+/*==============================================================================
Copyright (c) 2013 Jamboree
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
+==============================================================================*/
#ifndef BOOST_FUSION_ALGORITHM_FLATTEN_HPP_INCLUDED
#define BOOST_FUSION_ALGORITHM_FLATTEN_HPP_INCLUDED
diff --git a/boost/fusion/algorithm/transformation/insert.hpp b/boost/fusion/algorithm/transformation/insert.hpp
index 44e596537e..c6d5219d69 100644
--- a/boost/fusion/algorithm/transformation/insert.hpp
+++ b/boost/fusion/algorithm/transformation/insert.hpp
@@ -10,7 +10,6 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/detail/as_fusion_element.hpp>
#include <boost/fusion/iterator/mpl/convert_iterator.hpp>
-#include <boost/fusion/container/vector/vector10.hpp>
#include <boost/fusion/view/joint_view/joint_view.hpp>
#include <boost/fusion/view/single_view/single_view.hpp>
#include <boost/fusion/view/iterator_range/iterator_range.hpp>
diff --git a/boost/fusion/algorithm/transformation/insert_range.hpp b/boost/fusion/algorithm/transformation/insert_range.hpp
index 40e64e1f5e..57878309a1 100644
--- a/boost/fusion/algorithm/transformation/insert_range.hpp
+++ b/boost/fusion/algorithm/transformation/insert_range.hpp
@@ -9,7 +9,6 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/iterator/mpl/convert_iterator.hpp>
-#include <boost/fusion/container/vector/vector10.hpp>
#include <boost/fusion/view/joint_view/joint_view.hpp>
#include <boost/fusion/view/iterator_range/iterator_range.hpp>
#include <boost/fusion/support/detail/as_fusion_element.hpp>
diff --git a/boost/fusion/container/deque/deque.hpp b/boost/fusion/container/deque/deque.hpp
index 96919052e7..dee51befcd 100644
--- a/boost/fusion/container/deque/deque.hpp
+++ b/boost/fusion/container/deque/deque.hpp
@@ -149,7 +149,8 @@ namespace boost { namespace fusion
template <typename Sequence>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
explicit deque(Sequence const& seq
- , typename disable_if<is_convertible<Sequence, Head> >::type* /*dummy*/ = 0)
+ , typename disable_if<is_convertible<Sequence, Head> >::type* /*dummy*/ = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* /*dummy*/ = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
diff --git a/boost/fusion/container/deque/detail/convert_impl.hpp b/boost/fusion/container/deque/detail/convert_impl.hpp
index ba9b847773..ede0cc48fe 100644
--- a/boost/fusion/container/deque/detail/convert_impl.hpp
+++ b/boost/fusion/container/deque/detail/convert_impl.hpp
@@ -1,6 +1,7 @@
/*=============================================================================
Copyright (c) 2005-2012 Joel de Guzman
Copyright (c) 2005-2006 Dan Marsden
+ Copyright (c) 2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -12,7 +13,7 @@
#include <boost/fusion/container/deque/convert.hpp>
#include <boost/fusion/container/deque/deque.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
-#include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
namespace boost { namespace fusion
{
@@ -41,7 +42,11 @@ namespace boost { namespace fusion
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Sequence& seq)
{
- return gen::call(seq);
+ return gen::call(fusion::begin(seq)
+#if defined(BOOST_FUSION_HAS_VARIADIC_DEQUE)
+ , fusion::end(seq)
+#endif
+ );
}
};
};
diff --git a/boost/fusion/container/deque/detail/cpp03/build_deque.hpp b/boost/fusion/container/deque/detail/cpp03/build_deque.hpp
index 99cbe58493..587aa3b06c 100644
--- a/boost/fusion/container/deque/detail/cpp03/build_deque.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/build_deque.hpp
@@ -22,6 +22,7 @@ namespace boost { namespace fusion
{
template <typename Sequence>
struct as_deque
+ : detail::as_deque<result_of::size<Sequence>::value>
{
typedef typename
detail::as_deque<result_of::size<Sequence>::value>
diff --git a/boost/fusion/container/deque/detail/cpp03/deque.hpp b/boost/fusion/container/deque/detail/cpp03/deque.hpp
index db8a967ab0..a65fa4acbd 100644
--- a/boost/fusion/container/deque/detail/cpp03/deque.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/deque.hpp
@@ -101,7 +101,9 @@ namespace boost { namespace fusion {
template<typename Sequence>
BOOST_FUSION_GPU_ENABLED
- deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0)
+ deque(Sequence const& seq
+ , typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* /*dummy*/ = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
diff --git a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque10.hpp b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque10.hpp
index ae1828a5f7..95cd8c1cba 100644
--- a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque10.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque10.hpp
@@ -201,7 +201,9 @@ deque(T_0 && t0 , T_1 && t1 , T_2 && t2 , T_3 && t3 , T_4 && t4 , T_5 && t5 , T_
{}
template<typename Sequence>
BOOST_FUSION_GPU_ENABLED
- deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* = 0)
+ deque(Sequence const& seq
+ , typename disable_if<is_convertible<Sequence, T0> >::type* = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
template <typename U0 , typename U1 , typename U2 , typename U3 , typename U4 , typename U5 , typename U6 , typename U7 , typename U8 , typename U9>
diff --git a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque20.hpp b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque20.hpp
index 78224634bb..ad06945135 100644
--- a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque20.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque20.hpp
@@ -381,7 +381,9 @@ deque(T_0 && t0 , T_1 && t1 , T_2 && t2 , T_3 && t3 , T_4 && t4 , T_5 && t5 , T_
{}
template<typename Sequence>
BOOST_FUSION_GPU_ENABLED
- deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* = 0)
+ deque(Sequence const& seq
+ , typename disable_if<is_convertible<Sequence, T0> >::type* = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
template <typename U0 , typename U1 , typename U2 , typename U3 , typename U4 , typename U5 , typename U6 , typename U7 , typename U8 , typename U9 , typename U10 , typename U11 , typename U12 , typename U13 , typename U14 , typename U15 , typename U16 , typename U17 , typename U18 , typename U19>
diff --git a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque30.hpp b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque30.hpp
index 8653217bc0..44a5b2b103 100644
--- a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque30.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque30.hpp
@@ -561,7 +561,9 @@ deque(T_0 && t0 , T_1 && t1 , T_2 && t2 , T_3 && t3 , T_4 && t4 , T_5 && t5 , T_
{}
template<typename Sequence>
BOOST_FUSION_GPU_ENABLED
- deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* = 0)
+ deque(Sequence const& seq
+ , typename disable_if<is_convertible<Sequence, T0> >::type* = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
template <typename U0 , typename U1 , typename U2 , typename U3 , typename U4 , typename U5 , typename U6 , typename U7 , typename U8 , typename U9 , typename U10 , typename U11 , typename U12 , typename U13 , typename U14 , typename U15 , typename U16 , typename U17 , typename U18 , typename U19 , typename U20 , typename U21 , typename U22 , typename U23 , typename U24 , typename U25 , typename U26 , typename U27 , typename U28 , typename U29>
diff --git a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque40.hpp b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque40.hpp
index 3bfd488af2..e642288eb7 100644
--- a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque40.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque40.hpp
@@ -741,7 +741,9 @@ deque(T_0 && t0 , T_1 && t1 , T_2 && t2 , T_3 && t3 , T_4 && t4 , T_5 && t5 , T_
{}
template<typename Sequence>
BOOST_FUSION_GPU_ENABLED
- deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* = 0)
+ deque(Sequence const& seq
+ , typename disable_if<is_convertible<Sequence, T0> >::type* = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
template <typename U0 , typename U1 , typename U2 , typename U3 , typename U4 , typename U5 , typename U6 , typename U7 , typename U8 , typename U9 , typename U10 , typename U11 , typename U12 , typename U13 , typename U14 , typename U15 , typename U16 , typename U17 , typename U18 , typename U19 , typename U20 , typename U21 , typename U22 , typename U23 , typename U24 , typename U25 , typename U26 , typename U27 , typename U28 , typename U29 , typename U30 , typename U31 , typename U32 , typename U33 , typename U34 , typename U35 , typename U36 , typename U37 , typename U38 , typename U39>
diff --git a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque50.hpp b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque50.hpp
index 04441da66c..a387708bca 100644
--- a/boost/fusion/container/deque/detail/cpp03/preprocessed/deque50.hpp
+++ b/boost/fusion/container/deque/detail/cpp03/preprocessed/deque50.hpp
@@ -921,7 +921,9 @@ deque(T_0 && t0 , T_1 && t1 , T_2 && t2 , T_3 && t3 , T_4 && t4 , T_5 && t5 , T_
{}
template<typename Sequence>
BOOST_FUSION_GPU_ENABLED
- deque(Sequence const& seq, typename disable_if<is_convertible<Sequence, T0> >::type* = 0)
+ deque(Sequence const& seq
+ , typename disable_if<is_convertible<Sequence, T0> >::type* = 0
+ , typename enable_if<traits::is_sequence<Sequence> >::type* = 0)
: base(base::from_iterator(fusion::begin(seq)))
{}
template <typename U0 , typename U1 , typename U2 , typename U3 , typename U4 , typename U5 , typename U6 , typename U7 , typename U8 , typename U9 , typename U10 , typename U11 , typename U12 , typename U13 , typename U14 , typename U15 , typename U16 , typename U17 , typename U18 , typename U19 , typename U20 , typename U21 , typename U22 , typename U23 , typename U24 , typename U25 , typename U26 , typename U27 , typename U28 , typename U29 , typename U30 , typename U31 , typename U32 , typename U33 , typename U34 , typename U35 , typename U36 , typename U37 , typename U38 , typename U39 , typename U40 , typename U41 , typename U42 , typename U43 , typename U44 , typename U45 , typename U46 , typename U47 , typename U48 , typename U49>
diff --git a/boost/fusion/container/generation/make_set.hpp b/boost/fusion/container/generation/make_set.hpp
index 705ec582a8..cd8519e54d 100644
--- a/boost/fusion/container/generation/make_set.hpp
+++ b/boost/fusion/container/generation/make_set.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -10,7 +10,46 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/container/set/set.hpp>
+#if !defined(BOOST_FUSION_HAS_VARIADIC_SET)
# include <boost/fusion/container/generation/detail/pp_make_set.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 variadic interface
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <utility>
+
+namespace boost { namespace fusion
+{
+ namespace result_of
+ {
+ template <typename ...T>
+ struct make_set
+ {
+ typedef set<
+ typename detail::as_fusion_element<
+ typename remove_const<
+ typename remove_reference<T>::type
+ >::type
+ >::type...
+ > type;
+ };
+ }
+
+ template <typename ...T>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of::make_set<T...>::type
+ make_set(T&&... arg)
+ {
+ return typename result_of::make_set<T...>::type(std::forward<T>(arg)...);
+ }
+ }}
+
+
+#endif
#endif
diff --git a/boost/fusion/container/generation/make_vector.hpp b/boost/fusion/container/generation/make_vector.hpp
index 8f0674815e..cd3b992bb5 100644
--- a/boost/fusion/container/generation/make_vector.hpp
+++ b/boost/fusion/container/generation/make_vector.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -10,7 +10,66 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/container/vector/vector.hpp>
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/generation/detail/pp_make_vector.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 variadic interface
+///////////////////////////////////////////////////////////////////////////////
+
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <utility>
+
+namespace boost { namespace fusion
+{
+ namespace result_of
+ {
+ template <typename ...T>
+ struct make_vector
+ {
+ // make `make_vector<T..., void_...>' into `make_vector<T...>'
+ template <typename, typename...> struct trim_void;
+
+ template <typename... U>
+ struct trim_void<vector<U...> >
+ {
+ typedef vector<U...> type;
+ };
+
+ template <typename... U, typename... Tail>
+ struct trim_void<vector<U...>, void_, Tail...>
+ : trim_void<vector<U...> > { };
+
+ template <typename... U, typename Head, typename... Tail>
+ struct trim_void<vector<U...>, Head, Tail...>
+ : trim_void<vector<U..., Head>, Tail...> { };
+
+ typedef
+ typename trim_void<
+ vector<>
+ , typename detail::as_fusion_element<
+ typename remove_const<
+ typename remove_reference<T>::type
+ >::type
+ >::type...
+ >::type
+ type;
+ };
+ }
+
+ template <typename ...T>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of::make_vector<T...>::type
+ make_vector(T&&... arg)
+ {
+ return typename result_of::make_vector<T...>::type(std::forward<T>(arg)...);
+ }
+ }}
+
+
+#endif
#endif
diff --git a/boost/fusion/container/generation/vector_tie.hpp b/boost/fusion/container/generation/vector_tie.hpp
index 5bb4face4d..5d7cb98bc2 100644
--- a/boost/fusion/container/generation/vector_tie.hpp
+++ b/boost/fusion/container/generation/vector_tie.hpp
@@ -8,8 +8,37 @@
#define FUSION_VECTOR_TIE_11112014_2302
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/generation/detail/pp_vector_tie.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 variadic interface
+///////////////////////////////////////////////////////////////////////////////
+
+namespace boost { namespace fusion
+{
+ namespace result_of
+ {
+ template <typename ...T>
+ struct vector_tie
+ {
+ typedef vector<T&...> type;
+ };
+ }
+
+ template <typename ...T>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline vector<T&...>
+ vector_tie(T&... arg)
+ {
+ return vector<T&...>(arg...);
+ }
+ }}
+
+
+#endif
#endif
diff --git a/boost/fusion/container/set/detail/as_set.hpp b/boost/fusion/container/set/detail/as_set.hpp
index 1eb0d3fe12..9d33325818 100644
--- a/boost/fusion/container/set/detail/as_set.hpp
+++ b/boost/fusion/container/set/detail/as_set.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,7 +13,55 @@
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_SET)
# include <boost/fusion/container/set/detail/cpp03/as_set.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/detail/index_sequence.hpp>
+#include <boost/fusion/container/set/set.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/iterator/advance.hpp>
+#include <cstddef>
+
+namespace boost { namespace fusion { namespace detail
+{
+BOOST_FUSION_BARRIER_BEGIN
+
+ template <int size
+ , typename = typename detail::make_index_sequence<size>::type>
+ struct as_set;
+
+ template <int size, std::size_t ...Indices>
+ struct as_set<size, detail::index_sequence<Indices...> >
+ {
+ template <typename I>
+ struct apply
+ {
+ typedef set<
+ typename result_of::value_of<
+ typename result_of::advance_c<I, Indices>::type
+ >::type...
+ > type;
+ };
+
+ template <typename Iterator>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ static typename apply<Iterator>::type
+ call(Iterator const& i)
+ {
+ typedef apply<Iterator> gen;
+ typedef typename gen::type result;
+ return result(*advance_c<Indices>(i)...);
+ }
+ };
+
+BOOST_FUSION_BARRIER_END
+}}}
+
+#endif
#endif
diff --git a/boost/fusion/container/set/detail/convert_impl.hpp b/boost/fusion/container/set/detail/convert_impl.hpp
index d9d5dcfcd3..0b4cb22f32 100644
--- a/boost/fusion/container/set/detail/convert_impl.hpp
+++ b/boost/fusion/container/set/detail/convert_impl.hpp
@@ -29,7 +29,7 @@ namespace boost { namespace fusion
template <typename Sequence>
struct apply
{
- typedef typename detail::as_set<result_of::size<Sequence>::value> gen;
+ typedef detail::as_set<result_of::size<Sequence>::value> gen;
typedef typename gen::
template apply<typename result_of::begin<Sequence>::type>::type
type;
diff --git a/boost/fusion/container/set/set.hpp b/boost/fusion/container/set/set.hpp
index 59f4eafc02..12fd8115d6 100644
--- a/boost/fusion/container/set/set.hpp
+++ b/boost/fusion/container/set/set.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,8 +13,126 @@
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_SET)
# include <boost/fusion/container/set/detail/cpp03/set.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/fusion/support/sequence_base.hpp>
+#include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/fusion/support/detail/is_same_size.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/container/set/detail/begin_impl.hpp>
+#include <boost/fusion/container/set/detail/end_impl.hpp>
+#include <boost/fusion/container/set/detail/value_of_impl.hpp>
+#include <boost/fusion/container/set/detail/deref_data_impl.hpp>
+#include <boost/fusion/container/set/detail/deref_impl.hpp>
+#include <boost/fusion/container/set/detail/key_of_impl.hpp>
+#include <boost/fusion/container/set/detail/value_of_data_impl.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/core/enable_if.hpp>
+
+namespace boost { namespace fusion
+{
+ struct fusion_sequence_tag;
+
+ template <>
+ struct set<> : sequence_base<set<> >
+ {
+ struct category : forward_traversal_tag, associative_tag {};
+
+ typedef set_tag fusion_tag;
+ typedef fusion_sequence_tag tag; // this gets picked up by MPL
+ typedef mpl::false_ is_view;
+
+ typedef vector<> storage_type;
+
+ typedef storage_type::size size;
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ set()
+ : data() {}
+
+ template <typename Sequence>
+ BOOST_FUSION_GPU_ENABLED
+ set(Sequence const& rhs,
+ typename enable_if<traits::is_sequence<Sequence> >::type* = 0,
+ typename enable_if<detail::is_same_size<Sequence, storage_type> >::type* = 0)
+ : data(rhs) {}
+
+ template <typename T>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ set&
+ operator=(T const& rhs)
+ {
+ data = rhs;
+ return *this;
+ }
+
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ storage_type& get_data() { return data; }
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ storage_type const& get_data() const { return data; }
+
+ private:
+ storage_type data;
+ };
+
+ template <typename ...T>
+ struct set : sequence_base<set<T...> >
+ {
+ struct category : forward_traversal_tag, associative_tag {};
+
+ typedef set_tag fusion_tag;
+ typedef fusion_sequence_tag tag; // this gets picked up by MPL
+ typedef mpl::false_ is_view;
+
+ typedef vector<T...> storage_type;
+
+ typedef typename storage_type::size size;
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ set()
+ : data() {}
+
+ template <typename Sequence>
+ BOOST_FUSION_GPU_ENABLED
+ set(Sequence&& rhs,
+ typename enable_if<traits::is_sequence<Sequence> >::type* = 0,
+ typename enable_if<detail::is_same_size<Sequence, storage_type> >::type* = 0)
+ : data(std::forward<Sequence>(rhs)) {}
+
+ template <typename ...U>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ explicit
+ set(U&& ...args)
+ : data(std::forward<U>(args)...) {}
+
+ template <typename U>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ set&
+ operator=(U&& rhs)
+ {
+ data = std::forward<U>(rhs);
+ return *this;
+ }
+
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ storage_type& get_data() { return data; }
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ storage_type const& get_data() const { return data; }
+
+ private:
+ storage_type data;
+ };
+
+}}
+
+#endif
#endif
diff --git a/boost/fusion/container/set/set_fwd.hpp b/boost/fusion/container/set/set_fwd.hpp
index 50d8d1c8bd..7b5d6830a5 100644
--- a/boost/fusion/container/set/set_fwd.hpp
+++ b/boost/fusion/container/set/set_fwd.hpp
@@ -9,11 +9,38 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
+
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR) \
+ || (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+# if defined(BOOST_FUSION_HAS_VARIADIC_SET)
+# undef BOOST_FUSION_HAS_VARIADIC_SET
+# endif
+#else
+# if !defined(BOOST_FUSION_HAS_VARIADIC_SET)
+# define BOOST_FUSION_HAS_VARIADIC_SET
+# endif
+#endif
///////////////////////////////////////////////////////////////////////////////
// With no variadics, we will use the C++03 version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_SET)
# include <boost/fusion/container/set/detail/cpp03/set_fwd.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace fusion
+{
+ struct set_tag;
+ struct set_iterator_tag;
+
+ template <typename ...T>
+ struct set;
+}}
+
+#endif
#endif
diff --git a/boost/fusion/container/vector.hpp b/boost/fusion/container/vector.hpp
index a999c8b023..41c980331e 100644
--- a/boost/fusion/container/vector.hpp
+++ b/boost/fusion/container/vector.hpp
@@ -8,25 +8,8 @@
#define FUSION_SEQUENCE_CLASS_VECTOR_10022005_0602
#include <boost/fusion/support/config.hpp>
-#include <boost/fusion/container/vector/detail/cpp03/limits.hpp>
-
-#include <boost/fusion/container/vector/vector10.hpp>
-#if (FUSION_MAX_VECTOR_SIZE > 10)
-#include <boost/fusion/container/vector/vector20.hpp>
-#endif
-#if (FUSION_MAX_VECTOR_SIZE > 20)
-#include <boost/fusion/container/vector/vector30.hpp>
-#endif
-#if (FUSION_MAX_VECTOR_SIZE > 30)
-#include <boost/fusion/container/vector/vector40.hpp>
-#endif
-#if (FUSION_MAX_VECTOR_SIZE > 40)
-#include <boost/fusion/container/vector/vector50.hpp>
-#endif
-
-#include <boost/fusion/container/vector/vector.hpp>
#include <boost/fusion/container/vector/vector_fwd.hpp>
-#include <boost/fusion/container/vector/vector_iterator.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
#include <boost/fusion/container/vector/convert.hpp>
#endif
diff --git a/boost/fusion/container/vector/detail/as_vector.hpp b/boost/fusion/container/vector/detail/as_vector.hpp
index eaaac89638..e2f45b6a04 100644
--- a/boost/fusion/container/vector/detail/as_vector.hpp
+++ b/boost/fusion/container/vector/detail/as_vector.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -8,12 +8,63 @@
#define FUSION_AS_VECTOR_11052014_1801
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/as_vector.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/detail/index_sequence.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/iterator/advance.hpp>
+#include <cstddef>
+
+namespace boost { namespace fusion { namespace detail
+{
+BOOST_FUSION_BARRIER_BEGIN
+
+ template <typename Indices>
+ struct as_vector_impl;
+
+ template <std::size_t ...Indices>
+ struct as_vector_impl<index_sequence<Indices...> >
+ {
+ template <typename Iterator>
+ struct apply
+ {
+ typedef vector<
+ typename result_of::value_of<
+ typename result_of::advance_c<Iterator, Indices>::type
+ >::type...
+ > type;
+ };
+
+ template <typename Iterator>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ static typename apply<Iterator>::type
+ call(Iterator i)
+ {
+ typedef typename apply<Iterator>::type result;
+ return result(*advance_c<Indices>(i)...);
+ }
+ };
+
+ template <int size>
+ struct as_vector
+ : as_vector_impl<typename make_index_sequence<size>::type> {};
+
+BOOST_FUSION_BARRIER_END
+}}}
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/detail/at_impl.hpp b/boost/fusion/container/vector/detail/at_impl.hpp
index cb98dd4a25..a2900d7943 100644
--- a/boost/fusion/container/vector/detail/at_impl.hpp
+++ b/boost/fusion/container/vector/detail/at_impl.hpp
@@ -9,9 +9,8 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/detail/access.hpp>
-#include <boost/type_traits/is_const.hpp>
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/int.hpp>
+#include <boost/fusion/container/vector/detail/value_at_impl.hpp>
+#include <boost/static_assert.hpp>
namespace boost { namespace fusion
{
@@ -28,7 +27,7 @@ namespace boost { namespace fusion
template <typename Sequence, typename N>
struct apply
{
- typedef typename mpl::at<typename Sequence::types, N>::type element;
+ typedef typename value_at_impl<vector_tag>::template apply<Sequence, N>::type element;
typedef typename detail::ref_result<element>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
@@ -43,7 +42,7 @@ namespace boost { namespace fusion
template <typename Sequence, typename N>
struct apply <Sequence const, N>
{
- typedef typename mpl::at<typename Sequence::types, N>::type element;
+ typedef typename value_at_impl<vector_tag>::template apply<Sequence, N>::type element;
typedef typename detail::cref_result<element>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
diff --git a/boost/fusion/container/vector/detail/config.hpp b/boost/fusion/container/vector/detail/config.hpp
new file mode 100644
index 0000000000..84f4605d2e
--- /dev/null
+++ b/boost/fusion/container/vector/detail/config.hpp
@@ -0,0 +1,36 @@
+/*=============================================================================
+ Copyright (c) 2014-2015 Kohei Takahashi
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef FUSION_VECTOR_CONFIG_11052014_1720
+#define FUSION_VECTOR_CONFIG_11052014_1720
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/fusion/support/config.hpp>
+
+#if (defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) \
+ || defined(BOOST_NO_CXX11_RVALUE_REFERENCES) \
+ || defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) \
+ || defined(BOOST_NO_CXX11_DECLTYPE)) \
+ || (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+# if defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
+# undef BOOST_FUSION_HAS_VARIADIC_VECTOR
+# endif
+#else
+# if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
+# define BOOST_FUSION_HAS_VARIADIC_VECTOR
+# endif
+#endif
+
+// Sometimes, MSVC 12 shows compile error with std::size_t of template parameter.
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1800))
+# if defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
+# undef BOOST_FUSION_HAS_VARIADIC_VECTOR
+# endif
+#endif
+
+#endif
+
diff --git a/boost/fusion/container/vector/detail/cpp03/limits.hpp b/boost/fusion/container/vector/detail/cpp03/limits.hpp
index 6e106144bb..74a05102d2 100644
--- a/boost/fusion/container/vector/detail/cpp03/limits.hpp
+++ b/boost/fusion/container/vector/detail/cpp03/limits.hpp
@@ -9,6 +9,7 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/support/detail/pp_round.hpp>
+#include <boost/preprocessor/stringize.hpp>
#if !defined(FUSION_MAX_VECTOR_SIZE)
# define FUSION_MAX_VECTOR_SIZE 10
diff --git a/boost/fusion/container/vector/detail/deref_impl.hpp b/boost/fusion/container/vector/detail/deref_impl.hpp
index 5186aa1047..c85bb82b3b 100644
--- a/boost/fusion/container/vector/detail/deref_impl.hpp
+++ b/boost/fusion/container/vector/detail/deref_impl.hpp
@@ -8,8 +8,8 @@
#define FUSION_DEREF_IMPL_05042005_1037
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/at.hpp>
#include <boost/fusion/support/detail/access.hpp>
+#include <boost/fusion/container/vector/detail/value_at_impl.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/mpl/if.hpp>
@@ -30,9 +30,7 @@ namespace boost { namespace fusion
{
typedef typename Iterator::vector vector;
typedef typename Iterator::index index;
- typedef typename mpl::at<
- typename vector::types, index>::type
- element;
+ typedef typename value_at_impl<vector_tag>::template apply<vector, index>::type element;
typedef typename
mpl::if_<
diff --git a/boost/fusion/container/vector/detail/value_at_impl.hpp b/boost/fusion/container/vector/detail/value_at_impl.hpp
index f71ca8486d..6c8c41fb27 100644
--- a/boost/fusion/container/vector/detail/value_at_impl.hpp
+++ b/boost/fusion/container/vector/detail/value_at_impl.hpp
@@ -9,11 +9,50 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/value_at_impl.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/type_traits/declval.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+
+namespace boost { namespace fusion
+{
+ struct vector_tag;
+
+ namespace vector_detail
+ {
+ template <typename I, typename ...T>
+ struct vector_data;
+ }
+
+ namespace extension
+ {
+ template <typename Tag>
+ struct value_at_impl;
+
+ template <>
+ struct value_at_impl<vector_tag>
+ {
+ template <typename Sequence, typename N>
+ struct apply
+ {
+ typedef typename boost::remove_cv<Sequence>::type seq;
+ typedef typename mpl::identity<decltype(seq::template value_at_impl<N::value>(boost::declval<seq*>()))>::type::type type;
+ };
+ };
+ }
+}}
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/detail/value_of_impl.hpp b/boost/fusion/container/vector/detail/value_of_impl.hpp
index 2a8acf912d..d67ab3fcc2 100644
--- a/boost/fusion/container/vector/detail/value_of_impl.hpp
+++ b/boost/fusion/container/vector/detail/value_of_impl.hpp
@@ -8,7 +8,7 @@
#define FUSION_VALUE_OF_IMPL_05052005_1128
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/at.hpp>
+#include <boost/fusion/container/vector/detail/value_at_impl.hpp>
namespace boost { namespace fusion
{
@@ -27,9 +27,7 @@ namespace boost { namespace fusion
{
typedef typename Iterator::vector vector;
typedef typename Iterator::index index;
- typedef typename mpl::at<
- typename vector::types, index>::type
- type;
+ typedef typename value_at_impl<vector_tag>::template apply<vector, index>::type type;
};
};
}
diff --git a/boost/fusion/container/vector/vector.hpp b/boost/fusion/container/vector/vector.hpp
index 2b9f0ce5ca..845a019e6b 100644
--- a/boost/fusion/container/vector/vector.hpp
+++ b/boost/fusion/container/vector/vector.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,12 +9,332 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
#include <boost/fusion/container/vector/vector_fwd.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/sequence_base.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/fusion/support/detail/index_sequence.hpp>
+#include <boost/fusion/container/vector/detail/at_impl.hpp>
+#include <boost/fusion/container/vector/detail/value_at_impl.hpp>
+#include <boost/fusion/container/vector/detail/begin_impl.hpp>
+#include <boost/fusion/container/vector/detail/end_impl.hpp>
+#include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/iterator/advance.hpp>
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/core/enable_if.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <cstddef>
+#include <utility>
+
+namespace boost { namespace fusion
+{
+ struct vector_tag;
+ struct random_access_traversal_tag;
+
+ namespace vector_detail
+ {
+ struct each_elem {};
+ struct copy_or_move {};
+ template <typename I> struct from_sequence {};
+
+ template <typename Sequence>
+ struct make_indices_from_seq
+ : detail::make_index_sequence<
+ fusion::result_of::size<typename remove_reference<Sequence>::type>::value
+ >
+ {};
+
+ template <typename T>
+ struct pure : remove_cv<typename remove_reference<T>::type> {};
+
+ template <typename Sequence, typename This, int = result_of::size<This>::value>
+ struct is_convertible_to_first
+ : boost::is_convertible<Sequence, typename result_of::value_at_c<This, 0>::type>
+ {};
+
+ template <typename Sequence, typename This>
+ struct is_convertible_to_first<Sequence, This, 0>
+ : mpl::false_
+ {};
+
+ template <typename This, typename ...T>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline each_elem
+ dispatch(T const&...) BOOST_NOEXCEPT { return each_elem(); }
+
+ template <typename This>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline copy_or_move
+ dispatch(This const&) BOOST_NOEXCEPT { return copy_or_move(); }
+
+ template <typename This, typename Sequence>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline from_sequence<
+ typename lazy_enable_if_c<
+ (traits::is_sequence<typename remove_reference<Sequence>::type>::value &&
+ !is_same<This, typename pure<Sequence>::type>::value &&
+ !is_convertible_to_first<Sequence, This>::value)
+ , make_indices_from_seq<Sequence>
+ >::type
+ >
+ dispatch(Sequence&&) BOOST_NOEXCEPT
+ { return from_sequence<typename make_indices_from_seq<Sequence>::type>(); }
+
+
+ // forward_at_c allows to access Nth element even if ForwardSequence
+ // since fusion::at_c requires RandomAccessSequence.
+ namespace result_of
+ {
+ template <typename Sequence, int N>
+ struct forward_at_c
+ : fusion::result_of::deref<
+ typename fusion::result_of::advance_c<
+ typename fusion::result_of::begin<
+ typename remove_reference<Sequence>::type
+ >::type
+ , N
+ >::type
+ >
+ {};
+ }
+
+ template <int N, typename Sequence>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of::forward_at_c<Sequence, N>::type
+ forward_at_c(Sequence&& seq)
+ {
+ typedef typename
+ result_of::forward_at_c<Sequence, N>::type
+ result;
+ return std::forward<result>(*advance_c<N>(begin(seq)));
+ }
+
+ // Object proxy since preserve object order
+ template <std::size_t, typename T>
+ struct store
+ {
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ store()
+ : elem() // value-initialized explicitly
+ {}
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ store(store const& rhs)
+ : elem(rhs.get())
+ {}
+
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ store&
+ operator=(store const& rhs)
+ {
+ elem = rhs.get();
+ return *this;
+ }
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ store(store&& rhs)
+ : elem(static_cast<T&&>(rhs.get()))
+ {}
+
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ store&
+ operator=(store&& rhs)
+ {
+ elem = static_cast<T&&>(rhs.get());
+ return *this;
+ }
+
+ template <typename U>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ store(U&& rhs
+ , typename disable_if<is_same<typename pure<U>::type, store> >::type* = 0)
+ : elem(std::forward<U>(rhs))
+ {}
+
+ template <typename U>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ typename disable_if<is_same<typename pure<U>::type, store>, store&>::type
+ operator=(U&& rhs)
+ {
+ elem = std::forward<U>(rhs);
+ return *this;
+ }
+
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ T & get() { return elem; }
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ T const& get() const { return elem; }
+
+ T elem;
+ };
+
+ template <typename I, typename ...T>
+ struct vector_data;
+
+ template <std::size_t ...I, typename ...T>
+ struct vector_data<detail::index_sequence<I...>, T...>
+ : store<I, T>...
+ , sequence_base<vector_data<detail::index_sequence<I...>, T...> >
+ {
+ typedef vector_tag fusion_tag;
+ typedef fusion_sequence_tag tag; // this gets picked up by MPL
+ typedef mpl::false_ is_view;
+ typedef random_access_traversal_tag category;
+ typedef mpl::int_<sizeof...(T)> size;
+ typedef vector<T...> type_sequence;
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ vector_data()
+ {}
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ vector_data(copy_or_move, vector_data const& rhs)
+ : store<I, T>(static_cast<store<I, T> const&>(rhs))...
+ {}
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ vector_data(copy_or_move, vector_data&& rhs)
+ : store<I, T>(std::forward<store<I, T> >(rhs))...
+ {}
+
+ template <typename Sequence>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ explicit
+ vector_data(from_sequence<detail::index_sequence<I...> >, Sequence&& rhs)
+ : store<I, T>(forward_at_c<I>(rhs))...
+ {}
+
+ template <typename ...U>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ explicit
+ vector_data(each_elem, U&&... var)
+ : store<I, T>(std::forward<U>(var))...
+ {}
+
+ template <typename Sequence>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ void
+ assign(Sequence&&, detail::index_sequence<>) {}
+
+ template <typename Sequence, std::size_t N, std::size_t ...M>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ void
+ assign(Sequence&& seq, detail::index_sequence<N, M...>)
+ {
+ at_impl(mpl::int_<N>()) = vector_detail::forward_at_c<N>(seq);
+ assign(std::forward<Sequence>(seq), detail::index_sequence<M...>());
+ }
+
+ template <std::size_t N, typename U>
+ static BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ auto at_detail(store<N, U>* this_) -> decltype(this_->get())
+ {
+ return this_->get();
+ }
+
+ template <std::size_t N, typename U>
+ static BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ auto at_detail(store<N, U> const* this_) -> decltype(this_->get())
+ {
+ return this_->get();
+ }
+
+ template <typename J>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ auto at_impl(J) -> decltype(at_detail<J::value>(this))
+ {
+ return at_detail<J::value>(this);
+ }
+
+ template <typename J>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ auto at_impl(J) const -> decltype(at_detail<J::value>(this))
+ {
+ return at_detail<J::value>(this);
+ }
+
+ template <std::size_t N, typename U>
+ static BOOST_FUSION_GPU_ENABLED
+ mpl::identity<U> value_at_impl(store<N, U>*);
+ };
+
+ template <typename V, typename... T>
+ struct trim_void_;
+
+ template <typename... T>
+ struct trim_void_<vector<T...> >
+ {
+ typedef vector_data<
+ typename detail::make_index_sequence<sizeof...(T)>::type
+ , T...
+ > type;
+ };
+
+ template <typename... T, typename... Tail>
+ struct trim_void_<vector<T...>, void_, Tail...>
+ : trim_void_<vector<T...> > {};
+
+ template <typename... T, typename Head, typename... Tail>
+ struct trim_void_<vector<T...>, Head, Tail...>
+ : trim_void_<vector<T..., Head>, Tail...> {};
+
+ template <typename... T>
+ struct trim_void : trim_void_<vector<>, T...> {};
+ } // namespace boost::fusion::vector_detail
+
+ // This class provides backward compatibility: vector<T, ..., void_, void_, ...>.
+ template <typename... T>
+ struct vector
+ : vector_detail::trim_void<T...>::type
+ {
+ typedef typename vector_detail::trim_void<T...>::type base;
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ vector()
+ {}
+
+ // rvalue-references is required here in order to forward any arguments to
+ // base: vector(T const&...) doesn't work with trailing void_ and
+ // vector(U const&...) cannot forward any arguments to base.
+ template <typename... U>
+ // XXX: constexpr become error due to pull-request #79, booooo!!
+ // In the (near) future release, should be fixed.
+ /* BOOST_CONSTEXPR */ BOOST_FUSION_GPU_ENABLED
+ vector(U&&... u)
+ : base(vector_detail::dispatch<vector>(std::forward<U>(u)...), std::forward<U>(u)...)
+ {}
+
+ template <typename Sequence>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ vector&
+ operator=(Sequence&& rhs)
+ {
+ typedef typename
+ vector_detail::make_indices_from_seq<Sequence>::type
+ indices;
+ base::assign(std::forward<Sequence>(rhs), indices());
+ return *this;
+ }
+ };
+}}
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/vector10.hpp b/boost/fusion/container/vector/vector10.hpp
index f152bfe161..65722fe64a 100644
--- a/boost/fusion/container/vector/vector10.hpp
+++ b/boost/fusion/container/vector/vector10.hpp
@@ -9,11 +9,21 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector10.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/vector20.hpp b/boost/fusion/container/vector/vector20.hpp
index c5be355df6..c36e50c7d2 100644
--- a/boost/fusion/container/vector/vector20.hpp
+++ b/boost/fusion/container/vector/vector20.hpp
@@ -9,11 +9,21 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector20.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/vector30.hpp b/boost/fusion/container/vector/vector30.hpp
index 1a528cb578..e9f891f28b 100644
--- a/boost/fusion/container/vector/vector30.hpp
+++ b/boost/fusion/container/vector/vector30.hpp
@@ -9,11 +9,21 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector30.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/vector40.hpp b/boost/fusion/container/vector/vector40.hpp
index 5faa7d595b..4b753a084e 100644
--- a/boost/fusion/container/vector/vector40.hpp
+++ b/boost/fusion/container/vector/vector40.hpp
@@ -9,11 +9,21 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector40.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/vector50.hpp b/boost/fusion/container/vector/vector50.hpp
index 7b7e7a8a18..5d8d356313 100644
--- a/boost/fusion/container/vector/vector50.hpp
+++ b/boost/fusion/container/vector/vector50.hpp
@@ -9,11 +9,21 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector50.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector_fwd.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+
+#endif
#endif
diff --git a/boost/fusion/container/vector/vector_fwd.hpp b/boost/fusion/container/vector/vector_fwd.hpp
index b63099ce9d..dcb0a0fc0c 100644
--- a/boost/fusion/container/vector/vector_fwd.hpp
+++ b/boost/fusion/container/vector/vector_fwd.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,11 +9,35 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// With no variadics, we will use the C++03 version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/container/vector/detail/cpp03/vector_fwd.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+
+namespace boost { namespace fusion
+{
+ template <typename ...T>
+ struct vector;
+
+#define FUSION_VECTOR_N_ALIASES(z, N, d) \
+ template <typename ...T> \
+ using BOOST_PP_CAT(vector, N) = vector<T...>;
+
+ BOOST_PP_REPEAT(51, FUSION_VECTOR_N_ALIASES, ~)
+
+#undef FUSION_VECTOR_N_ALIASES
+}}
+
+#endif
#endif
diff --git a/boost/fusion/functional/adapter/limits.hpp b/boost/fusion/functional/adapter/limits.hpp
index cdcdf8210e..9fb5a2a2cc 100644
--- a/boost/fusion/functional/adapter/limits.hpp
+++ b/boost/fusion/functional/adapter/limits.hpp
@@ -9,16 +9,21 @@
#if !defined(BOOST_FUSION_FUNCTIONAL_ADAPTER_LIMITS_HPP_INCLUDED)
# define BOOST_FUSION_FUNCTIONAL_ADAPTER_LIMITS_HPP_INCLUDED
-# include <boost/fusion/container/vector/detail/cpp03/limits.hpp>
+# include <boost/fusion/container/vector/detail/config.hpp>
+# if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
+# include <boost/fusion/container/vector/detail/cpp03/limits.hpp>
+# endif
# if !defined(BOOST_FUSION_UNFUSED_MAX_ARITY)
# define BOOST_FUSION_UNFUSED_MAX_ARITY 6
-# elif BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY > FUSION_MAX_VECTOR_SIZE
+# elif !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR) && \
+ (BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY > FUSION_MAX_VECTOR_SIZE)
# error "BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY > FUSION_MAX_VECTOR_SIZE"
# endif
# if !defined(BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY)
# define BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY 6
-# elif BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY > FUSION_MAX_VECTOR_SIZE
+# elif !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR) && \
+ (BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY > FUSION_MAX_VECTOR_SIZE)
# error "BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY > FUSION_MAX_VECTOR_SIZE"
# endif
diff --git a/boost/fusion/functional/invocation/invoke.hpp b/boost/fusion/functional/invocation/invoke.hpp
index b79ff5b439..09f3ead87f 100644
--- a/boost/fusion/functional/invocation/invoke.hpp
+++ b/boost/fusion/functional/invocation/invoke.hpp
@@ -39,9 +39,9 @@
#include <boost/function_types/parameter_types.hpp>
#include <boost/utility/result_of.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/fusion/support/category_of.hpp>
-#include <boost/fusion/support/detail/enabler.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/sequence/intrinsic/front.hpp>
@@ -148,7 +148,7 @@ namespace boost { namespace fusion
template <typename Function, class Sequence>
struct invoke<Function, Sequence,
- typename detail::enabler<
+ typename enable_if_has_type<
typename detail::invoke_impl<
typename boost::remove_reference<Function>::type, Sequence
>::result_type
@@ -195,7 +195,7 @@ namespace boost { namespace fusion
template <typename Function, class Sequence>
struct invoke_impl<Function,Sequence,N,false,true,
- typename enabler<
+ typename enable_if_has_type<
typename boost::result_of<Function(BOOST_PP_ENUM(N,M,~)) >::type
>::type>
{
@@ -289,7 +289,7 @@ namespace boost { namespace fusion
template <typename Function, class Sequence>
struct invoke_impl<Function,Sequence,N,false,false,
- typename enabler<
+ typename enable_if_has_type<
#define L(z,j,data) typename invoke_param_types<Sequence,N>::BOOST_PP_CAT(T, j)
typename boost::result_of<Function(BOOST_PP_ENUM(N,L,~))>::type
>::type>
diff --git a/boost/fusion/functional/invocation/invoke_function_object.hpp b/boost/fusion/functional/invocation/invoke_function_object.hpp
index 3ed508dd3d..2a88eaec19 100644
--- a/boost/fusion/functional/invocation/invoke_function_object.hpp
+++ b/boost/fusion/functional/invocation/invoke_function_object.hpp
@@ -18,14 +18,12 @@
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/utility/result_of.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <boost/type_traits/remove_const.hpp>
-#include <boost/utility/result_of.hpp>
-
#include <boost/fusion/support/category_of.hpp>
-#include <boost/fusion/support/detail/enabler.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
@@ -62,7 +60,7 @@ namespace boost { namespace fusion
template <class Function, class Sequence>
struct invoke_function_object<Function, Sequence,
- typename detail::enabler<
+ typename enable_if_has_type<
typename detail::invoke_function_object_impl<
typename boost::remove_reference<Function>::type, Sequence
>::result_type
@@ -110,7 +108,7 @@ namespace boost { namespace fusion
template <class Function, class Sequence>
struct invoke_function_object_impl<Function,Sequence,N,true,
- typename enabler<
+ typename enable_if_has_type<
typename boost::result_of<Function (BOOST_PP_ENUM(N,M,~)) >::type
>::type>
{
@@ -151,7 +149,7 @@ namespace boost { namespace fusion
template <class Function, class Sequence>
struct invoke_function_object_impl<Function,Sequence,N,false,
- typename enabler<
+ typename enable_if_has_type<
typename boost::result_of<Function (BOOST_PP_ENUM(N,M,~)) >::type
>::type>
#undef M
diff --git a/boost/fusion/functional/invocation/invoke_procedure.hpp b/boost/fusion/functional/invocation/invoke_procedure.hpp
index a0fe73a6f3..971ddbfdea 100644
--- a/boost/fusion/functional/invocation/invoke_procedure.hpp
+++ b/boost/fusion/functional/invocation/invoke_procedure.hpp
@@ -20,6 +20,7 @@
#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
#include <boost/type_traits/remove_reference.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/mpl/front.hpp>
@@ -28,7 +29,6 @@
#include <boost/function_types/parameter_types.hpp>
#include <boost/fusion/support/category_of.hpp>
-#include <boost/fusion/support/detail/enabler.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
@@ -66,7 +66,7 @@ namespace boost { namespace fusion
template <typename Function, class Sequence>
struct invoke_procedure<Function, Sequence,
- typename detail::enabler<
+ typename enable_if_has_type<
typename detail::invoke_procedure_impl<
typename boost::remove_reference<Function>::type,Sequence
>::result_type
diff --git a/boost/fusion/sequence/io/detail/manip.hpp b/boost/fusion/sequence/io/detail/manip.hpp
index ec8ce304f6..68f7ab4f91 100644
--- a/boost/fusion/sequence/io/detail/manip.hpp
+++ b/boost/fusion/sequence/io/detail/manip.hpp
@@ -110,8 +110,7 @@ namespace boost { namespace fusion
{
// read a delimiter
string_type const* p = stream_data_t::get(stream);
- using namespace std;
- ws(stream);
+ std::ws(stream);
if (p)
{
diff --git a/boost/fusion/support/detail/enabler.hpp b/boost/fusion/support/detail/enabler.hpp
deleted file mode 100644
index 48b69f3227..0000000000
--- a/boost/fusion/support/detail/enabler.hpp
+++ /dev/null
@@ -1,18 +0,0 @@
-/*=============================================================================
- Copyright (c) 2015 Kohei Takahashi
-
- Use modification and distribution are subject to the Boost Software
- License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- http://www.boost.org/LICENSE_1_0.txt).
-==============================================================================*/
-#ifndef FUSION_DETAIL_ENABLER_02082015_163810
-#define FUSION_DETAIL_ENABLER_02082015_163810
-
-namespace boost { namespace fusion { namespace detail
-{
- template <typename, typename T = void>
- struct enabler { typedef T type; };
-}}}
-
-#endif
-
diff --git a/boost/fusion/support/detail/is_same_size.hpp b/boost/fusion/support/detail/is_same_size.hpp
new file mode 100644
index 0000000000..b1bf7cde41
--- /dev/null
+++ b/boost/fusion/support/detail/is_same_size.hpp
@@ -0,0 +1,29 @@
+/*=============================================================================
+ Copyright (c) 2014-2015 Kohei Takahashi
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#ifndef FUSION_IS_SAME_SIZE_10082015_1156
+#define FUSION_IS_SAME_SIZE_10082015_1156
+
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/core/enable_if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/equal_to.hpp>
+
+namespace boost { namespace fusion { namespace detail
+{
+ template <typename Sequence1, typename Sequence2, typename = void, typename = void>
+ struct is_same_size : mpl::false_ {};
+
+ template <typename Sequence1, typename Sequence2>
+ struct is_same_size<Sequence1, Sequence2,
+ typename enable_if<traits::is_sequence<Sequence1> >::type,
+ typename enable_if<traits::is_sequence<Sequence2> >::type>
+ : mpl::equal_to<result_of::size<Sequence1>, result_of::size<Sequence2> >
+ {};
+}}}
+
+#endif
diff --git a/boost/fusion/support/detail/result_of.hpp b/boost/fusion/support/detail/result_of.hpp
deleted file mode 100644
index e53ea9e354..0000000000
--- a/boost/fusion/support/detail/result_of.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2014 Joel de Guzman
-
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-==============================================================================*/
-#if !defined(FUSION_RESULT_OF_10272014_0654)
-#define FUSION_RESULT_OF_10272014_0654
-
-#include <boost/config.hpp>
-#include <boost/utility/result_of.hpp>
-
-#if !defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
-#define BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF
-#endif
-
-#if !defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/or.hpp>
-#include <boost/mpl/has_xxx.hpp>
-#endif
-
-namespace boost { namespace fusion { namespace detail
-{
- // This is a temporary workaround for result_of before we make fusion fully
- // sfinae result_of friendy, which will require some heavy lifting for some
- // low level code. So far this is used only in the fold algorithm. This will
- // be removed once we overhaul fold.
-
-#if defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
-
- template <typename Sig>
- struct result_of_with_decltype : boost::tr1_result_of<Sig> {};
-
-#else // defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
-
- BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)
- BOOST_MPL_HAS_XXX_TEMPLATE_DEF(result)
-
- template <typename Sig>
- struct result_of_with_decltype;
-
- template <typename F, typename... Args>
- struct result_of_with_decltype<F(Args...)>
- : mpl::if_<mpl::or_<has_result_type<F>, detail::has_result<F> >,
- boost::tr1_result_of<F(Args...)>,
- boost::detail::cpp0x_result_of<F(Args...)> >::type {};
-
-#endif // defined(BOOST_FUSION_NO_DECLTYPE_BASED_RESULT_OF)
-
-}}}
-
-#endif
diff --git a/boost/fusion/support/segmented_fold_until.hpp b/boost/fusion/support/segmented_fold_until.hpp
index 9e6f4a50f6..8fb09ee38d 100644
--- a/boost/fusion/support/segmented_fold_until.hpp
+++ b/boost/fusion/support/segmented_fold_until.hpp
@@ -11,11 +11,6 @@
#include <boost/type_traits/is_const.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/fusion/support/detail/segmented_fold_until_impl.hpp>
-#include <boost/fusion/view/iterator_range.hpp>
-#include <boost/fusion/sequence/intrinsic/begin.hpp>
-#include <boost/fusion/sequence/intrinsic/end.hpp>
-#include <boost/fusion/sequence/intrinsic/empty.hpp>
-#include <boost/fusion/container/list/cons.hpp>
namespace boost { namespace fusion
{
diff --git a/boost/fusion/tuple/make_tuple.hpp b/boost/fusion/tuple/make_tuple.hpp
index 0d1277366a..e5cbb3b2ac 100644
--- a/boost/fusion/tuple/make_tuple.hpp
+++ b/boost/fusion/tuple/make_tuple.hpp
@@ -13,7 +13,38 @@
///////////////////////////////////////////////////////////////////////////////
// With no variadics, we will use the C++03 version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_TUPLE)
# include <boost/fusion/tuple/detail/make_tuple.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/support/detail/as_fusion_element.hpp>
+#include <boost/fusion/tuple/tuple.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+
+namespace boost { namespace fusion
+{
+ template <typename ...T>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline tuple<typename detail::as_fusion_element<
+ typename remove_const<
+ typename remove_reference<T>::type
+ >::type
+ >::type...>
+ make_tuple(T&&... arg)
+ {
+ typedef tuple<typename detail::as_fusion_element<
+ typename remove_const<
+ typename remove_reference<T>::type
+ >::type
+ >::type...> result_type;
+ return result_type(std::forward<T>(arg)...);
+ }
+}}
+
+#endif
#endif
diff --git a/boost/fusion/tuple/tuple.hpp b/boost/fusion/tuple/tuple.hpp
index 674c369132..6ee21f56a0 100644
--- a/boost/fusion/tuple/tuple.hpp
+++ b/boost/fusion/tuple/tuple.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -13,7 +13,80 @@
///////////////////////////////////////////////////////////////////////////////
// With no variadics, we will use the C++03 version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_TUPLE)
# include <boost/fusion/tuple/detail/tuple.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/sequence/intrinsic/size.hpp>
+#include <boost/fusion/sequence/intrinsic/value_at.hpp>
+#include <boost/fusion/sequence/intrinsic/at.hpp>
+#include <boost/fusion/sequence/comparison.hpp>
+#include <boost/fusion/sequence/io.hpp>
+#include <utility>
+
+namespace boost { namespace fusion
+{
+ template <typename ...T>
+ struct tuple : vector<T...>
+ {
+ typedef vector<T...> base_type;
+
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ tuple()
+ : base_type() {}
+
+ template <typename ...U>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ tuple(tuple<U...> const& other)
+ : base_type(other) {}
+
+ template <typename ...U>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ tuple(tuple<U...>&& other)
+ : base_type(std::move(other)) {}
+
+ template <typename ...U>
+ /*BOOST_CONSTEXPR*/ BOOST_FUSION_GPU_ENABLED
+ explicit
+ tuple(U&&... args)
+ : base_type(std::forward<U>(args)...) {}
+
+ template <typename U>
+ BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ tuple& operator=(U&& rhs)
+ {
+ base_type::operator=(std::forward<U>(rhs));
+ return *this;
+ }
+ };
+
+ template <typename Tuple>
+ struct tuple_size : result_of::size<Tuple> {};
+
+ template <int N, typename Tuple>
+ struct tuple_element : result_of::value_at_c<Tuple, N> {};
+
+ template <int N, typename Tuple>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of::at_c<Tuple, N>::type
+ get(Tuple& tup)
+ {
+ return at_c<N>(tup);
+ }
+
+ template <int N, typename Tuple>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline typename result_of::at_c<Tuple const, N>::type
+ get(Tuple const& tup)
+ {
+ return at_c<N>(tup);
+ }
+}}
+
+#endif
#endif
diff --git a/boost/fusion/tuple/tuple_fwd.hpp b/boost/fusion/tuple/tuple_fwd.hpp
index 0742023403..b763acd52f 100644
--- a/boost/fusion/tuple/tuple_fwd.hpp
+++ b/boost/fusion/tuple/tuple_fwd.hpp
@@ -1,5 +1,5 @@
/*=============================================================================
- Copyright (c) 2014 Kohei Takahashi
+ Copyright (c) 2014-2015 Kohei Takahashi
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -9,11 +9,35 @@
#include <boost/config.hpp>
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
+
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR) \
+ || (defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES))
+# if defined(BOOST_FUSION_HAS_VARIADIC_TUPLE)
+# undef BOOST_FUSION_HAS_VARIADIC_TUPLE
+# endif
+#else
+# if !defined(BOOST_FUSION_HAS_VARIADIC_TUPLE)
+# define BOOST_FUSION_HAS_VARIADIC_TUPLE
+# endif
+#endif
///////////////////////////////////////////////////////////////////////////////
// With no variadics, we will use the C++03 version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_TUPLE)
# include <boost/fusion/tuple/detail/tuple_fwd.hpp>
+#else
+
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace fusion
+{
+ template <typename ...T>
+ struct tuple;
+}}
#endif
+#endif
diff --git a/boost/fusion/tuple/tuple_tie.hpp b/boost/fusion/tuple/tuple_tie.hpp
index 9202807048..a07dc0a43e 100644
--- a/boost/fusion/tuple/tuple_tie.hpp
+++ b/boost/fusion/tuple/tuple_tie.hpp
@@ -13,7 +13,26 @@
///////////////////////////////////////////////////////////////////////////////
// With no variadics, we will use the C++03 version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_TUPLE)
# include <boost/fusion/tuple/detail/tuple_tie.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/tuple/tuple.hpp>
+
+namespace boost { namespace fusion
+{
+ template <typename ...T>
+ BOOST_FUSION_GPU_ENABLED
+ inline tuple<T&...>
+ tie(T&... arg)
+ {
+ return tuple<T&...>(arg...);
+ }
+}}
+
+#endif
#endif
diff --git a/boost/fusion/view/detail/strictest_traversal.hpp b/boost/fusion/view/detail/strictest_traversal.hpp
index 9ad1f7aa85..4092ea4da6 100644
--- a/boost/fusion/view/detail/strictest_traversal.hpp
+++ b/boost/fusion/view/detail/strictest_traversal.hpp
@@ -59,7 +59,7 @@ namespace boost { namespace fusion
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
template<typename StrictestSoFar, typename Next>
- BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ BOOST_FUSION_GPU_ENABLED
typename result<strictest_traversal_impl(StrictestSoFar, Next)>::type
operator()(StrictestSoFar&&, Next&&) const;
#endif
diff --git a/boost/fusion/view/flatten_view.hpp b/boost/fusion/view/flatten_view.hpp
index dcef08dec7..25428544d6 100644
--- a/boost/fusion/view/flatten_view.hpp
+++ b/boost/fusion/view/flatten_view.hpp
@@ -1,9 +1,9 @@
-/*//////////////////////////////////////////////////////////////////////////////
+/*==============================================================================
Copyright (c) 2013 Jamboree
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
+==============================================================================*/
#ifndef BOOST_FUSION_SEQUENCE_FLATTEN_VIEW_HPP_INCLUDED
#define BOOST_FUSION_SEQUENCE_FLATTEN_VIEW_HPP_INCLUDED
diff --git a/boost/fusion/view/flatten_view/flatten_view.hpp b/boost/fusion/view/flatten_view/flatten_view.hpp
index 8e40158d1c..401f65dc86 100644
--- a/boost/fusion/view/flatten_view/flatten_view.hpp
+++ b/boost/fusion/view/flatten_view/flatten_view.hpp
@@ -1,9 +1,9 @@
-/*//////////////////////////////////////////////////////////////////////////////
+/*==============================================================================
Copyright (c) 2013 Jamboree
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
+==============================================================================*/
#ifndef BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED
#define BOOST_FUSION_FLATTEN_VIEW_HPP_INCLUDED
diff --git a/boost/fusion/view/flatten_view/flatten_view_iterator.hpp b/boost/fusion/view/flatten_view/flatten_view_iterator.hpp
index 1ecf692822..be115d910b 100644
--- a/boost/fusion/view/flatten_view/flatten_view_iterator.hpp
+++ b/boost/fusion/view/flatten_view/flatten_view_iterator.hpp
@@ -1,9 +1,9 @@
-/*//////////////////////////////////////////////////////////////////////////////
+/*==============================================================================
Copyright (c) 2013 Jamboree
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-//////////////////////////////////////////////////////////////////////////////*/
+==============================================================================*/
#ifndef BOOST_FUSION_FLATTEN_VIEW_ITERATOR_HPP_INCLUDED
#define BOOST_FUSION_FLATTEN_VIEW_ITERATOR_HPP_INCLUDED
diff --git a/boost/fusion/view/nview/detail/advance_impl.hpp b/boost/fusion/view/nview/detail/advance_impl.hpp
index 7c74a386bb..c46414337f 100644
--- a/boost/fusion/view/nview/detail/advance_impl.hpp
+++ b/boost/fusion/view/nview/detail/advance_impl.hpp
@@ -1,7 +1,7 @@
/*=============================================================================
Copyright (c) 2009 Hartmut Kaiser
- Distributed under the Boost Software License, Version 1.0. (See accompanying
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
@@ -9,7 +9,6 @@
#define BOOST_FUSION_NVIEW_ADVANCE_IMPL_SEP_24_2009_0212PM
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/advance.hpp>
#include <boost/fusion/iterator/advance.hpp>
namespace boost { namespace fusion
@@ -30,11 +29,11 @@ namespace boost { namespace fusion
template<typename Iterator, typename Dist>
struct apply
{
- typedef typename Iterator::first_type::iterator_type iterator_type;
+ typedef typename Iterator::first_type iterator_type;
typedef typename Iterator::sequence_type sequence_type;
- typedef nview_iterator<sequence_type,
- typename mpl::advance<iterator_type, Dist>::type> type;
+ typedef nview_iterator<sequence_type,
+ typename result_of::advance<iterator_type, Dist>::type> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
diff --git a/boost/fusion/view/nview/detail/at_impl.hpp b/boost/fusion/view/nview/detail/at_impl.hpp
index b9f41defcd..9f8c163708 100644
--- a/boost/fusion/view/nview/detail/at_impl.hpp
+++ b/boost/fusion/view/nview/detail/at_impl.hpp
@@ -10,6 +10,7 @@
#include <boost/fusion/support/config.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
+#include <boost/fusion/sequence/intrinsic/value_at.hpp>
namespace boost { namespace fusion
{
@@ -29,7 +30,7 @@ namespace boost { namespace fusion
typedef typename Sequence::sequence_type sequence_type;
typedef typename Sequence::index_type index_type;
- typedef typename result_of::at<index_type, N>::type index;
+ typedef typename result_of::value_at<index_type, N>::type index;
typedef typename result_of::at<sequence_type, index>::type type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
diff --git a/boost/fusion/view/nview/detail/begin_impl.hpp b/boost/fusion/view/nview/detail/begin_impl.hpp
index bab5e221c9..99e6319ea8 100644
--- a/boost/fusion/view/nview/detail/begin_impl.hpp
+++ b/boost/fusion/view/nview/detail/begin_impl.hpp
@@ -9,7 +9,6 @@
#define BOOST_FUSION_NVIEW_BEGIN_IMPL_SEP_23_2009_1036PM
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/begin.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
namespace boost { namespace fusion
@@ -32,8 +31,8 @@ namespace boost { namespace fusion
{
typedef typename Sequence::index_type index_type;
- typedef nview_iterator<Sequence,
- typename mpl::begin<index_type>::type> type;
+ typedef nview_iterator<Sequence,
+ typename result_of::begin<index_type>::type> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Sequence& s)
diff --git a/boost/fusion/view/nview/detail/cpp03/nview_impl.hpp b/boost/fusion/view/nview/detail/cpp03/nview_impl.hpp
index 08c6c9d738..0bcea9bb91 100644
--- a/boost/fusion/view/nview/detail/cpp03/nview_impl.hpp
+++ b/boost/fusion/view/nview/detail/cpp03/nview_impl.hpp
@@ -17,10 +17,13 @@
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/mpl/vector_c.hpp>
+#include <boost/fusion/adapted/mpl.hpp>
+#include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
#define BOOST_PP_ITERATION_PARAMS_1 \
(3, (1, FUSION_MAX_VECTOR_SIZE, \
- "boost/fusion/view/nview/detail/cpp03/nview_impl.hpp")) \
+ "boost/fusion/view/nview/detail/cpp03/nview_impl.hpp")) \
/**/
///////////////////////////////////////////////////////////////////////////////
diff --git a/boost/fusion/view/nview/detail/deref_impl.hpp b/boost/fusion/view/nview/detail/deref_impl.hpp
index 85991021b6..57654aa057 100644
--- a/boost/fusion/view/nview/detail/deref_impl.hpp
+++ b/boost/fusion/view/nview/detail/deref_impl.hpp
@@ -9,8 +9,8 @@
#define BOOST_FUSION_NVIEW_DEREF_IMPL_SEP_24_2009_0818AM
#include <boost/fusion/support/config.hpp>
-#include <boost/fusion/iterator/deref.hpp>
-#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/iterator/value_of.hpp>
+#include <boost/fusion/sequence/intrinsic/at.hpp>
namespace boost { namespace fusion
{
@@ -30,7 +30,7 @@ namespace boost { namespace fusion
typedef typename Iterator::first_type first_type;
typedef typename Iterator::sequence_type sequence_type;
- typedef typename result_of::deref<first_type>::type index;
+ typedef typename result_of::value_of<first_type>::type index;
typedef typename result_of::at<
typename sequence_type::sequence_type, index>::type type;
diff --git a/boost/fusion/view/nview/detail/end_impl.hpp b/boost/fusion/view/nview/detail/end_impl.hpp
index 0a6efe560d..810aea917a 100644
--- a/boost/fusion/view/nview/detail/end_impl.hpp
+++ b/boost/fusion/view/nview/detail/end_impl.hpp
@@ -9,7 +9,6 @@
#define BOOST_FUSION_NVIEW_END_IMPL_SEP_24_2009_0140PM
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/end.hpp>
#include <boost/fusion/sequence/intrinsic/end.hpp>
namespace boost { namespace fusion
@@ -33,8 +32,8 @@ namespace boost { namespace fusion
{
typedef typename Sequence::index_type index_type;
- typedef nview_iterator<Sequence,
- typename mpl::end<index_type>::type> type;
+ typedef nview_iterator<Sequence,
+ typename result_of::end<index_type>::type> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type call(Sequence& s)
diff --git a/boost/fusion/view/nview/detail/next_impl.hpp b/boost/fusion/view/nview/detail/next_impl.hpp
index 3c30409647..821d9c3768 100644
--- a/boost/fusion/view/nview/detail/next_impl.hpp
+++ b/boost/fusion/view/nview/detail/next_impl.hpp
@@ -9,7 +9,7 @@
#define BOOST_FUSION_NVIEW_NEXT_IMPL_SEP_24_2009_0116PM
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/next.hpp>
+#include <boost/fusion/iterator/next.hpp>
namespace boost { namespace fusion
{
@@ -27,13 +27,13 @@ namespace boost { namespace fusion
struct next_impl<nview_iterator_tag>
{
template <typename Iterator>
- struct apply
+ struct apply
{
- typedef typename Iterator::first_type::iterator_type first_type;
+ typedef typename Iterator::first_type first_type;
typedef typename Iterator::sequence_type sequence_type;
typedef nview_iterator<sequence_type,
- typename mpl::next<first_type>::type> type;
+ typename result_of::next<first_type>::type> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
diff --git a/boost/fusion/view/nview/detail/nview_impl.hpp b/boost/fusion/view/nview/detail/nview_impl.hpp
index 40674e3551..0c75a66afa 100644
--- a/boost/fusion/view/nview/detail/nview_impl.hpp
+++ b/boost/fusion/view/nview/detail/nview_impl.hpp
@@ -8,11 +8,43 @@
#define BOOST_FUSION_NVIEW_IMPL_17122014_1948
#include <boost/fusion/support/config.hpp>
+#include <boost/fusion/container/vector/detail/config.hpp>
///////////////////////////////////////////////////////////////////////////////
// Without variadics, we will use the PP version
///////////////////////////////////////////////////////////////////////////////
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
# include <boost/fusion/view/nview/detail/cpp03/nview_impl.hpp>
+#else
+///////////////////////////////////////////////////////////////////////////////
+// C++11 interface
+///////////////////////////////////////////////////////////////////////////////
+#include <boost/fusion/container/vector.hpp>
+#include <boost/mpl/int.hpp>
+
+namespace boost { namespace fusion
+{
+ namespace result_of
+ {
+ template <typename Sequence, int ...I>
+ struct as_nview
+ {
+ typedef vector<mpl::int_<I>...> index_type;
+ typedef nview<Sequence, index_type> type;
+ };
+ }
+
+ template <int ...I, typename Sequence>
+ BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
+ inline nview<Sequence, vector<mpl::int_<I>...> >
+ as_nview(Sequence& s)
+ {
+ typedef vector<mpl::int_<I>...> index_type;
+ return nview<Sequence, index_type>(s);
+ }
+}}
+
+#endif
#endif
diff --git a/boost/fusion/view/nview/detail/prior_impl.hpp b/boost/fusion/view/nview/detail/prior_impl.hpp
index 470c5bd323..29b63f5692 100644
--- a/boost/fusion/view/nview/detail/prior_impl.hpp
+++ b/boost/fusion/view/nview/detail/prior_impl.hpp
@@ -9,7 +9,7 @@
#define BOOST_FUSION_NVIEW_PRIOR_IMPL_SEP_24_2009_0142PM
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/prior.hpp>
+#include <boost/fusion/iterator/prior.hpp>
namespace boost { namespace fusion
{
@@ -27,13 +27,13 @@ namespace boost { namespace fusion
struct prior_impl<nview_iterator_tag>
{
template <typename Iterator>
- struct apply
+ struct apply
{
- typedef typename Iterator::first_type::iterator_type first_type;
+ typedef typename Iterator::first_type first_type;
typedef typename Iterator::sequence_type sequence_type;
typedef nview_iterator<sequence_type,
- typename mpl::prior<first_type>::type> type;
+ typename result_of::prior<first_type>::type> type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static type
diff --git a/boost/fusion/view/nview/nview.hpp b/boost/fusion/view/nview/nview.hpp
index 2e257c81de..e5a4be8ab7 100644
--- a/boost/fusion/view/nview/nview.hpp
+++ b/boost/fusion/view/nview/nview.hpp
@@ -9,19 +9,15 @@
#define BOOST_FUSION_NVIEW_SEP_23_2009_0948PM
#include <boost/fusion/support/config.hpp>
-#include <boost/mpl/size.hpp>
#include <boost/mpl/if.hpp>
-#include <boost/mpl/vector_c.hpp>
-#include <boost/utility/result_of.hpp>
-#include <boost/type_traits/remove_reference.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/fusion/support/is_view.hpp>
-#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/support/sequence_base.hpp>
#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/view/transform_view.hpp>
#include <boost/config.hpp>
@@ -99,7 +95,7 @@ namespace boost { namespace fusion
typedef mpl::true_ is_view;
typedef Indicies index_type;
- typedef typename mpl::size<Indicies>::type size;
+ typedef typename result_of::size<Indicies>::type size;
typedef typename mpl::if_<
is_const<Sequence>, detail::addconstref, detail::addref
diff --git a/boost/fusion/view/nview/nview_iterator.hpp b/boost/fusion/view/nview/nview_iterator.hpp
index aeaf4620b8..42e634e521 100644
--- a/boost/fusion/view/nview/nview_iterator.hpp
+++ b/boost/fusion/view/nview/nview_iterator.hpp
@@ -12,7 +12,6 @@
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/sequence/intrinsic/begin.hpp>
#include <boost/fusion/sequence/intrinsic/end.hpp>
-#include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
#include <boost/fusion/view/nview/detail/size_impl.hpp>
#include <boost/fusion/view/nview/detail/begin_impl.hpp>
@@ -40,7 +39,7 @@ namespace boost { namespace fusion
typedef random_access_traversal_tag category;
typedef Sequence sequence_type;
- typedef mpl_iterator<Pos> first_type;
+ typedef Pos first_type;
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
explicit nview_iterator(Sequence& in_seq)
diff --git a/boost/geometry/algorithms/centroid.hpp b/boost/geometry/algorithms/centroid.hpp
index 1b99ab2ef3..8ef017a3f1 100644
--- a/boost/geometry/algorithms/centroid.hpp
+++ b/boost/geometry/algorithms/centroid.hpp
@@ -220,19 +220,22 @@ struct centroid_range_state
iterator_type it = boost::begin(view);
iterator_type end = boost::end(view);
- typename PointTransformer::result_type
- previous_pt = transformer.apply(*it);
-
- for ( ++it ; it != end ; ++it)
+ if (it != end)
{
typename PointTransformer::result_type
- pt = transformer.apply(*it);
+ previous_pt = transformer.apply(*it);
- strategy.apply(static_cast<point_type const&>(previous_pt),
- static_cast<point_type const&>(pt),
- state);
-
- previous_pt = pt;
+ for ( ++it ; it != end ; ++it)
+ {
+ typename PointTransformer::result_type
+ pt = transformer.apply(*it);
+
+ strategy.apply(static_cast<point_type const&>(previous_pt),
+ static_cast<point_type const&>(pt),
+ state);
+
+ previous_pt = pt;
+ }
}
}
};
diff --git a/boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp b/boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp
index b25bcc7fb5..606726f338 100644
--- a/boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp
+++ b/boost/geometry/algorithms/detail/buffer/buffer_inserter.hpp
@@ -31,6 +31,7 @@
#include <boost/geometry/algorithms/detail/buffer/line_line_intersection.hpp>
#include <boost/geometry/algorithms/detail/buffer/parallel_continue.hpp>
+#include <boost/geometry/algorithms/assign.hpp>
#include <boost/geometry/algorithms/num_interior_rings.hpp>
#include <boost/geometry/algorithms/simplify.hpp>
@@ -135,6 +136,7 @@ struct buffer_range
RobustPolicy const& )
{
output_point_type intersection_point;
+ geometry::assign_zero(intersection_point);
strategy::buffer::join_selector join
= get_join_type(penultimate_input, previous_input, input);
@@ -392,7 +394,7 @@ inline void buffer_point(Point const& point, Collection& collection,
point_strategy.apply(point, distance_strategy, range_out);
collection.add_piece(strategy::buffer::buffered_point, range_out, false);
collection.set_piece_center(point);
- collection.finish_ring();
+ collection.finish_ring(strategy::buffer::result_normal);
}
@@ -680,7 +682,7 @@ struct buffer_inserter<linestring_tag, Linestring, Polygon>
distance, side_strategy, join_strategy, end_strategy, robust_policy,
first_p1);
}
- collection.finish_ring();
+ collection.finish_ring(code);
}
if (code == strategy::buffer::result_no_output && n >= 1)
{
@@ -740,12 +742,7 @@ private:
join_strategy, end_strategy, point_strategy,
robust_policy);
- if (code == strategy::buffer::result_error_numerical)
- {
- collection.abort_ring();
- return;
- }
- collection.finish_ring(is_interior);
+ collection.finish_ring(code, is_interior);
}
}
@@ -805,14 +802,8 @@ public:
join_strategy, end_strategy, point_strategy,
robust_policy);
- if (code == strategy::buffer::result_error_numerical)
- {
- collection.abort_ring();
- }
- else
- {
- collection.finish_ring(false, geometry::num_interior_rings(polygon) > 0u);
- }
+ collection.finish_ring(code, false,
+ geometry::num_interior_rings(polygon) > 0u);
}
apply_interior_rings(interior_rings(polygon),
diff --git a/boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp b/boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp
index 545d89cb9b..b580cf5b9b 100644
--- a/boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp
+++ b/boost/geometry/algorithms/detail/buffer/buffered_piece_collection.hpp
@@ -860,8 +860,15 @@ struct buffered_piece_collection
m_robust_policy);
}
- inline void finish_ring(bool is_interior = false, bool has_interiors = false)
+ inline void finish_ring(strategy::buffer::result_code code,
+ bool is_interior = false, bool has_interiors = false)
{
+ if (code == strategy::buffer::result_error_numerical)
+ {
+ abort_ring();
+ return;
+ }
+
if (m_first_piece_index == -1)
{
return;
@@ -1188,7 +1195,7 @@ struct buffered_piece_collection
typename cs_tag<Ring>::type
>::type side_strategy_type;
- enrich_intersection_points<false, false>(m_turns,
+ enrich_intersection_points<false, false, overlay_union>(m_turns,
detail::overlay::operation_union,
offsetted_rings, offsetted_rings,
m_robust_policy, side_strategy_type());
diff --git a/boost/geometry/algorithms/detail/buffer/buffered_ring.hpp b/boost/geometry/algorithms/detail/buffer/buffered_ring.hpp
index 19c91544ac..29a618b923 100644
--- a/boost/geometry/algorithms/detail/buffer/buffered_ring.hpp
+++ b/boost/geometry/algorithms/detail/buffer/buffered_ring.hpp
@@ -96,36 +96,36 @@ namespace traits
template <typename Ring>
-struct tag<detail::buffer::buffered_ring<Ring> >
+struct tag<geometry::detail::buffer::buffered_ring<Ring> >
{
typedef ring_tag type;
};
template <typename Ring>
-struct point_order<detail::buffer::buffered_ring<Ring> >
+struct point_order<geometry::detail::buffer::buffered_ring<Ring> >
{
static const order_selector value = geometry::point_order<Ring>::value;
};
template <typename Ring>
-struct closure<detail::buffer::buffered_ring<Ring> >
+struct closure<geometry::detail::buffer::buffered_ring<Ring> >
{
static const closure_selector value = geometry::closure<Ring>::value;
};
template <typename Ring>
-struct point_type<detail::buffer::buffered_ring_collection<Ring> >
+struct point_type<geometry::detail::buffer::buffered_ring_collection<Ring> >
{
typedef typename geometry::point_type<Ring>::type type;
};
template <typename Ring>
-struct tag<detail::buffer::buffered_ring_collection<Ring> >
+struct tag<geometry::detail::buffer::buffered_ring_collection<Ring> >
{
- typedef detail::buffer::buffered_ring_collection_tag type;
+ typedef geometry::detail::buffer::buffered_ring_collection_tag type;
};
diff --git a/boost/geometry/algorithms/detail/disjoint/box_box.hpp b/boost/geometry/algorithms/detail/disjoint/box_box.hpp
index 84671f257e..6074af982b 100644
--- a/boost/geometry/algorithms/detail/disjoint/box_box.hpp
+++ b/boost/geometry/algorithms/detail/disjoint/box_box.hpp
@@ -1,12 +1,12 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
-// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
-// This file was modified by Oracle on 2013-2014.
-// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+// This file was modified by Oracle on 2013-2015.
+// Modifications copyright (c) 2013-2015, Oracle and/or its affiliates.
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
@@ -36,7 +36,6 @@ namespace boost { namespace geometry
namespace detail { namespace disjoint
{
-
template
<
typename Box1, typename Box2,
diff --git a/boost/geometry/algorithms/detail/disjoint/point_box.hpp b/boost/geometry/algorithms/detail/disjoint/point_box.hpp
index 12213db056..73b7b70990 100644
--- a/boost/geometry/algorithms/detail/disjoint/point_box.hpp
+++ b/boost/geometry/algorithms/detail/disjoint/point_box.hpp
@@ -1,12 +1,12 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
-// Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland
-// This file was modified by Oracle on 2013-2014.
-// Modifications copyright (c) 2013-2014, Oracle and/or its affiliates.
+// This file was modified by Oracle on 2013-2015.
+// Modifications copyright (c) 2013-2015, Oracle and/or its affiliates.
// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
@@ -29,7 +29,6 @@
#include <boost/geometry/algorithms/dispatch/disjoint.hpp>
-
namespace boost { namespace geometry
{
diff --git a/boost/geometry/algorithms/detail/distance/segment_to_box.hpp b/boost/geometry/algorithms/detail/distance/segment_to_box.hpp
index 783699ee0a..fa95152476 100644
--- a/boost/geometry/algorithms/detail/distance/segment_to_box.hpp
+++ b/boost/geometry/algorithms/detail/distance/segment_to_box.hpp
@@ -562,11 +562,12 @@ private:
// assert that the segment has non-negative slope
BOOST_GEOMETRY_ASSERT( ( math::equals(geometry::get<0>(p0), geometry::get<0>(p1))
- && geometry::get<1>(p0) < geometry::get<1>(p1))
- ||
- ( geometry::get<0>(p0) < geometry::get<0>(p1)
- && geometry::get<1>(p0) <= geometry::get<1>(p1) )
- );
+ && geometry::get<1>(p0) < geometry::get<1>(p1))
+ ||
+ ( geometry::get<0>(p0) < geometry::get<0>(p1)
+ && geometry::get<1>(p0) <= geometry::get<1>(p1) )
+ || geometry::has_nan_coordinate(p0)
+ || geometry::has_nan_coordinate(p1));
ReturnType result(0);
@@ -617,8 +618,10 @@ private:
typedef compare_less_equal<ReturnType, false> greater_equal;
// assert that the segment has negative slope
- BOOST_GEOMETRY_ASSERT( geometry::get<0>(p0) < geometry::get<0>(p1)
- && geometry::get<1>(p0) > geometry::get<1>(p1) );
+ BOOST_GEOMETRY_ASSERT( ( geometry::get<0>(p0) < geometry::get<0>(p1)
+ && geometry::get<1>(p0) > geometry::get<1>(p1) )
+ || geometry::has_nan_coordinate(p0)
+ || geometry::has_nan_coordinate(p1) );
ReturnType result(0);
@@ -665,7 +668,9 @@ public:
PPStrategy const& pp_strategy,
PSStrategy const& ps_strategy)
{
- BOOST_GEOMETRY_ASSERT( geometry::less<SegmentPoint>()(p0, p1) );
+ BOOST_GEOMETRY_ASSERT( geometry::less<SegmentPoint>()(p0, p1)
+ || geometry::has_nan_coordinate(p0)
+ || geometry::has_nan_coordinate(p1) );
if (geometry::get<0>(p0) < geometry::get<0>(p1)
&& geometry::get<1>(p0) > geometry::get<1>(p1))
diff --git a/boost/geometry/algorithms/detail/expand_by_epsilon.hpp b/boost/geometry/algorithms/detail/expand_by_epsilon.hpp
new file mode 100644
index 0000000000..7af08ee371
--- /dev/null
+++ b/boost/geometry/algorithms/detail/expand_by_epsilon.hpp
@@ -0,0 +1,113 @@
+// Boost.Geometry
+
+// Copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_EXPAND_BY_EPSILON_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_EXPAND_BY_EPSILON_HPP
+
+#include <cstddef>
+#include <algorithm>
+
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+
+#include <boost/geometry/util/math.hpp>
+
+#include <boost/geometry/views/detail/indexed_point_view.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace expand
+{
+
+template
+<
+ typename Point,
+ template <typename> class PlusOrMinus,
+ std::size_t I = 0,
+ std::size_t D = dimension<Point>::value,
+ bool Enable = boost::is_floating_point
+ <
+ typename coordinate_type<Point>::type
+ >::value
+>
+struct corner_by_epsilon
+{
+ static inline void apply(Point & point)
+ {
+ typedef typename coordinate_type<Point>::type coord_type;
+ coord_type const coord = get<I>(point);
+ coord_type const eps = math::scaled_epsilon(coord);
+
+ set<I>(point, PlusOrMinus<coord_type>()(coord, eps));
+
+ corner_by_epsilon<Point, PlusOrMinus, I+1>::apply(point);
+ }
+};
+
+template
+<
+ typename Point,
+ template <typename> class PlusOrMinus,
+ std::size_t I,
+ std::size_t D
+>
+struct corner_by_epsilon<Point, PlusOrMinus, I, D, false>
+{
+ static inline void apply(Point const&) {}
+};
+
+template
+<
+ typename Point,
+ template <typename> class PlusOrMinus,
+ std::size_t D,
+ bool Enable
+>
+struct corner_by_epsilon<Point, PlusOrMinus, D, D, Enable>
+{
+ static inline void apply(Point const&) {}
+};
+
+template
+<
+ typename Point,
+ template <typename> class PlusOrMinus,
+ std::size_t D
+>
+struct corner_by_epsilon<Point, PlusOrMinus, D, D, false>
+{
+ static inline void apply(Point const&) {}
+};
+
+} // namespace expand
+
+template <typename Box>
+inline void expand_by_epsilon(Box & box)
+{
+ typedef detail::indexed_point_view<Box, min_corner> min_type;
+ min_type min_point(box);
+ expand::corner_by_epsilon<min_type, std::minus>::apply(min_point);
+
+ typedef detail::indexed_point_view<Box, max_corner> max_type;
+ max_type max_point(box);
+ expand::corner_by_epsilon<max_type, std::plus>::apply(max_point);
+}
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_EXPAND_EXPAND_BY_EPSILON_HPP
diff --git a/boost/geometry/algorithms/detail/is_simple/areal.hpp b/boost/geometry/algorithms/detail/is_simple/areal.hpp
index 623632c44e..a2322e4831 100644
--- a/boost/geometry/algorithms/detail/is_simple/areal.hpp
+++ b/boost/geometry/algorithms/detail/is_simple/areal.hpp
@@ -40,11 +40,11 @@ struct is_simple_ring
static inline bool apply(Ring const& ring)
{
simplicity_failure_policy policy;
- return
- !detail::is_valid::has_duplicates
- <
- Ring, geometry::closure<Ring>::value
- >::apply(ring, policy);
+ return ! boost::empty(ring)
+ && ! detail::is_valid::has_duplicates
+ <
+ Ring, geometry::closure<Ring>::value
+ >::apply(ring, policy);
}
};
@@ -128,7 +128,7 @@ struct is_simple<MultiPolygon, multi_polygon_tag>
<
typename boost::range_value<MultiPolygon>::type
>,
- false // do not allow empty multi-polygon
+ true // allow empty multi-polygon
>::apply(boost::begin(multipolygon), boost::end(multipolygon));
}
};
diff --git a/boost/geometry/algorithms/detail/is_simple/linear.hpp b/boost/geometry/algorithms/detail/is_simple/linear.hpp
index 0f77a49498..16d7b3a803 100644
--- a/boost/geometry/algorithms/detail/is_simple/linear.hpp
+++ b/boost/geometry/algorithms/detail/is_simple/linear.hpp
@@ -235,7 +235,8 @@ struct is_simple_linestring
static inline bool apply(Linestring const& linestring)
{
simplicity_failure_policy policy;
- return ! detail::is_valid::has_duplicates
+ return ! boost::empty(linestring)
+ && ! detail::is_valid::has_duplicates
<
Linestring, closed
>::apply(linestring, policy)
@@ -263,7 +264,7 @@ struct is_simple_multilinestring
typename boost::range_value<MultiLinestring>::type,
false // do not compute self-intersections
>,
- false // do not allow empty multilinestring
+ true // allow empty multilinestring
>::apply(boost::begin(multilinestring),
boost::end(multilinestring))
)
diff --git a/boost/geometry/algorithms/detail/is_simple/multipoint.hpp b/boost/geometry/algorithms/detail/is_simple/multipoint.hpp
index 71c9e6ba90..f9f43d1cdb 100644
--- a/boost/geometry/algorithms/detail/is_simple/multipoint.hpp
+++ b/boost/geometry/algorithms/detail/is_simple/multipoint.hpp
@@ -40,9 +40,9 @@ struct is_simple_multipoint
{
static inline bool apply(MultiPoint const& multipoint)
{
- if ( boost::size(multipoint) == 0 )
+ if (boost::empty(multipoint))
{
- return false;
+ return true;
}
MultiPoint mp(multipoint);
diff --git a/boost/geometry/algorithms/detail/is_valid/box.hpp b/boost/geometry/algorithms/detail/is_valid/box.hpp
index e7a67252ba..863ce625fe 100644
--- a/boost/geometry/algorithms/detail/is_valid/box.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/box.hpp
@@ -20,6 +20,7 @@
#include <boost/geometry/core/coordinate_dimension.hpp>
#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp>
#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
@@ -66,6 +67,20 @@ struct has_valid_corners<Box, 0>
}
};
+
+template <typename Box>
+struct is_valid_box
+{
+ template <typename VisitPolicy>
+ static inline bool apply(Box const& box, VisitPolicy& visitor)
+ {
+ return
+ ! has_invalid_coordinate<Box>::apply(box, visitor)
+ &&
+ has_valid_corners<Box, dimension<Box>::value>::apply(box, visitor);
+ }
+};
+
}} // namespace detail::is_valid
#endif // DOXYGEN_NO_DETAIL
@@ -85,7 +100,7 @@ namespace dispatch
// Reference (for polygon validity): OGC 06-103r4 (6.1.11.1)
template <typename Box>
struct is_valid<Box, box_tag>
- : detail::is_valid::has_valid_corners<Box, dimension<Box>::value>
+ : detail::is_valid::is_valid_box<Box>
{};
diff --git a/boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp b/boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp
new file mode 100644
index 0000000000..6e6823d62f
--- /dev/null
+++ b/boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp
@@ -0,0 +1,151 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_INVALID_COORDINATE_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_INVALID_COORDINATE_HPP
+
+#include <cstddef>
+
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/core/point_type.hpp>
+
+#include <boost/geometry/util/has_non_finite_coordinate.hpp>
+
+#include <boost/geometry/iterators/point_iterator.hpp>
+#include <boost/geometry/views/detail/indexed_point_view.hpp>
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace is_valid
+{
+
+struct always_valid
+{
+ template <typename Geometry, typename VisitPolicy>
+ static inline bool apply(Geometry const&, VisitPolicy& visitor)
+ {
+ return ! visitor.template apply<no_failure>();
+ }
+};
+
+struct point_has_invalid_coordinate
+{
+ template <typename Point, typename VisitPolicy>
+ static inline bool apply(Point const& point, VisitPolicy& visitor)
+ {
+ boost::ignore_unused(visitor);
+
+ return
+ geometry::has_non_finite_coordinate(point)
+ ?
+ (! visitor.template apply<failure_invalid_coordinate>())
+ :
+ (! visitor.template apply<no_failure>());
+ }
+
+ template <typename Point>
+ static inline bool apply(Point const& point)
+ {
+ return geometry::has_non_finite_coordinate(point);
+ }
+};
+
+struct indexed_has_invalid_coordinate
+{
+ template <typename Geometry, typename VisitPolicy>
+ static inline bool apply(Geometry const& geometry, VisitPolicy& visitor)
+ {
+ geometry::detail::indexed_point_view<Geometry const, 0> p0(geometry);
+ geometry::detail::indexed_point_view<Geometry const, 1> p1(geometry);
+
+ return point_has_invalid_coordinate::apply(p0, visitor)
+ || point_has_invalid_coordinate::apply(p1, visitor);
+ }
+};
+
+
+struct range_has_invalid_coordinate
+{
+ struct point_has_valid_coordinates
+ {
+ template <typename Point>
+ static inline bool apply(Point const& point)
+ {
+ return ! point_has_invalid_coordinate::apply(point);
+ }
+ };
+
+ template <typename Geometry, typename VisitPolicy>
+ static inline bool apply(Geometry const& geometry, VisitPolicy& visitor)
+ {
+ boost::ignore_unused(visitor);
+
+ bool const has_valid_coordinates = detail::check_iterator_range
+ <
+ point_has_valid_coordinates,
+ true // do not consider an empty range as problematic
+ >::apply(geometry::points_begin(geometry),
+ geometry::points_end(geometry));
+
+ return has_valid_coordinates
+ ?
+ (! visitor.template apply<no_failure>())
+ :
+ (! visitor.template apply<failure_invalid_coordinate>());
+ }
+};
+
+
+template
+<
+ typename Geometry,
+ typename Tag = typename tag<Geometry>::type,
+ bool HasFloatingPointCoordinates = boost::is_floating_point
+ <
+ typename coordinate_type<Geometry>::type
+ >::value
+>
+struct has_invalid_coordinate
+ : range_has_invalid_coordinate
+{};
+
+template <typename Geometry, typename Tag>
+struct has_invalid_coordinate<Geometry, Tag, false>
+ : always_valid
+{};
+
+template <typename Point>
+struct has_invalid_coordinate<Point, point_tag, true>
+ : point_has_invalid_coordinate
+{};
+
+template <typename Segment>
+struct has_invalid_coordinate<Segment, segment_tag, true>
+ : indexed_has_invalid_coordinate
+{};
+
+template <typename Box>
+struct has_invalid_coordinate<Box, box_tag, true>
+ : indexed_has_invalid_coordinate
+{};
+
+
+}} // namespace detail::is_valid
+#endif // DOXYGEN_NO_DETAIL
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_HAS_INVALID_COORDINATE_HPP
diff --git a/boost/geometry/algorithms/detail/is_valid/linear.hpp b/boost/geometry/algorithms/detail/is_valid/linear.hpp
index e30064faf0..a49e077237 100644
--- a/boost/geometry/algorithms/detail/is_valid/linear.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/linear.hpp
@@ -25,6 +25,7 @@
#include <boost/geometry/algorithms/equals.hpp>
#include <boost/geometry/algorithms/validity_failure_type.hpp>
#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp>
#include <boost/geometry/algorithms/detail/is_valid/has_spikes.hpp>
#include <boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp>
@@ -46,6 +47,11 @@ struct is_valid_linestring
static inline bool apply(Linestring const& linestring,
VisitPolicy& visitor)
{
+ if (has_invalid_coordinate<Linestring>::apply(linestring, visitor))
+ {
+ return false;
+ }
+
if (boost::size(linestring) < 2)
{
return visitor.template apply<failure_few_points>();
diff --git a/boost/geometry/algorithms/detail/is_valid/pointlike.hpp b/boost/geometry/algorithms/detail/is_valid/pointlike.hpp
index e51ab74643..51035f7a73 100644
--- a/boost/geometry/algorithms/detail/is_valid/pointlike.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/pointlike.hpp
@@ -17,6 +17,7 @@
#include <boost/geometry/core/tags.hpp>
#include <boost/geometry/algorithms/validity_failure_type.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp>
#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
#include <boost/geometry/util/condition.hpp>
@@ -36,10 +37,13 @@ template <typename Point>
struct is_valid<Point, point_tag>
{
template <typename VisitPolicy>
- static inline bool apply(Point const&, VisitPolicy& visitor)
+ static inline bool apply(Point const& point, VisitPolicy& visitor)
{
boost::ignore_unused(visitor);
- return visitor.template apply<no_failure>();
+ return ! detail::is_valid::has_invalid_coordinate
+ <
+ Point
+ >::apply(point, visitor);
}
};
@@ -63,7 +67,10 @@ struct is_valid<MultiPoint, multi_point_tag, AllowEmptyMultiGeometries>
{
// we allow empty multi-geometries, so an empty multipoint
// is considered valid
- return visitor.template apply<no_failure>();
+ return ! detail::is_valid::has_invalid_coordinate
+ <
+ MultiPoint
+ >::apply(multipoint, visitor);
}
else
{
diff --git a/boost/geometry/algorithms/detail/is_valid/polygon.hpp b/boost/geometry/algorithms/detail/is_valid/polygon.hpp
index 6e87273aa1..bbe8e8fc39 100644
--- a/boost/geometry/algorithms/detail/is_valid/polygon.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/polygon.hpp
@@ -11,6 +11,9 @@
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_VALID_POLYGON_HPP
#include <cstddef>
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
+#include <iostream>
+#endif // BOOST_GEOMETRY_TEST_DEBUG
#include <algorithm>
#include <deque>
@@ -327,7 +330,9 @@ protected:
g.add_edge(v2, vip);
}
+#ifdef BOOST_GEOMETRY_TEST_DEBUG
debug_print_complement_graph(std::cout, g);
+#endif // BOOST_GEOMETRY_TEST_DEBUG
if (g.has_cycles())
{
diff --git a/boost/geometry/algorithms/detail/is_valid/ring.hpp b/boost/geometry/algorithms/detail/is_valid/ring.hpp
index c35e843418..925c03a472 100644
--- a/boost/geometry/algorithms/detail/is_valid/ring.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/ring.hpp
@@ -30,8 +30,9 @@
#include <boost/geometry/algorithms/intersects.hpp>
#include <boost/geometry/algorithms/validity_failure_type.hpp>
#include <boost/geometry/algorithms/detail/num_distinct_consecutive_points.hpp>
-#include <boost/geometry/algorithms/detail/is_valid/has_spikes.hpp>
#include <boost/geometry/algorithms/detail/is_valid/has_duplicates.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp>
+#include <boost/geometry/algorithms/detail/is_valid/has_spikes.hpp>
#include <boost/geometry/algorithms/detail/is_valid/has_valid_self_turns.hpp>
#include <boost/geometry/strategies/area.hpp>
@@ -153,17 +154,23 @@ struct is_valid_ring
static inline bool apply(Ring const& ring, VisitPolicy& visitor)
{
// return invalid if any of the following condition holds:
- // (a) the ring's size is below the minimal one
- // (b) the ring consists of at most two distinct points
- // (c) the ring is not topologically closed
- // (d) the ring has spikes
- // (e) the ring has duplicate points (if AllowDuplicates is false)
- // (f) the boundary of the ring has self-intersections
- // (g) the order of the points is inconsistent with the defined order
+ // (a) the ring's point coordinates are not invalid (e.g., NaN)
+ // (b) the ring's size is below the minimal one
+ // (c) the ring consists of at most two distinct points
+ // (d) the ring is not topologically closed
+ // (e) the ring has spikes
+ // (f) the ring has duplicate points (if AllowDuplicates is false)
+ // (g) the boundary of the ring has self-intersections
+ // (h) the order of the points is inconsistent with the defined order
//
// Note: no need to check if the area is zero. If this is the
// case, then the ring must have at least two spikes, which is
- // checked by condition (c).
+ // checked by condition (d).
+
+ if (has_invalid_coordinate<Ring>::apply(ring, visitor))
+ {
+ return false;
+ }
closure_selector const closure = geometry::closure<Ring>::value;
typedef typename closeable_view<Ring const, closure>::type view_type;
diff --git a/boost/geometry/algorithms/detail/is_valid/segment.hpp b/boost/geometry/algorithms/detail/is_valid/segment.hpp
index a93d2bfe9e..f92f73381f 100644
--- a/boost/geometry/algorithms/detail/is_valid/segment.hpp
+++ b/boost/geometry/algorithms/detail/is_valid/segment.hpp
@@ -19,7 +19,7 @@
#include <boost/geometry/algorithms/assign.hpp>
#include <boost/geometry/algorithms/equals.hpp>
#include <boost/geometry/algorithms/validity_failure_type.hpp>
-
+#include <boost/geometry/algorithms/detail/is_valid/has_invalid_coordinate.hpp>
#include <boost/geometry/algorithms/dispatch/is_valid.hpp>
@@ -53,7 +53,14 @@ struct is_valid<Segment, segment_tag>
detail::assign_point_from_index<0>(segment, p[0]);
detail::assign_point_from_index<1>(segment, p[1]);
- if(! geometry::equals(p[0], p[1]))
+ if (detail::is_valid::has_invalid_coordinate
+ <
+ Segment
+ >::apply(segment, visitor))
+ {
+ return false;
+ }
+ else if (! geometry::equals(p[0], p[1]))
{
return visitor.template apply<no_failure>();
}
diff --git a/boost/geometry/algorithms/detail/overlay/clip_linestring.hpp b/boost/geometry/algorithms/detail/overlay/clip_linestring.hpp
index b1a25c9f5e..8cb37d6954 100644
--- a/boost/geometry/algorithms/detail/overlay/clip_linestring.hpp
+++ b/boost/geometry/algorithms/detail/overlay/clip_linestring.hpp
@@ -51,14 +51,14 @@ class liang_barsky
private:
typedef model::referring_segment<Point> segment_type;
- template <typename T>
- inline bool check_edge(T const& p, T const& q, T& t1, T& t2) const
+ template <typename CoordinateType, typename CalcType>
+ inline bool check_edge(CoordinateType const& p, CoordinateType const& q, CalcType& t1, CalcType& t2) const
{
bool visible = true;
if(p < 0)
{
- T const r = q / p;
+ CalcType const r = static_cast<CalcType>(q) / p;
if (r > t2)
visible = false;
else if (r > t1)
@@ -66,7 +66,7 @@ private:
}
else if(p > 0)
{
- T const r = q / p;
+ CalcType const r = static_cast<CalcType>(q) / p;
if (r < t1)
visible = false;
else if (r < t2)
@@ -86,9 +86,10 @@ public:
inline bool clip_segment(Box const& b, segment_type& s, bool& sp1_clipped, bool& sp2_clipped) const
{
typedef typename select_coordinate_type<Box, Point>::type coordinate_type;
+ typedef typename select_most_precise<coordinate_type, double>::type calc_type;
- coordinate_type t1 = 0;
- coordinate_type t2 = 1;
+ calc_type t1 = 0;
+ calc_type t2 = 1;
coordinate_type const dx = get<1, 0>(s) - get<0, 0>(s);
coordinate_type const dy = get<1, 1>(s) - get<0, 1>(s);
diff --git a/boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp b/boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp
index 3f81c4dca9..bc84286241 100644
--- a/boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp
+++ b/boost/geometry/algorithms/detail/overlay/enrich_intersection_points.hpp
@@ -26,7 +26,9 @@
#include <boost/geometry/algorithms/detail/ring_identifier.hpp>
#include <boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>
+#include <boost/geometry/algorithms/detail/overlay/handle_colocations.hpp>
#include <boost/geometry/algorithms/detail/overlay/handle_tangencies.hpp>
+#include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
#include <boost/geometry/policies/robustness/robust_type.hpp>
#include <boost/geometry/strategies/side.hpp>
#ifdef BOOST_GEOMETRY_DEBUG_ENRICH
@@ -466,6 +468,7 @@ inline void create_map(TurnPoints const& turn_points, MappedVector& mapped_vecto
template
<
bool Reverse1, bool Reverse2,
+ overlay_type OverlayType,
typename TurnPoints,
typename Geometry1, typename Geometry2,
typename RobustPolicy,
@@ -490,10 +493,9 @@ inline void enrich_intersection_points(TurnPoints& turn_points,
std::vector<indexed_turn_operation>
> mapped_vector_type;
- // DISCARD ALL UU
- // #76 is the reason that this is necessary...
- // With uu, at all points there is the risk that rings are being traversed twice or more.
- // Without uu, all rings having only uu will be untouched and gathered by assemble
+ // Iterate through turns and discard uu
+ // and check if there are possible colocations
+ bool check_colocations = false;
for (typename boost::range_iterator<TurnPoints>::type
it = boost::begin(turn_points);
it != boost::end(turn_points);
@@ -501,14 +503,34 @@ inline void enrich_intersection_points(TurnPoints& turn_points,
{
if (it->both(detail::overlay::operation_union))
{
+ // Discard (necessary for a.o. #76). With uu, at all points there
+ // is the risk that rings are being traversed twice or more.
+ // Without uu, all rings having only uu will be untouched
+ // and gathered by assemble
it->discarded = true;
+ check_colocations = true;
}
- if (it->both(detail::overlay::operation_none))
+ else if (it->combination(detail::overlay::operation_union,
+ detail::overlay::operation_blocked))
+ {
+ check_colocations = true;
+ }
+ else if (OverlayType == overlay_difference
+ && it->both(detail::overlay::operation_intersection))
+ {
+ // For difference operation (u/u -> i/i)
+ check_colocations = true;
+ }
+ else if (it->both(detail::overlay::operation_none))
{
it->discarded = true;
}
}
+ if (check_colocations)
+ {
+ detail::overlay::handle_colocations<OverlayType>(turn_points);
+ }
// Create a map of vectors of indexed operation-types to be able
// to sort intersection points PER RING
diff --git a/boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp b/boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp
index b2c3836712..b9e48cdbfc 100644
--- a/boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp
+++ b/boost/geometry/algorithms/detail/overlay/follow_linear_linear.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2014, Oracle and/or its affiliates.
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
// Licensed under the Boost Software License version 1.0.
// http://www.boost.org/users/license.html
@@ -22,6 +22,7 @@
#include <boost/geometry/algorithms/detail/overlay/copy_segments.hpp>
#include <boost/geometry/algorithms/detail/overlay/follow.hpp>
+#include <boost/geometry/algorithms/detail/overlay/inconsistent_turns_exception.hpp>
#include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
#include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
@@ -35,24 +36,6 @@
namespace boost { namespace geometry
{
-#if ! defined(BOOST_GEOMETRY_OVERLAY_NO_THROW)
-class inconsistent_turns_exception : public geometry::exception
-{
-public:
-
- inline inconsistent_turns_exception() {}
-
- virtual ~inconsistent_turns_exception() throw()
- {}
-
- virtual char const* what() const throw()
- {
- return "Boost.Geometry Inconsistent Turns exception";
- }
-};
-#endif
-
-
#ifndef DOXYGEN_NO_DETAIL
namespace detail { namespace overlay
{
diff --git a/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp b/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
index 717f0b47a9..ac36c530bf 100644
--- a/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
+++ b/boost/geometry/algorithms/detail/overlay/get_turn_info.hpp
@@ -585,8 +585,8 @@ struct collinear : public base_turn_handler
typename SidePolicy
>
static inline void apply(
- Point1 const& , Point1 const& , Point1 const& ,
- Point2 const& , Point2 const& , Point2 const& ,
+ Point1 const& , Point1 const& pj, Point1 const& pk,
+ Point2 const& , Point2 const& qj, Point2 const& qk,
TurnInfo& ti,
IntersectionInfo const& info,
DirInfo const& dir_info,
@@ -623,8 +623,30 @@ struct collinear : public base_turn_handler
{
ui_else_iu(product == 1, ti);
}
+
+ // Calculate remaining distance. If it continues collinearly it is
+ // measured until the end of the next segment
+ ti.operations[0].remaining_distance
+ = side_p == 0
+ ? distance_measure(ti.point, pk)
+ : distance_measure(ti.point, pj);
+ ti.operations[1].remaining_distance
+ = side_q == 0
+ ? distance_measure(ti.point, qk)
+ : distance_measure(ti.point, qj);
}
+ template <typename Point1, typename Point2>
+ static inline typename geometry::coordinate_type<Point1>::type
+ distance_measure(Point1 const& a, Point2 const& b)
+ {
+ // TODO: use comparable distance for point-point instead - but that
+ // causes currently cycling include problems
+ typedef typename geometry::coordinate_type<Point1>::type ctype;
+ ctype const dx = get<0>(a) - get<0>(b);
+ ctype const dy = get<1>(b) - get<1>(b);
+ return dx * dx + dy * dy;
+ }
};
template
diff --git a/boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp b/boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp
index e4f8de42e1..ee0a93ae7e 100644
--- a/boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp
+++ b/boost/geometry/algorithms/detail/overlay/get_turn_info_helpers.hpp
@@ -23,9 +23,9 @@ namespace detail { namespace overlay {
enum turn_position { position_middle, position_front, position_back };
-template <typename SegmentRatio>
+template <typename Point, typename SegmentRatio>
struct turn_operation_linear
- : public turn_operation<SegmentRatio>
+ : public turn_operation<Point, SegmentRatio>
{
turn_operation_linear()
: position(position_middle)
diff --git a/boost/geometry/algorithms/detail/overlay/get_turns.hpp b/boost/geometry/algorithms/detail/overlay/get_turns.hpp
index 098c7b5642..b2b97c0337 100644
--- a/boost/geometry/algorithms/detail/overlay/get_turns.hpp
+++ b/boost/geometry/algorithms/detail/overlay/get_turns.hpp
@@ -802,19 +802,19 @@ template <typename Geometry1, typename Geometry2, typename SegmentRatio,
typename TagBase1 = typename topological_tag_base<Geometry1>::type, typename TagBase2 = typename topological_tag_base<Geometry2>::type>
struct turn_operation_type
{
- typedef overlay::turn_operation<SegmentRatio> type;
+ typedef overlay::turn_operation<typename point_type<Geometry1>::type, SegmentRatio> type;
};
template <typename Geometry1, typename Geometry2, typename SegmentRatio, typename Tag1, typename Tag2>
struct turn_operation_type<Geometry1, Geometry2, SegmentRatio, Tag1, Tag2, linear_tag, linear_tag>
{
- typedef overlay::turn_operation_linear<SegmentRatio> type;
+ typedef overlay::turn_operation_linear<typename point_type<Geometry1>::type, SegmentRatio> type;
};
template <typename Geometry1, typename Geometry2, typename SegmentRatio, typename Tag1, typename Tag2>
struct turn_operation_type<Geometry1, Geometry2, SegmentRatio, Tag1, Tag2, linear_tag, areal_tag>
{
- typedef overlay::turn_operation_linear<SegmentRatio> type;
+ typedef overlay::turn_operation_linear<typename point_type<Geometry1>::type, SegmentRatio> type;
};
}} // namespace detail::get_turns
diff --git a/boost/geometry/algorithms/detail/overlay/handle_colocations.hpp b/boost/geometry/algorithms/detail/overlay/handle_colocations.hpp
new file mode 100644
index 0000000000..6f332ddff2
--- /dev/null
+++ b/boost/geometry/algorithms/detail/overlay/handle_colocations.hpp
@@ -0,0 +1,278 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_HANDLE_COLOCATIONS_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_HANDLE_COLOCATIONS_HPP
+
+#include <cstddef>
+#include <algorithm>
+#include <map>
+#include <vector>
+
+#include <boost/range.hpp>
+#include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp>
+#include <boost/geometry/algorithms/detail/overlay/turn_info.hpp>
+#include <boost/geometry/algorithms/detail/ring_identifier.hpp>
+#include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
+
+#if defined(BOOST_GEOMETRY_DEBUG_HANDLE_COLOCATIONS)
+# include <iostream>
+# include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
+# include <boost/geometry/io/wkt/wkt.hpp>
+# define BOOST_GEOMETRY_DEBUG_IDENTIFIER
+#endif
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail { namespace overlay
+{
+
+struct turn_operation_index
+{
+ turn_operation_index(signed_size_type ti = -1,
+ signed_size_type oi = -1)
+ : turn_index(ti)
+ , op_index(oi)
+ {}
+
+ signed_size_type turn_index;
+ signed_size_type op_index; // basically only 0,1
+};
+
+
+template <typename TurnPoints>
+struct less_by_fraction_and_type
+{
+ inline less_by_fraction_and_type(TurnPoints const& turn_points)
+ : m_turns(turn_points)
+ {
+ }
+
+ inline bool operator()(turn_operation_index const& left,
+ turn_operation_index const& right) const
+ {
+ typedef typename boost::range_value<TurnPoints>::type turn_type;
+ typedef typename turn_type::turn_operation_type turn_operation_type;
+
+ turn_type const& left_turn = m_turns[left.turn_index];
+ turn_type const& right_turn = m_turns[right.turn_index];
+ turn_operation_type const& left_op
+ = left_turn.operations[left.op_index];
+
+ turn_operation_type const& right_op
+ = right_turn.operations[right.op_index];
+
+ if (! (left_op.fraction == right_op.fraction))
+ {
+ return left_op.fraction < right_op.fraction;
+ }
+
+ turn_operation_type const& left_other_op
+ = left_turn.operations[1 - left.op_index];
+
+ turn_operation_type const& right_other_op
+ = right_turn.operations[1 - right.op_index];
+
+ // Fraction is the same, now sort on ring id, first outer ring,
+ // then interior rings
+ return left_other_op.seg_id < right_other_op.seg_id;
+ }
+
+private:
+ TurnPoints const& m_turns;
+};
+
+template <overlay_type OverlayType, typename TurnPoints, typename OperationVector>
+inline void handle_colocation_cluster(TurnPoints& turn_points,
+ segment_identifier const& current_ring_seg_id,
+ OperationVector const& vec)
+{
+ typedef typename boost::range_value<TurnPoints>::type turn_type;
+ typedef typename turn_type::turn_operation_type turn_operation_type;
+
+ std::vector<turn_operation_index>::const_iterator vit = vec.begin();
+
+ turn_type cluster_turn = turn_points[vit->turn_index];
+ turn_operation_type cluster_op
+ = cluster_turn.operations[vit->op_index];
+ segment_identifier cluster_other_id
+ = cluster_turn.operations[1 - vit->op_index].seg_id;
+ bool const discard_colocated
+ = cluster_turn.both(operation_union)
+ || cluster_turn.combination(operation_blocked, operation_union);
+
+ for (++vit; vit != vec.end(); ++vit)
+ {
+ turn_operation_index const& toi = *vit;
+ turn_type& turn = turn_points[toi.turn_index];
+ turn_operation_type const& op = turn.operations[toi.op_index];
+ segment_identifier const& other_id
+ = turn.operations[1 - toi.op_index].seg_id;
+
+ if (cluster_op.fraction == op.fraction)
+ {
+ // Two turns of current ring with same source are colocated,
+ // one is from exterior ring, one from interior ring
+ bool const colocated_ext_int
+ = cluster_other_id.multi_index == other_id.multi_index
+ && cluster_other_id.ring_index == -1
+ && other_id.ring_index >= 0;
+
+ // Turn of current interior ring with other interior ring
+ bool const touch_int_int
+ = current_ring_seg_id.ring_index >= 0
+ && other_id.ring_index >= 0;
+
+ if (discard_colocated && colocated_ext_int)
+ {
+ // If the two turns on this same segment are a
+ // colocation with two different segments on the
+ // other geometry, of the same polygon but with
+ // the outer (u/u or u/x) and the inner ring (non u/u),
+ // that turn with inner ring should be discarded
+ turn.discarded = true;
+ turn.colocated = true;
+ }
+ else if (cluster_turn.colocated
+ && touch_int_int
+ && turn.both(operation_intersection))
+ {
+ // Two holes touch each other at a point where the
+ // exterior ring also touches
+ turn.discarded = true;
+ turn.colocated = true;
+ }
+ else if (OverlayType == overlay_difference
+ && turn.both(operation_intersection)
+ && colocated_ext_int)
+ {
+ // For difference (polygon inside out) we need to
+ // discard i/i instead, in case of colocations
+ turn.discarded = true;
+ turn.colocated = true;
+ }
+ }
+ else
+ {
+ // Not on same fraction on this segment
+ // assign for next potential cluster
+ cluster_turn = turn;
+ cluster_op = op;
+ cluster_other_id = other_id;
+ }
+
+ }
+}
+
+
+// Checks colocated turns and flags combinations of uu/other, possibly a
+// combination of a ring touching another geometry's interior ring which is
+// tangential to the exterior ring
+
+// This function can be extended to replace handle_tangencies: at each
+// colocation incoming and outgoing vectors should be inspected
+
+template <overlay_type OverlayType, typename TurnPoints>
+inline void handle_colocations(TurnPoints& turn_points)
+{
+ typedef std::map
+ <
+ segment_identifier,
+ std::vector<turn_operation_index>
+ > map_type;
+
+ // Create and fill map on segment-identifier Map is sorted on seg_id,
+ // meaning it is sorted on ring_identifier too. This means that exterior
+ // rings are handled first. If there is a colocation on the exterior ring,
+ // that information can be used for the interior ring too
+ map_type map;
+
+ int index = 0;
+ for (typename boost::range_iterator<TurnPoints>::type
+ it = boost::begin(turn_points);
+ it != boost::end(turn_points);
+ ++it, ++index)
+ {
+ map[it->operations[0].seg_id].push_back(turn_operation_index(index, 0));
+ map[it->operations[1].seg_id].push_back(turn_operation_index(index, 1));
+ }
+
+ // Check if there are multiple turns on one or more segments,
+ // if not then nothing is to be done
+ bool colocations = 0;
+ for (typename map_type::const_iterator it = map.begin();
+ it != map.end();
+ ++it)
+ {
+ if (it->second.size() > 1u)
+ {
+ colocations = true;
+ break;
+ }
+ }
+
+ if (! colocations)
+ {
+ return;
+ }
+
+ // Sort all vectors, per same segment
+ less_by_fraction_and_type<TurnPoints> less(turn_points);
+ for (typename map_type::iterator it = map.begin();
+ it != map.end(); ++it)
+ {
+ std::sort(it->second.begin(), it->second.end(), less);
+ }
+
+ for (typename map_type::const_iterator it = map.begin();
+ it != map.end(); ++it)
+ {
+ if (it->second.size() > 1)
+ {
+ handle_colocation_cluster<OverlayType>(turn_points,
+ it->first, it->second);
+ }
+ }
+
+#if defined(BOOST_GEOMETRY_DEBUG_HANDLE_COLOCATIONS)
+ std::cout << "*** Colocations " << map.size() << std::endl;
+ for (typename map_type::const_iterator it = map.begin();
+ it != map.end(); ++it)
+ {
+ std::cout << it->first << std::endl;
+ for (std::vector<turn_operation_index>::const_iterator vit
+ = it->second.begin(); vit != it->second.end(); ++vit)
+ {
+ turn_operation_index const& toi = *vit;
+ std::cout << geometry::wkt(turn_points[toi.turn_index].point)
+ << std::boolalpha
+ << " discarded=" << turn_points[toi.turn_index].discarded
+ << " colocated=" << turn_points[toi.turn_index].colocated
+ << " " << operation_char(turn_points[toi.turn_index].operations[0].operation)
+ << " " << turn_points[toi.turn_index].operations[0].seg_id
+ << " " << turn_points[toi.turn_index].operations[0].fraction
+ << " // " << operation_char(turn_points[toi.turn_index].operations[1].operation)
+ << " " << turn_points[toi.turn_index].operations[1].seg_id
+ << " " << turn_points[toi.turn_index].operations[1].fraction
+ << std::endl;
+ }
+ }
+#endif // DEBUG
+
+}
+
+
+}} // namespace detail::overlay
+#endif //DOXYGEN_NO_DETAIL
+
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_HANDLE_COLOCATIONS_HPP
diff --git a/boost/geometry/algorithms/detail/overlay/inconsistent_turns_exception.hpp b/boost/geometry/algorithms/detail/overlay/inconsistent_turns_exception.hpp
new file mode 100644
index 0000000000..1486f94fbd
--- /dev/null
+++ b/boost/geometry/algorithms/detail/overlay/inconsistent_turns_exception.hpp
@@ -0,0 +1,38 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+
+// Copyright (c) 2014-2015, Oracle and/or its affiliates.
+
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_INCONSISTENT_TURNS_EXCEPTION_HPP
+#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_INCONSISTENT_TURNS_EXCEPTION_HPP
+
+#if ! defined(BOOST_GEOMETRY_OVERLAY_NO_THROW)
+#include <boost/geometry/core/exception.hpp>
+
+namespace boost { namespace geometry
+{
+
+class inconsistent_turns_exception : public geometry::exception
+{
+public:
+
+ inline inconsistent_turns_exception() {}
+
+ virtual ~inconsistent_turns_exception() throw()
+ {}
+
+ virtual char const* what() const throw()
+ {
+ return "Boost.Geometry Inconsistent Turns exception";
+ }
+};
+
+}} // boost::geometry
+
+#endif // BOOST_GEOMETRY_OVERLAY_NO_THROW
+
+#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_INCONSISTENT_TURNS_EXCEPTION_HPP
diff --git a/boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp b/boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp
index dd041b0d7d..c62b7d2834 100644
--- a/boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp
+++ b/boost/geometry/algorithms/detail/overlay/intersection_box_box.hpp
@@ -1,6 +1,11 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -39,19 +44,26 @@ struct intersection_box_box
{
typedef typename coordinate_type<BoxOut>::type ct;
- ct min1 = get<min_corner, Dimension>(box1);
- ct min2 = get<min_corner, Dimension>(box2);
ct max1 = get<max_corner, Dimension>(box1);
+ ct min2 = get<min_corner, Dimension>(box2);
+
+ if (max1 < min2)
+ {
+ return false;
+ }
+
ct max2 = get<max_corner, Dimension>(box2);
+ ct min1 = get<min_corner, Dimension>(box1);
- if (max1 < min2 || max2 < min1)
+ if (max2 < min1)
{
return false;
}
+
// Set dimensions of output coordinate
set<min_corner, Dimension>(box_out, min1 < min2 ? min2 : min1);
set<max_corner, Dimension>(box_out, max1 > max2 ? max2 : max1);
-
+
return intersection_box_box<Dimension + 1, DimensionCount>
::apply(box1, box2, robust_policy, box_out, strategy);
}
diff --git a/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp b/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp
index af0731f5a9..59c8f6f1ff 100644
--- a/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp
+++ b/boost/geometry/algorithms/detail/overlay/intersection_insert.hpp
@@ -41,6 +41,7 @@
#include <boost/geometry/views/segment_view.hpp>
#include <boost/geometry/views/detail/boundary_view.hpp>
+#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
#include <boost/geometry/algorithms/detail/overlay/linear_linear.hpp>
#include <boost/geometry/algorithms/detail/overlay/pointlike_pointlike.hpp>
#include <boost/geometry/algorithms/detail/overlay/pointlike_linear.hpp>
@@ -175,21 +176,115 @@ template
struct intersection_of_linestring_with_areal
{
#if defined(BOOST_GEOMETRY_DEBUG_FOLLOW)
- template <typename Turn, typename Operation>
- static inline void debug_follow(Turn const& turn, Operation op,
- int index)
+ template <typename Turn, typename Operation>
+ static inline void debug_follow(Turn const& turn, Operation op,
+ int index)
+ {
+ std::cout << index
+ << " at " << op.seg_id
+ << " meth: " << method_char(turn.method)
+ << " op: " << operation_char(op.operation)
+ << " vis: " << visited_char(op.visited)
+ << " of: " << operation_char(turn.operations[0].operation)
+ << operation_char(turn.operations[1].operation)
+ << " " << geometry::wkt(turn.point)
+ << std::endl;
+ }
+
+ template <typename Turn>
+ static inline void debug_turn(Turn const& t, bool non_crossing)
+ {
+ std::cout << "checking turn @"
+ << geometry::wkt(t.point)
+ << "; " << method_char(t.method)
+ << ":" << operation_char(t.operations[0].operation)
+ << "/" << operation_char(t.operations[1].operation)
+ << "; non-crossing? "
+ << std::boolalpha << non_crossing << std::noboolalpha
+ << std::endl;
+ }
+#endif
+
+ class is_crossing_turn
+ {
+ // return true is the operation is intersection or blocked
+ template <std::size_t Index, typename Turn>
+ static inline bool has_op_i_or_b(Turn const& t)
{
- std::cout << index
- << " at " << op.seg_id
- << " meth: " << method_char(turn.method)
- << " op: " << operation_char(op.operation)
- << " vis: " << visited_char(op.visited)
- << " of: " << operation_char(turn.operations[0].operation)
- << operation_char(turn.operations[1].operation)
- << " " << geometry::wkt(turn.point)
- << std::endl;
+ return
+ t.operations[Index].operation == overlay::operation_intersection
+ ||
+ t.operations[Index].operation == overlay::operation_blocked;
}
+
+ template <typename Turn>
+ static inline bool has_method_crosses(Turn const& t)
+ {
+ return t.method == overlay::method_crosses;
+ }
+
+ template <typename Turn>
+ static inline bool is_cc(Turn const& t)
+ {
+ return
+ (t.method == overlay::method_touch_interior
+ ||
+ t.method == overlay::method_equal
+ ||
+ t.method == overlay::method_collinear)
+ &&
+ t.operations[0].operation == t.operations[1].operation
+ &&
+ t.operations[0].operation == overlay::operation_continue
+ ;
+ }
+
+ template <typename Turn>
+ static inline bool has_i_or_b_ops(Turn const& t)
+ {
+ return
+ (t.method == overlay::method_touch
+ ||
+ t.method == overlay::method_touch_interior
+ ||
+ t.method == overlay::method_collinear)
+ &&
+ t.operations[1].operation != t.operations[0].operation
+ &&
+ (has_op_i_or_b<0>(t) || has_op_i_or_b<1>(t));
+ }
+
+ public:
+ template <typename Turn>
+ static inline bool apply(Turn const& t)
+ {
+ bool const is_crossing
+ = has_method_crosses(t) || is_cc(t) || has_i_or_b_ops(t);
+#if defined(BOOST_GEOMETRY_DEBUG_FOLLOW)
+ debug_turn(t, ! is_crossing);
#endif
+ return is_crossing;
+ }
+ };
+
+ struct is_non_crossing_turn
+ {
+ template <typename Turn>
+ static inline bool apply(Turn const& t)
+ {
+ return ! is_crossing_turn::apply(t);
+ }
+ };
+
+ template <typename Turns>
+ static inline bool no_crossing_turns_or_empty(Turns const& turns)
+ {
+ return detail::check_iterator_range
+ <
+ is_non_crossing_turn,
+ true // allow an empty turns range
+ >::apply(boost::begin(turns), boost::end(turns));
+ }
template
<
@@ -212,7 +307,8 @@ struct intersection_of_linestring_with_areal
LineStringOut,
LineString,
Areal,
- OverlayType
+ OverlayType,
+ false // do not remove spikes for linear geometries
> follower;
typedef typename point_type<LineStringOut>::type point_type;
@@ -231,7 +327,7 @@ struct intersection_of_linestring_with_areal
detail::overlay::assign_null_policy
>(linestring, areal, robust_policy, turns, policy);
- if (turns.empty())
+ if (no_crossing_turns_or_empty(turns))
{
// No intersection points, it is either completely
// inside (interior + borders)
diff --git a/boost/geometry/algorithms/detail/overlay/overlay.hpp b/boost/geometry/algorithms/detail/overlay/overlay.hpp
index baf9d4777d..6eb0b8864c 100644
--- a/boost/geometry/algorithms/detail/overlay/overlay.hpp
+++ b/boost/geometry/algorithms/detail/overlay/overlay.hpp
@@ -78,6 +78,11 @@ inline void get_ring_turn_info(TurnInfoMap& turn_info_map,
&& ! turn_info.both(operation_intersection)
;
+ if (! both_uu && turn_info.colocated)
+ {
+ skip = true;
+ }
+
for (typename boost::range_iterator<container_type const>::type
op_it = boost::begin(turn_info.operations);
op_it != boost::end(turn_info.operations);
@@ -105,7 +110,7 @@ inline void get_ring_turn_info(TurnInfoMap& turn_info_map,
template
<
- typename GeometryOut, overlay_type Direction, bool ReverseOut,
+ typename GeometryOut, overlay_type OverlayType, bool ReverseOut,
typename Geometry1, typename Geometry2,
typename OutputIterator
>
@@ -129,8 +134,8 @@ inline OutputIterator return_if_one_input_is_empty(Geometry1 const& geometry1,
// Union: return either of them
// Intersection: return nothing
// Difference: return first of them
- if (Direction == overlay_intersection
- || (Direction == overlay_difference && geometry::is_empty(geometry1)))
+ if (OverlayType == overlay_intersection
+ || (OverlayType == overlay_difference && geometry::is_empty(geometry1)))
{
return out;
}
@@ -143,7 +148,7 @@ inline OutputIterator return_if_one_input_is_empty(Geometry1 const& geometry1,
std::map<ring_identifier, ring_turn_info> empty;
std::map<ring_identifier, properties> all_of_one_of_them;
- select_rings<Direction>(geometry1, geometry2, empty, all_of_one_of_them);
+ select_rings<OverlayType>(geometry1, geometry2, empty, all_of_one_of_them);
ring_container_type rings;
assign_parents(geometry1, geometry2, rings, all_of_one_of_them);
return add_rings<GeometryOut>(all_of_one_of_them, geometry1, geometry2, rings, out);
@@ -155,7 +160,7 @@ template
typename Geometry1, typename Geometry2,
bool Reverse1, bool Reverse2, bool ReverseOut,
typename GeometryOut,
- overlay_type Direction
+ overlay_type OverlayType
>
struct overlay
{
@@ -178,7 +183,7 @@ struct overlay
{
return return_if_one_input_is_empty
<
- GeometryOut, Direction, ReverseOut
+ GeometryOut, OverlayType, ReverseOut
>(geometry1, geometry2, out);
}
@@ -211,8 +216,8 @@ std::cout << "get turns" << std::endl;
std::cout << "enrich" << std::endl;
#endif
typename Strategy::side_strategy_type side_strategy;
- geometry::enrich_intersection_points<Reverse1, Reverse2>(turn_points,
- Direction == overlay_union
+ geometry::enrich_intersection_points<Reverse1, Reverse2, OverlayType>(turn_points,
+ OverlayType == overlay_union
? geometry::detail::overlay::operation_union
: geometry::detail::overlay::operation_intersection,
geometry1, geometry2,
@@ -229,7 +234,7 @@ std::cout << "traverse" << std::endl;
traverse<Reverse1, Reverse2, Geometry1, Geometry2>::apply
(
geometry1, geometry2,
- Direction == overlay_union
+ OverlayType == overlay_union
? geometry::detail::overlay::operation_union
: geometry::detail::overlay::operation_intersection,
robust_policy,
@@ -246,7 +251,7 @@ std::cout << "traverse" << std::endl;
// Select all rings which are NOT touched by any intersection point
std::map<ring_identifier, properties> selected_ring_properties;
- select_rings<Direction>(geometry1, geometry2, turn_info_per_ring,
+ select_rings<OverlayType>(geometry1, geometry2, turn_info_per_ring,
selected_ring_properties);
// Add rings created during traversal
diff --git a/boost/geometry/algorithms/detail/overlay/traversal_info.hpp b/boost/geometry/algorithms/detail/overlay/traversal_info.hpp
index 6ee32c17c0..8cabfb0d8d 100644
--- a/boost/geometry/algorithms/detail/overlay/traversal_info.hpp
+++ b/boost/geometry/algorithms/detail/overlay/traversal_info.hpp
@@ -25,7 +25,7 @@ namespace detail { namespace overlay
template <typename Point, typename SegmentRatio>
-struct traversal_turn_operation : public turn_operation<SegmentRatio>
+struct traversal_turn_operation : public turn_operation<Point, SegmentRatio>
{
enrichment_info<Point> enriched;
visit_info visited;
diff --git a/boost/geometry/algorithms/detail/overlay/traverse.hpp b/boost/geometry/algorithms/detail/overlay/traverse.hpp
index 803a164711..45e15d13d0 100644
--- a/boost/geometry/algorithms/detail/overlay/traverse.hpp
+++ b/boost/geometry/algorithms/detail/overlay/traverse.hpp
@@ -174,7 +174,17 @@ inline bool select_next_ip(operation_type operation,
{
return false;
}
+
bool has_tp = false;
+
+ typedef typename std::iterator_traits
+ <
+ Iterator
+ >::value_type operation_type;
+
+ typename operation_type::comparable_distance_type
+ max_remaining_distance = 0;
+
selected = boost::end(turn.operations);
for (Iterator it = boost::begin(turn.operations);
it != boost::end(turn.operations);
@@ -206,10 +216,24 @@ inline bool select_next_ip(operation_type operation,
)
)
{
+ if (it->operation == operation_continue)
+ {
+ max_remaining_distance = it->remaining_distance;
+ }
selected = it;
debug_traverse(turn, *it, " Candidate");
has_tp = true;
}
+
+ if (it->operation == operation_continue && has_tp)
+ {
+ if (it->remaining_distance > max_remaining_distance)
+ {
+ max_remaining_distance = it->remaining_distance;
+ selected = it;
+ debug_traverse(turn, *it, " Candidate override");
+ }
+ }
}
if (has_tp)
diff --git a/boost/geometry/algorithms/detail/overlay/turn_info.hpp b/boost/geometry/algorithms/detail/overlay/turn_info.hpp
index 26669a4b1f..1ac77d5796 100644
--- a/boost/geometry/algorithms/detail/overlay/turn_info.hpp
+++ b/boost/geometry/algorithms/detail/overlay/turn_info.hpp
@@ -12,6 +12,7 @@
#include <boost/array.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
#include <boost/geometry/algorithms/detail/overlay/segment_identifier.hpp>
namespace boost { namespace geometry
@@ -54,15 +55,19 @@ enum method_type
The class is to be included in the turn_info class, either direct
or a derived or similar class with more (e.g. enrichment) information.
*/
-template <typename SegmentRatio>
+template <typename Point, typename SegmentRatio>
struct turn_operation
{
operation_type operation;
segment_identifier seg_id;
SegmentRatio fraction;
+ typedef typename coordinate_type<Point>::type comparable_distance_type;
+ comparable_distance_type remaining_distance;
+
inline turn_operation()
: operation(operation_none)
+ , remaining_distance(0)
{}
};
@@ -80,7 +85,7 @@ template
<
typename Point,
typename SegmentRatio,
- typename Operation = turn_operation<SegmentRatio>,
+ typename Operation = turn_operation<Point, SegmentRatio>,
typename Container = boost::array<Operation, 2>
>
struct turn_info
@@ -93,6 +98,7 @@ struct turn_info
method_type method;
bool discarded;
bool selectable_start; // Can be used as starting-turn in traverse
+ bool colocated;
Container operations;
@@ -101,6 +107,7 @@ struct turn_info
: method(method_none)
, discarded(false)
, selectable_start(true)
+ , colocated(false)
{}
inline bool both(operation_type type) const
diff --git a/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp b/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp
index 9db1ef8e0c..399c8fbefc 100644
--- a/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp
+++ b/boost/geometry/algorithms/detail/point_is_spike_or_equal.hpp
@@ -1,9 +1,14 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2013 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2013 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2013 Mateusz Loskot, London, UK.
-// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -12,8 +17,6 @@
#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_POINT_IS_EQUAL_OR_SPIKE_HPP
#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_POINT_IS_EQUAL_OR_SPIKE_HPP
-#include <boost/geometry/arithmetic/arithmetic.hpp>
-#include <boost/geometry/algorithms/detail/convert_point_to_point.hpp>
#include <boost/geometry/algorithms/detail/recalculate.hpp>
#include <boost/geometry/policies/robustness/robust_point_type.hpp>
#include <boost/geometry/strategies/side.hpp>
@@ -28,6 +31,17 @@ namespace boost { namespace geometry
namespace detail
{
+template <std::size_t Index, typename Point1, typename Point2>
+inline int sign_of_difference(Point1 const& point1, Point2 const& point2)
+{
+ return
+ math::equals(geometry::get<Index>(point1), geometry::get<Index>(point2))
+ ?
+ 0
+ :
+ (geometry::get<Index>(point1) > geometry::get<Index>(point2) ? 1 : -1);
+}
+
// Checks if a point ("last_point") causes a spike w.r.t.
// the specified two other points (segment_a, segment_b)
//
@@ -35,7 +49,9 @@ namespace detail
// a lp b
//
// Above, lp generates a spike w.r.t. segment(a,b)
-// So specify last point first, then (a,b) (this is unordered, so unintuitive)
+// So specify last point first, then (a,b)
+// The segment's orientation does matter: if lp is to the right of b
+// no spike is reported
template <typename Point1, typename Point2, typename Point3>
static inline bool point_is_spike_or_equal(Point1 const& last_point,
Point2 const& segment_a,
@@ -46,29 +62,21 @@ static inline bool point_is_spike_or_equal(Point1 const& last_point,
typename cs_tag<Point1>::type
>::type side_strategy;
- typedef Point1 vector_type;
-
int const side = side_strategy::apply(last_point, segment_a, segment_b);
if (side == 0)
{
// Last point is collinear w.r.t previous segment.
// Check if it is equal
- vector_type diff1;
- conversion::convert_point_to_point(last_point, diff1);
- geometry::subtract_point(diff1, segment_b);
- int const sgn_x1 = math::sign(geometry::get<0>(diff1));
- int const sgn_y1 = math::sign(geometry::get<1>(diff1));
+ int const sgn_x1 = sign_of_difference<0>(last_point, segment_b);
+ int const sgn_y1 = sign_of_difference<1>(last_point, segment_b);
if (sgn_x1 == 0 && sgn_y1 == 0)
{
return true;
}
// Check if it moves forward
- vector_type diff2;
- conversion::convert_point_to_point(segment_b, diff2);
- geometry::subtract_point(diff2, segment_a);
- int const sgn_x2 = math::sign(geometry::get<0>(diff2));
- int const sgn_y2 = math::sign(geometry::get<1>(diff2));
+ int const sgn_x2 = sign_of_difference<0>(segment_b, segment_a);
+ int const sgn_y2 = sign_of_difference<1>(segment_b, segment_a);
return sgn_x1 != sgn_x2 || sgn_y1 != sgn_y2;
}
diff --git a/boost/geometry/algorithms/detail/relate/areal_areal.hpp b/boost/geometry/algorithms/detail/relate/areal_areal.hpp
index cc9c1b67ca..a74954326b 100644
--- a/boost/geometry/algorithms/detail/relate/areal_areal.hpp
+++ b/boost/geometry/algorithms/detail/relate/areal_areal.hpp
@@ -338,7 +338,7 @@ struct areal_areal
template <std::size_t OpId, typename Turn>
inline void per_turn(Turn const& turn)
{
- static const std::size_t other_op_id = (OpId + 1) % 2;
+ //static const std::size_t other_op_id = (OpId + 1) % 2;
static const bool transpose_result = OpId != 0;
overlay::operation_type const op = turn.operations[OpId].operation;
@@ -357,11 +357,14 @@ struct areal_areal
else if ( op == overlay::operation_intersection )
{
// ignore i/i
- if ( turn.operations[other_op_id].operation != overlay::operation_intersection )
+ /*if ( turn.operations[other_op_id].operation != overlay::operation_intersection )
{
- update<interior, interior, '2', transpose_result>(m_result);
+ // not correct e.g. for G1 touching G2 in a point where a hole is touching the exterior ring
+ // in this case 2 turns i/... and u/u will be generated for this IP
+ //update<interior, interior, '2', transpose_result>(m_result);
+
//update<boundary, interior, '1', transpose_result>(m_result);
- }
+ }*/
update<boundary, boundary, '0', transpose_result>(m_result);
}
@@ -473,8 +476,11 @@ struct areal_areal
// ignore i/i
if ( it->operations[other_op_id].operation != overlay::operation_intersection )
{
- // already set in interrupt policy
+ // this was set in the interrupt policy but it was wrong
+ // also here it's wrong since it may be a fake entry point
//update<interior, interior, '2', transpose_result>(result);
+
+ // already set in interrupt policy
//update<boundary, boundary, '0', transpose_result>(result);
m_enter_detected = true;
}
@@ -523,6 +529,7 @@ struct areal_areal
template <typename Result>
static inline void update_enter(Result & result)
{
+ update<interior, interior, '2', transpose_result>(result);
update<boundary, interior, '1', transpose_result>(result);
update<exterior, interior, '2', transpose_result>(result);
}
@@ -574,6 +581,7 @@ struct areal_areal
, m_flags(0)
{
// check which relations must be analysed
+ // NOTE: 1 and 4 could probably be connected
if ( ! may_update<interior, interior, '2', transpose_result>(m_result) )
{
@@ -662,21 +670,12 @@ struct areal_areal
if ( it->operations[0].operation == overlay::operation_intersection
&& it->operations[1].operation == overlay::operation_intersection )
{
- // ignore exterior ring
- if ( it->operations[OpId].seg_id.ring_index >= 0 )
- {
- found_ii = true;
- }
+ found_ii = true;
}
else if ( it->operations[0].operation == overlay::operation_union
&& it->operations[1].operation == overlay::operation_union )
{
- // ignore if u/u is for holes
- //if ( it->operations[OpId].seg_id.ring_index >= 0
- // && it->operations[other_id].seg_id.ring_index >= 0 )
- {
- found_uu = true;
- }
+ found_uu = true;
}
else // ignore
{
@@ -687,8 +686,11 @@ struct areal_areal
// only i/i was generated for this ring
if ( found_ii )
{
- //update<interior, interior, '0', transpose_result>(m_result);
- //update<boundary, boundary, '0', transpose_result>(m_result);
+ update<interior, interior, '2', transpose_result>(m_result);
+ m_flags |= 1;
+
+ //update<boundary, boundary, '0', transpose_result>(m_result);
+
update<boundary, interior, '1', transpose_result>(m_result);
update<exterior, interior, '2', transpose_result>(m_result);
m_flags |= 4;
diff --git a/boost/geometry/algorithms/detail/relate/boundary_checker.hpp b/boost/geometry/algorithms/detail/relate/boundary_checker.hpp
index 9de1bacb7d..1a9a5a8fd7 100644
--- a/boost/geometry/algorithms/detail/relate/boundary_checker.hpp
+++ b/boost/geometry/algorithms/detail/relate/boundary_checker.hpp
@@ -17,6 +17,8 @@
#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
+#include <boost/geometry/util/has_nan_coordinate.hpp>
+
namespace boost { namespace geometry
{
@@ -90,19 +92,43 @@ public:
for ( multi_iterator it = boost::begin(geometry) ;
it != boost::end(geometry) ; ++ it )
{
+ typename boost::range_reference<Geometry const>::type
+ ls = *it;
+
// empty or point - no boundary
- if ( boost::size(*it) < 2 )
+ if (boost::size(ls) < 2)
+ {
continue;
+ }
- // linear ring or point - no boundary
- if ( equals::equals_point_point(range::front(*it), range::back(*it)) )
- continue;
+ typedef typename boost::range_reference
+ <
+ typename boost::range_value<Geometry const>::type const
+ >::type point_reference;
+
+ point_reference front_pt = range::front(ls);
+ point_reference back_pt = range::back(ls);
- boundary_points.push_back(range::front(*it));
- boundary_points.push_back(range::back(*it));
+ // linear ring or point - no boundary
+ if (! equals::equals_point_point(front_pt, back_pt))
+ {
+ // do not add points containing NaN coordinates
+ // because they cannot be reasonably compared, e.g. with MSVC
+ // an assertion failure is reported in std::equal_range()
+ if (! geometry::has_nan_coordinate(front_pt))
+ {
+ boundary_points.push_back(front_pt);
+ }
+ if (! geometry::has_nan_coordinate(back_pt))
+ {
+ boundary_points.push_back(back_pt);
+ }
+ }
}
- std::sort(boundary_points.begin(), boundary_points.end(), geometry::less<point_type>());
+ std::sort(boundary_points.begin(),
+ boundary_points.end(),
+ geometry::less<point_type>());
is_filled = true;
}
diff --git a/boost/geometry/algorithms/detail/relate/topology_check.hpp b/boost/geometry/algorithms/detail/relate/topology_check.hpp
index 98b857a488..caa8a3c22d 100644
--- a/boost/geometry/algorithms/detail/relate/topology_check.hpp
+++ b/boost/geometry/algorithms/detail/relate/topology_check.hpp
@@ -16,6 +16,8 @@
#include <boost/geometry/algorithms/detail/equals/point_point.hpp>
#include <boost/geometry/policies/compare.hpp>
+#include <boost/geometry/util/has_nan_coordinate.hpp>
+
namespace boost { namespace geometry {
#ifndef DOXYGEN_NO_DETAIL
@@ -106,20 +108,42 @@ struct topology_check<MultiLinestring, multi_linestring_tag>
typedef typename boost::range_iterator<MultiLinestring const>::type ls_iterator;
for ( ls_iterator it = boost::begin(mls) ; it != boost::end(mls) ; ++it )
{
- std::size_t count = boost::size(*it);
+ typename boost::range_reference<MultiLinestring const>::type
+ ls = *it;
+
+ std::size_t count = boost::size(ls);
- if ( count > 0 )
+ if (count > 0)
{
has_interior = true;
}
- if ( count > 1 )
+ if (count > 1)
{
+ typedef typename boost::range_reference
+ <
+ typename boost::range_value<MultiLinestring const>::type const
+ >::type point_reference;
+
+ point_reference front_pt = range::front(ls);
+ point_reference back_pt = range::back(ls);
+
// don't store boundaries of linear rings, this doesn't change anything
- if ( ! equals::equals_point_point(range::front(*it), range::back(*it)) )
+ if (! equals::equals_point_point(front_pt, back_pt))
{
- endpoints.push_back(range::front(*it));
- endpoints.push_back(range::back(*it));
+ // do not add points containing NaN coordinates
+ // because they cannot be reasonably compared, e.g. with MSVC
+ // an assertion failure is reported in std::equal_range()
+ // NOTE: currently ignoring_counter calling std::equal_range()
+ // is not used anywhere in the code, still it's safer this way
+ if (! geometry::has_nan_coordinate(front_pt))
+ {
+ endpoints.push_back(front_pt);
+ }
+ if (! geometry::has_nan_coordinate(back_pt))
+ {
+ endpoints.push_back(back_pt);
+ }
}
}
}
diff --git a/boost/geometry/algorithms/detail/relate/turns.hpp b/boost/geometry/algorithms/detail/relate/turns.hpp
index d54948e1f5..09d74dec3a 100644
--- a/boost/geometry/algorithms/detail/relate/turns.hpp
+++ b/boost/geometry/algorithms/detail/relate/turns.hpp
@@ -128,8 +128,8 @@ struct get_turns
template <int N = 0, int U = 1, int I = 2, int B = 3, int C = 4, int O = 0>
struct op_to_int
{
- template <typename SegmentRatio>
- inline int operator()(detail::overlay::turn_operation<SegmentRatio> const& op) const
+ template <typename Operation>
+ inline int operator()(Operation const& op) const
{
switch(op.operation)
{
diff --git a/boost/geometry/algorithms/detail/sections/section_functions.hpp b/boost/geometry/algorithms/detail/sections/section_functions.hpp
index ba1cf931b2..7bc5c08046 100644
--- a/boost/geometry/algorithms/detail/sections/section_functions.hpp
+++ b/boost/geometry/algorithms/detail/sections/section_functions.hpp
@@ -2,6 +2,11 @@
// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/geometry/algorithms/detail/sections/sectionalize.hpp b/boost/geometry/algorithms/detail/sections/sectionalize.hpp
index 1ced394353..6443965e95 100644
--- a/boost/geometry/algorithms/detail/sections/sectionalize.hpp
+++ b/boost/geometry/algorithms/detail/sections/sectionalize.hpp
@@ -52,6 +52,8 @@
#include <boost/geometry/views/reversible_view.hpp>
#include <boost/geometry/geometries/segment.hpp>
+#include <boost/geometry/algorithms/detail/expand_by_epsilon.hpp>
+
namespace boost { namespace geometry
{
@@ -599,19 +601,18 @@ inline void enlarge_sections(Sections& sections)
// Reason: turns might, rarely, be missed otherwise (case: "buffer_mp1")
// Drawback: not really, range is now completely inside the section. Section is a tiny bit too large,
// which might cause (a small number) of more comparisons
- // TODO: make dimension-agnostic
+
+ // NOTE: above is old comment to the not used code expanding the Boxes by relaxed_epsilon(10)
+
+ // Enlarge sections by scaled epsilon, this should be consistent with math::equals().
+ // Points and Segments are equal-compared WRT machine epsilon, but Boxes aren't
+ // Enlarging Boxes ensures that they correspond to the bound objects,
+ // Segments in this case, since Sections are collections of Segments.
for (typename boost::range_iterator<Sections>::type it = boost::begin(sections);
it != boost::end(sections);
++it)
{
- typedef typename boost::range_value<Sections>::type section_type;
- typedef typename section_type::box_type box_type;
- typedef typename geometry::coordinate_type<box_type>::type coordinate_type;
- coordinate_type const reps = math::relaxed_epsilon(10.0);
- geometry::set<0, 0>(it->bounding_box, geometry::get<0, 0>(it->bounding_box) - reps);
- geometry::set<0, 1>(it->bounding_box, geometry::get<0, 1>(it->bounding_box) - reps);
- geometry::set<1, 0>(it->bounding_box, geometry::get<1, 0>(it->bounding_box) + reps);
- geometry::set<1, 1>(it->bounding_box, geometry::get<1, 1>(it->bounding_box) + reps);
+ detail::expand_by_epsilon(it->bounding_box);
}
}
@@ -802,6 +803,8 @@ inline void sectionalize(Geometry const& geometry,
Reverse,
DimensionVector
>::apply(geometry, robust_policy, sections, ring_id, max_count);
+
+ detail::sectionalize::enlarge_sections(sections);
}
diff --git a/boost/geometry/algorithms/overlaps.hpp b/boost/geometry/algorithms/overlaps.hpp
index 96310d6cb5..9b5abdb2a0 100644
--- a/boost/geometry/algorithms/overlaps.hpp
+++ b/boost/geometry/algorithms/overlaps.hpp
@@ -1,11 +1,13 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
-// This file was modified by Oracle on 2014.
-// Modifications copyright (c) 2014 Oracle and/or its affiliates.
+// This file was modified by Oracle on 2014, 2015.
+// Modifications copyright (c) 2014-2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
@@ -14,8 +16,6 @@
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
-// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
-
#ifndef BOOST_GEOMETRY_ALGORITHMS_OVERLAPS_HPP
#define BOOST_GEOMETRY_ALGORITHMS_OVERLAPS_HPP
@@ -31,6 +31,7 @@
#include <boost/geometry/algorithms/relate.hpp>
#include <boost/geometry/algorithms/detail/relate/relate_impl.hpp>
+
namespace boost { namespace geometry
{
@@ -83,6 +84,7 @@ struct box_box_loop
{
one_in_two = false;
}
+
// Same other way round
if (min2 < min1 || max2 > max1)
{
diff --git a/boost/geometry/algorithms/touches.hpp b/boost/geometry/algorithms/touches.hpp
index d6f0df3c74..570c54797f 100644
--- a/boost/geometry/algorithms/touches.hpp
+++ b/boost/geometry/algorithms/touches.hpp
@@ -1,12 +1,14 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
-// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
-// This file was modified by Oracle on 2013, 2014.
-// Modifications copyright (c) 2013, 2014, Oracle and/or its affiliates.
+// This file was modified by Oracle on 2013, 2014, 2015.
+// Modifications copyright (c) 2013-2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
@@ -15,8 +17,6 @@
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
-// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
-
#ifndef BOOST_GEOMETRY_ALGORITHMS_TOUCHES_HPP
#define BOOST_GEOMETRY_ALGORITHMS_TOUCHES_HPP
@@ -40,6 +40,7 @@
#include <boost/geometry/algorithms/relate.hpp>
#include <boost/geometry/algorithms/detail/relate/relate_impl.hpp>
+
namespace boost { namespace geometry
{
@@ -70,12 +71,12 @@ struct box_box_loop
// TODO assert or exception?
//BOOST_GEOMETRY_ASSERT(min1 <= max1 && min2 <= max2);
- if ( max1 < min2 || max2 < min1 )
+ if (max1 < min2 || max2 < min1)
{
return false;
}
- if ( max1 == min2 || max2 == min1 )
+ if (max1 == min2 || max2 == min1)
{
touch = true;
}
@@ -385,6 +386,16 @@ struct touches<Linear, Areal, Tag1, Tag2, linear_tag, areal_tag, true>
template <typename Areal1, typename Areal2, typename Tag1, typename Tag2>
struct touches<Areal1, Areal2, Tag1, Tag2, areal_tag, areal_tag, false>
+ : detail::relate::relate_impl
+ <
+ detail::de9im::static_mask_touches_type,
+ Areal1,
+ Areal2
+ >
+{};
+
+template <typename Areal1, typename Areal2>
+struct touches<Areal1, Areal2, ring_tag, ring_tag, areal_tag, areal_tag, false>
: detail::touches::areal_areal<Areal1, Areal2>
{};
diff --git a/boost/geometry/algorithms/validity_failure_type.hpp b/boost/geometry/algorithms/validity_failure_type.hpp
index 42de99c585..3fbf8027b4 100644
--- a/boost/geometry/algorithms/validity_failure_type.hpp
+++ b/boost/geometry/algorithms/validity_failure_type.hpp
@@ -78,7 +78,10 @@ enum validity_failure_type
/// The top-right corner of the box is lexicographically smaller
/// than its bottom-left corner
/// (applies to boxes only)
- failure_wrong_corner_order = 50 // for boxes
+ failure_wrong_corner_order = 50, // for boxes
+ /// The geometry has at least one point with an invalid coordinate
+ /// (for example, the coordinate is a NaN)
+ failure_invalid_coordinate = 60
};
diff --git a/boost/geometry/arithmetic/determinant.hpp b/boost/geometry/arithmetic/determinant.hpp
index 14edea7182..a8e46ca9a0 100644
--- a/boost/geometry/arithmetic/determinant.hpp
+++ b/boost/geometry/arithmetic/determinant.hpp
@@ -18,6 +18,8 @@
#include <boost/geometry/geometries/concepts/point_concept.hpp>
#include <boost/geometry/util/select_coordinate_type.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
namespace boost { namespace geometry
{
diff --git a/boost/geometry/core/exception.hpp b/boost/geometry/core/exception.hpp
index 6868ca775a..21abbd577b 100644
--- a/boost/geometry/core/exception.hpp
+++ b/boost/geometry/core/exception.hpp
@@ -32,6 +32,7 @@ namespace boost { namespace geometry
*/
class exception : public std::exception
{
+public:
virtual char const* what() const throw()
{
return "Boost.Geometry exception";
diff --git a/boost/geometry/index/detail/is_bounding_geometry.hpp b/boost/geometry/index/detail/is_bounding_geometry.hpp
new file mode 100644
index 0000000000..d14204af71
--- /dev/null
+++ b/boost/geometry/index/detail/is_bounding_geometry.hpp
@@ -0,0 +1,35 @@
+// Boost.Geometry Index
+//
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_IS_BOUNDING_GEOMETRY_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_IS_BOUNDING_GEOMETRY_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+namespace boost { namespace geometry { namespace index { namespace detail {
+
+template
+<
+ typename Geometry,
+ typename Tag = typename geometry::tag<Geometry>::type
+>
+struct is_bounding_geometry
+{
+ static const bool value = false;
+};
+
+template <typename Box>
+struct is_bounding_geometry<Box, box_tag>
+{
+ static const bool value = true;
+};
+
+}}}} // namespave boost::geometry::index::detail
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_IS_BOUNDING_GEOMETRY_HPP
diff --git a/boost/geometry/index/detail/is_indexable.hpp b/boost/geometry/index/detail/is_indexable.hpp
new file mode 100644
index 0000000000..1e86463a37
--- /dev/null
+++ b/boost/geometry/index/detail/is_indexable.hpp
@@ -0,0 +1,47 @@
+// Boost.Geometry Index
+//
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_INDEX_DETAIL_IS_INDEXABLE_HPP
+#define BOOST_GEOMETRY_INDEX_DETAIL_IS_INDEXABLE_HPP
+
+#include <boost/geometry/core/tag.hpp>
+#include <boost/geometry/core/tags.hpp>
+
+namespace boost { namespace geometry { namespace index { namespace detail {
+
+template
+<
+ typename Geometry,
+ typename Tag = typename geometry::tag<Geometry>::type
+>
+struct is_indexable
+{
+ static const bool value = false;
+};
+
+template <typename Point>
+struct is_indexable<Point, geometry::point_tag>
+{
+ static const bool value = true;
+};
+
+template <typename Box>
+struct is_indexable<Box, geometry::box_tag>
+{
+ static const bool value = true;
+};
+
+template <typename Segment>
+struct is_indexable<Segment, geometry::segment_tag>
+{
+ static const bool value = true;
+};
+
+}}}} // namespave boost::geometry::index::detail
+
+#endif // BOOST_GEOMETRY_INDEX_DETAIL_IS_INDEXABLE_HPP
diff --git a/boost/geometry/index/detail/rtree/node/node.hpp b/boost/geometry/index/detail/rtree/node/node.hpp
index b04744c85a..2b270319f6 100644
--- a/boost/geometry/index/detail/rtree/node/node.hpp
+++ b/boost/geometry/index/detail/rtree/node/node.hpp
@@ -34,6 +34,7 @@
#include <boost/geometry/index/detail/rtree/visitors/is_leaf.hpp>
#include <boost/geometry/index/detail/algorithms/bounds.hpp>
+#include <boost/geometry/index/detail/is_bounding_geometry.hpp>
namespace boost { namespace geometry { namespace index {
@@ -45,8 +46,16 @@ template <typename Box, typename FwdIter, typename Translator>
inline Box elements_box(FwdIter first, FwdIter last, Translator const& tr)
{
Box result;
+
+ // Only here to suppress 'uninitialized local variable used' warning
+ // until the suggestion below is not implemented
+ geometry::assign_inverse(result);
- BOOST_GEOMETRY_INDEX_ASSERT(first != last, "non-empty range required");
+ //BOOST_GEOMETRY_INDEX_ASSERT(first != last, "non-empty range required");
+ // NOTE: this is not elegant temporary solution,
+ // reference to box could be passed as parameter and bool returned
+ if ( first == last )
+ return result;
detail::bounds(element_indexable(*first, tr), result);
++first;
@@ -57,6 +66,35 @@ inline Box elements_box(FwdIter first, FwdIter last, Translator const& tr)
return result;
}
+// Enlarge bounds of a leaf node WRT epsilon if needed.
+// It's because Points and Segments are compared WRT machine epsilon.
+// This ensures that leafs bounds correspond to the stored elements.
+// NOTE: this is done only if the Indexable is not a Box
+// in the future don't do it also for NSphere
+template <typename Box, typename FwdIter, typename Translator>
+inline Box values_box(FwdIter first, FwdIter last, Translator const& tr)
+{
+ typedef typename std::iterator_traits<FwdIter>::value_type element_type;
+ BOOST_MPL_ASSERT_MSG((is_leaf_element<element_type>::value),
+ SHOULD_BE_CALLED_ONLY_FOR_LEAF_ELEMENTS,
+ (element_type));
+
+ Box result = elements_box<Box>(first, last, tr);
+
+#ifdef BOOST_GEOMETRY_INDEX_EXPERIMENTAL_ENLARGE_BY_EPSILON
+ if (BOOST_GEOMETRY_CONDITION((
+ ! is_bounding_geometry
+ <
+ typename indexable_type<Translator>::type
+ >::value)))
+ {
+ geometry::detail::expand_by_epsilon(result);
+ }
+#endif
+
+ return result;
+}
+
// destroys subtree if the element is internal node's element
template <typename Value, typename Options, typename Translator, typename Box, typename Allocators>
struct destroy_element
diff --git a/boost/geometry/index/detail/rtree/node/node_elements.hpp b/boost/geometry/index/detail/rtree/node/node_elements.hpp
index e3bfb701f8..0e5848987e 100644
--- a/boost/geometry/index/detail/rtree/node/node_elements.hpp
+++ b/boost/geometry/index/detail/rtree/node/node_elements.hpp
@@ -2,7 +2,7 @@
//
// R-tree node elements access
//
-// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
//
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -12,6 +12,7 @@
#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_NODE_NODE_ELEMENTS_HPP
#include <boost/container/vector.hpp>
+#include <boost/geometry/algorithms/detail/expand_by_epsilon.hpp>
#include <boost/geometry/index/detail/varray.hpp>
#include <boost/geometry/index/detail/rtree/node/pairs.hpp>
@@ -36,6 +37,20 @@ struct element_indexable_type<
typedef First type;
};
+// is leaf element
+
+template <typename Element>
+struct is_leaf_element
+{
+ static const bool value = true;
+};
+
+template <typename First, typename Pointer>
+struct is_leaf_element< rtree::ptr_pair<First, Pointer> >
+{
+ static const bool value = false;
+};
+
// element's indexable getter
template <typename Element, typename Translator>
diff --git a/boost/geometry/index/detail/rtree/pack_create.hpp b/boost/geometry/index/detail/rtree/pack_create.hpp
index ce07d293db..e56ce076d2 100644
--- a/boost/geometry/index/detail/rtree/pack_create.hpp
+++ b/boost/geometry/index/detail/rtree/pack_create.hpp
@@ -14,6 +14,8 @@
#include <boost/geometry/algorithms/expand.hpp>
#include <boost/geometry/index/detail/algorithms/bounds.hpp>
+#include <boost/geometry/algorithms/detail/expand_by_epsilon.hpp>
+
namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree {
namespace pack_utils {
@@ -214,6 +216,11 @@ private:
}
}
+ void expand_by_epsilon()
+ {
+ geometry::detail::expand_by_epsilon(m_box);
+ }
+
BoxType const& get() const
{
BOOST_GEOMETRY_INDEX_ASSERT(m_initialized, "uninitialized envelope accessed");
@@ -264,6 +271,23 @@ private:
rtree::elements(l).push_back(*(first->second)); // MAY THROW (A?,C)
}
+#ifdef BOOST_GEOMETRY_INDEX_EXPERIMENTAL_ENLARGE_BY_EPSILON
+ // Enlarge bounds of a leaf node.
+ // It's because Points and Segments are compared WRT machine epsilon
+ // This ensures that leafs bounds correspond to the stored elements
+ // NOTE: this is done only if the Indexable is a different kind of Geometry
+ // than the bounds (only Box for now). Spatial predicates are checked
+ // the same way for Geometry of the same kind.
+ if ( BOOST_GEOMETRY_CONDITION((
+ ! index::detail::is_bounding_geometry
+ <
+ typename indexable_type<Translator>::type
+ >::value )) )
+ {
+ elements_box.expand_by_epsilon();
+ }
+#endif
+
auto_remover.release();
return internal_element(elements_box.get(), n);
}
diff --git a/boost/geometry/index/detail/rtree/rstar/insert.hpp b/boost/geometry/index/detail/rtree/rstar/insert.hpp
index ce92140872..127290194f 100644
--- a/boost/geometry/index/detail/rtree/rstar/insert.hpp
+++ b/boost/geometry/index/detail/rtree/rstar/insert.hpp
@@ -2,7 +2,7 @@
//
// R-tree R*-tree insert algorithm implementation
//
-// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
//
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -231,16 +231,28 @@ struct level_insert_base
}
template <typename Node>
- inline void recalculate_aabb_if_necessary(Node &n) const
+ inline void recalculate_aabb_if_necessary(Node const& n) const
{
if ( !result_elements.empty() && !base::m_traverse_data.current_is_root() )
{
// calulate node's new box
- base::m_traverse_data.current_element().first =
- elements_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(), base::m_translator);
+ recalculate_aabb(n);
}
}
+ template <typename Node>
+ inline void recalculate_aabb(Node const& n) const
+ {
+ base::m_traverse_data.current_element().first =
+ elements_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(), base::m_translator);
+ }
+
+ inline void recalculate_aabb(leaf const& n) const
+ {
+ base::m_traverse_data.current_element().first =
+ values_box<Box>(rtree::elements(n).begin(), rtree::elements(n).end(), base::m_translator);
+ }
+
size_type result_relative_level;
result_elements_type result_elements;
};
diff --git a/boost/geometry/index/detail/rtree/utilities/are_boxes_ok.hpp b/boost/geometry/index/detail/rtree/utilities/are_boxes_ok.hpp
index d2caa36707..8e0560379b 100644
--- a/boost/geometry/index/detail/rtree/utilities/are_boxes_ok.hpp
+++ b/boost/geometry/index/detail/rtree/utilities/are_boxes_ok.hpp
@@ -2,7 +2,7 @@
//
// R-tree boxes validating visitor implementation
//
-// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
//
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -60,13 +60,7 @@ public:
m_box = box_bckup;
m_is_root = is_root_bckup;
- Box box_exp;
- geometry::convert(elements.front().first, box_exp);
- for( typename elements_type::const_iterator it = elements.begin() + 1;
- it != elements.end() ; ++it)
- {
- geometry::expand(box_exp, it->first);
- }
+ Box box_exp = rtree::elements_box<Box>(elements.begin(), elements.end(), m_tr);
if ( m_exact_match )
result = m_is_root || geometry::equals(box_exp, m_box);
@@ -88,15 +82,7 @@ public:
return;
}
- Box box_exp;
- geometry::convert(
- index::detail::return_ref_or_bounds(m_tr(elements.front())),
- box_exp);
- for(typename elements_type::const_iterator it = elements.begin() + 1;
- it != elements.end() ; ++it)
- {
- geometry::expand(box_exp, m_tr(*it));
- }
+ Box box_exp = rtree::values_box<Box>(elements.begin(), elements.end(), m_tr);
if ( m_exact_match )
result = geometry::equals(box_exp, m_box);
diff --git a/boost/geometry/index/detail/rtree/visitors/children_box.hpp b/boost/geometry/index/detail/rtree/visitors/children_box.hpp
index 93726063b4..6c1bafd3de 100644
--- a/boost/geometry/index/detail/rtree/visitors/children_box.hpp
+++ b/boost/geometry/index/detail/rtree/visitors/children_box.hpp
@@ -2,7 +2,7 @@
//
// R-tree node children box calculating visitor implementation
//
-// Copyright (c) 2011-2013 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
//
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -40,7 +40,7 @@ public:
typedef typename rtree::elements_type<leaf>::type elements_type;
elements_type const& elements = rtree::elements(n);
- m_result = rtree::elements_box<Box>(elements.begin(), elements.end(), m_tr);
+ m_result = rtree::values_box<Box>(elements.begin(), elements.end(), m_tr);
}
private:
diff --git a/boost/geometry/index/detail/rtree/visitors/insert.hpp b/boost/geometry/index/detail/rtree/visitors/insert.hpp
index e697c065e1..87d5bbbcca 100644
--- a/boost/geometry/index/detail/rtree/visitors/insert.hpp
+++ b/boost/geometry/index/detail/rtree/visitors/insert.hpp
@@ -11,6 +11,11 @@
#ifndef BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_INSERT_HPP
#define BOOST_GEOMETRY_INDEX_DETAIL_RTREE_VISITORS_INSERT_HPP
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/geometry/algorithms/detail/expand_by_epsilon.hpp>
+#include <boost/geometry/util/condition.hpp>
+
#include <boost/geometry/index/detail/algorithms/content.hpp>
namespace boost { namespace geometry { namespace index {
@@ -262,6 +267,29 @@ protected:
BOOST_GEOMETRY_INDEX_ASSERT(0 != m_root_node, "there is no root node");
// TODO
// assert - check if Box is correct
+
+ // When a value is inserted, during the tree traversal bounds of nodes
+ // on a path from the root to a leaf must be expanded. So prepare
+ // a bounding object at the beginning to not do it later for each node.
+ // NOTE: This is actually only needed because conditionally the bounding
+ // object may be expanded below. Otherwise the indexable could be
+ // directly used instead
+ index::detail::bounds(rtree::element_indexable(m_element, m_translator), m_element_bounds);
+
+#ifdef BOOST_GEOMETRY_INDEX_EXPERIMENTAL_ENLARGE_BY_EPSILON
+ // Enlarge it in case if it's not bounding geometry type.
+ // It's because Points and Segments are compared WRT machine epsilon
+ // This ensures that leafs bounds correspond to the stored elements
+ if (BOOST_GEOMETRY_CONDITION((
+ boost::is_same<Element, Value>::value
+ && ! index::detail::is_bounding_geometry
+ <
+ typename indexable_type<Translator>::type
+ >::value )) )
+ {
+ geometry::detail::expand_by_epsilon(m_element_bounds);
+ }
+#endif
}
template <typename Visitor>
@@ -274,7 +302,8 @@ protected:
// expand the node to contain value
geometry::expand(
rtree::elements(n)[choosen_node_index].first,
- rtree::element_indexable(m_element, m_translator));
+ m_element_bounds
+ /*rtree::element_indexable(m_element, m_translator)*/);
// next traversing step
traverse_apply_visitor(visitor, n, choosen_node_index); // MAY THROW (V, E: alloc, copy, N:alloc)
@@ -342,6 +371,22 @@ protected:
// for exception safety
subtree_destroyer additional_node_ptr(additional_nodes[0].second, m_allocators);
+#ifdef BOOST_GEOMETRY_INDEX_EXPERIMENTAL_ENLARGE_BY_EPSILON
+ // Enlarge bounds of a leaf node.
+ // It's because Points and Segments are compared WRT machine epsilon
+ // This ensures that leafs' bounds correspond to the stored elements.
+ if (BOOST_GEOMETRY_CONDITION((
+ boost::is_same<Node, leaf>::value
+ && ! index::detail::is_bounding_geometry
+ <
+ typename indexable_type<Translator>::type
+ >::value )))
+ {
+ geometry::detail::expand_by_epsilon(n_box);
+ geometry::detail::expand_by_epsilon(additional_nodes[0].first);
+ }
+#endif
+
// node is not the root - just add the new node
if ( !m_traverse_data.current_is_root() )
{
@@ -383,6 +428,7 @@ protected:
// TODO: awulkiew - implement dispatchable split::apply to enable additional nodes creation
Element const& m_element;
+ Box m_element_bounds;
parameters_type const& m_parameters;
Translator const& m_translator;
size_type const m_relative_level;
diff --git a/boost/geometry/index/detail/rtree/visitors/remove.hpp b/boost/geometry/index/detail/rtree/visitors/remove.hpp
index 494d5a019e..6326f87db6 100644
--- a/boost/geometry/index/detail/rtree/visitors/remove.hpp
+++ b/boost/geometry/index/detail/rtree/visitors/remove.hpp
@@ -97,6 +97,9 @@ public:
size_type relative_level = m_leafs_level - m_current_level;
// move node to the container - store node's relative level as well and return new underflow state
+ // NOTE: if the min elements number is 1, then after an underflow
+ // here the child elements count is 0, so it's not required to store this node,
+ // it could just be destroyed
m_is_underflow = store_underflowed_node(elements, underfl_el_it, relative_level); // MAY THROW (E: alloc, copy)
}
@@ -120,10 +123,16 @@ public:
reinsert_removed_nodes_elements(); // MAY THROW (V, E: alloc, copy, N: alloc)
// shorten the tree
- if ( rtree::elements(n).size() == 1 )
+ // NOTE: if the min elements number is 1, then after underflow
+ // here the number of elements may be equal to 0
+ // this can occur only for the last removed element
+ if ( rtree::elements(n).size() <= 1 )
{
node_pointer root_to_destroy = m_root_node;
- m_root_node = rtree::elements(n)[0].second;
+ if ( rtree::elements(n).size() == 0 )
+ m_root_node = 0;
+ else
+ m_root_node = rtree::elements(n)[0].second;
--m_leafs_level;
rtree::destroy_node<Allocators, internal_node>::apply(m_allocators, root_to_destroy);
@@ -161,7 +170,7 @@ public:
if ( 0 != m_parent )
{
rtree::elements(*m_parent)[m_current_child_index].first
- = rtree::elements_box<Box>(elements.begin(), elements.end(), m_translator);
+ = rtree::values_box<Box>(elements.begin(), elements.end(), m_translator);
}
}
}
diff --git a/boost/geometry/index/indexable.hpp b/boost/geometry/index/indexable.hpp
index 391b544f37..feaae557af 100644
--- a/boost/geometry/index/indexable.hpp
+++ b/boost/geometry/index/indexable.hpp
@@ -1,6 +1,6 @@
// Boost.Geometry Index
//
-// Copyright (c) 2011-2014 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2011-2015 Adam Wulkiewicz, Lodz, Poland.
//
// Use, modification and distribution is subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -11,30 +11,9 @@
#include <boost/mpl/assert.hpp>
-namespace boost { namespace geometry { namespace index { namespace detail {
-
-template <typename Geometry, typename GeometryTag>
-struct is_indexable_impl { static const bool value = false; };
-
-template <typename Point>
-struct is_indexable_impl<Point, geometry::point_tag> { static const bool value = true; };
-
-template <typename Box>
-struct is_indexable_impl<Box, geometry::box_tag> { static const bool value = true; };
+#include <boost/geometry/index/detail/is_indexable.hpp>
-template <typename Segment>
-struct is_indexable_impl<Segment, geometry::segment_tag> { static const bool value = true; };
-
-template <typename Indexable>
-struct is_indexable
-{
- static const bool value =
- is_indexable_impl
- <
- Indexable,
- typename geometry::tag<Indexable>::type
- >::value;
-};
+namespace boost { namespace geometry { namespace index { namespace detail {
/*!
\brief The function object extracting Indexable from Value.
diff --git a/boost/geometry/index/rtree.hpp b/boost/geometry/index/rtree.hpp
index 84c4da8a2a..ea7fc74ed3 100644
--- a/boost/geometry/index/rtree.hpp
+++ b/boost/geometry/index/rtree.hpp
@@ -627,6 +627,9 @@ public:
template <typename ConvertibleOrRange>
inline void insert(ConvertibleOrRange const& conv_or_rng)
{
+ if ( !m_members.root )
+ this->raw_create();
+
typedef boost::mpl::bool_
<
boost::is_convertible<ConvertibleOrRange, value_type>::value
@@ -657,6 +660,9 @@ public:
*/
inline size_type remove(value_type const& value)
{
+ if ( !m_members.root )
+ return 0;
+
return this->raw_remove(value);
}
@@ -687,6 +693,10 @@ public:
inline size_type remove(Iterator first, Iterator last)
{
size_type result = 0;
+
+ if ( !m_members.root )
+ return result;
+
for ( ; first != last ; ++first )
result += this->raw_remove(*first);
return result;
@@ -716,6 +726,9 @@ public:
template <typename ConvertibleOrRange>
inline size_type remove(ConvertibleOrRange const& conv_or_rng)
{
+ if ( !m_members.root )
+ return 0;
+
typedef boost::mpl::bool_
<
boost::is_convertible<ConvertibleOrRange, value_type>::value
@@ -1279,6 +1292,9 @@ public:
template <typename ValueOrIndexable>
size_type count(ValueOrIndexable const& vori) const
{
+ if ( !m_members.root )
+ return 0;
+
// the input should be convertible to Value or Indexable type
enum { as_val = 0, as_ind, dont_know };
@@ -1570,9 +1586,6 @@ private:
inline void insert_dispatch(ValueConvertible const& val_conv,
boost::mpl::bool_<true> const& /*is_convertible*/)
{
- if ( !m_members.root )
- this->raw_create();
-
this->raw_insert(val_conv);
}
@@ -1592,9 +1605,6 @@ private:
PASSED_OBJECT_IS_NOT_CONVERTIBLE_TO_VALUE_NOR_A_RANGE,
(Range));
- if ( !m_members.root )
- this->raw_create();
-
typedef typename boost::range_const_iterator<Range>::type It;
for ( It it = boost::const_begin(rng); it != boost::const_end(rng) ; ++it )
this->raw_insert(*it);
@@ -1664,6 +1674,8 @@ private:
template <typename Predicates, typename OutIter>
size_type query_dispatch(Predicates const& predicates, OutIter out_it, boost::mpl::bool_<true> const& /*is_distance_predicate*/) const
{
+ BOOST_GEOMETRY_INDEX_ASSERT(m_members.root, "The root must exist");
+
static const unsigned distance_predicate_index = detail::predicates_find_distance<Predicates>::value;
detail::rtree::visitors::distance_query<
value_type,
@@ -1690,8 +1702,7 @@ private:
template <typename ValueOrIndexable>
size_type raw_count(ValueOrIndexable const& vori) const
{
- if ( !m_members.root )
- return 0;
+ BOOST_GEOMETRY_INDEX_ASSERT(m_members.root, "The root must exist");
detail::rtree::visitors::count
<
diff --git a/boost/geometry/policies/is_valid/failing_reason_policy.hpp b/boost/geometry/policies/is_valid/failing_reason_policy.hpp
index d1918adbda..bb28091d98 100644
--- a/boost/geometry/policies/is_valid/failing_reason_policy.hpp
+++ b/boost/geometry/policies/is_valid/failing_reason_policy.hpp
@@ -54,6 +54,8 @@ inline char const* validity_failure_type_message(validity_failure_type failure)
return "Geometry has duplicate (consecutive) points";
case failure_wrong_corner_order:
return "Box has corners in wrong order";
+ case failure_invalid_coordinate:
+ return "Geometry has point(s) with invalid coordinate(s)";
default: // to avoid -Wreturn-type warning
return "";
}
diff --git a/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp b/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp
index 99e7d9b50f..053723e4cc 100644
--- a/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp
+++ b/boost/geometry/strategies/agnostic/simplify_douglas_peucker.hpp
@@ -308,7 +308,7 @@ public :
namespace traits {
template <typename P>
-struct point_type<strategy::simplify::detail::douglas_peucker_point<P> >
+struct point_type<geometry::strategy::simplify::detail::douglas_peucker_point<P> >
{
typedef P type;
};
diff --git a/boost/geometry/strategies/cartesian/box_in_box.hpp b/boost/geometry/strategies/cartesian/box_in_box.hpp
index 9889658a13..56aef9e4df 100644
--- a/boost/geometry/strategies/cartesian/box_in_box.hpp
+++ b/boost/geometry/strategies/cartesian/box_in_box.hpp
@@ -1,9 +1,14 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
-// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland.
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+// Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
@@ -32,10 +37,10 @@ namespace within
struct box_within_range
{
template <typename BoxContainedValue, typename BoxContainingValue>
- static inline bool apply(BoxContainedValue const& bed_min
- , BoxContainedValue const& bed_max
- , BoxContainingValue const& bing_min
- , BoxContainingValue const& bing_max)
+ static inline bool apply(BoxContainedValue const& bed_min,
+ BoxContainedValue const& bed_max,
+ BoxContainingValue const& bing_min,
+ BoxContainingValue const& bing_max)
{
return bing_min <= bed_min && bed_max <= bing_max // contained in containing
&& bed_min < bed_max; // interiors overlap
@@ -46,10 +51,10 @@ struct box_within_range
struct box_covered_by_range
{
template <typename BoxContainedValue, typename BoxContainingValue>
- static inline bool apply(BoxContainedValue const& bed_min
- , BoxContainedValue const& bed_max
- , BoxContainingValue const& bing_min
- , BoxContainingValue const& bing_max)
+ static inline bool apply(BoxContainedValue const& bed_min,
+ BoxContainedValue const& bed_max,
+ BoxContainingValue const& bing_min,
+ BoxContainingValue const& bing_max)
{
return bed_min >= bing_min && bed_max <= bing_max;
}
diff --git a/boost/geometry/strategies/cartesian/point_in_box.hpp b/boost/geometry/strategies/cartesian/point_in_box.hpp
index 79f094113d..bd2303cbc4 100644
--- a/boost/geometry/strategies/cartesian/point_in_box.hpp
+++ b/boost/geometry/strategies/cartesian/point_in_box.hpp
@@ -1,8 +1,13 @@
// Boost.Geometry (aka GGL, Generic Geometry Library)
-// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
-// Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
-// Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
+// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
+// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
+// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
+
+// This file was modified by Oracle on 2015.
+// Modifications copyright (c) 2015, Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
diff --git a/boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp b/boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp
index 14c5bd4eda..59be3645f5 100644
--- a/boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp
+++ b/boost/geometry/strategies/spherical/distance_cross_track_point_box.hpp
@@ -161,7 +161,7 @@ public:
}
}
- // Otherwise determine which αμονγ the two medirian segments of the
+ // Otherwise determine which among the two medirian segments of the
// box the point is closest to, and compute the distance of
// the point to this closest segment
diff --git a/boost/geometry/strategies/transform/inverse_transformer.hpp b/boost/geometry/strategies/transform/inverse_transformer.hpp
index 685cf874b8..e64a46e4a8 100644
--- a/boost/geometry/strategies/transform/inverse_transformer.hpp
+++ b/boost/geometry/strategies/transform/inverse_transformer.hpp
@@ -16,6 +16,9 @@
// Remove the ublas checking, otherwise the inverse might fail
// (while nothing seems to be wrong)
+#ifdef BOOST_UBLAS_TYPE_CHECK
+#undef BOOST_UBLAS_TYPE_CHECK
+#endif
#define BOOST_UBLAS_TYPE_CHECK 0
#include <boost/numeric/ublas/lu.hpp>
diff --git a/boost/geometry/strategies/transform/matrix_transformers.hpp b/boost/geometry/strategies/transform/matrix_transformers.hpp
index 699b91b3aa..d891263a7d 100644
--- a/boost/geometry/strategies/transform/matrix_transformers.hpp
+++ b/boost/geometry/strategies/transform/matrix_transformers.hpp
@@ -24,6 +24,9 @@
// Remove the ublas checking, otherwise the inverse might fail
// (while nothing seems to be wrong)
+#ifdef BOOST_UBLAS_TYPE_CHECK
+#undef BOOST_UBLAS_TYPE_CHECK
+#endif
#define BOOST_UBLAS_TYPE_CHECK 0
#include <boost/numeric/conversion/cast.hpp>
diff --git a/boost/geometry/util/has_infinite_coordinate.hpp b/boost/geometry/util/has_infinite_coordinate.hpp
new file mode 100644
index 0000000000..3f1d11a3b0
--- /dev/null
+++ b/boost/geometry/util/has_infinite_coordinate.hpp
@@ -0,0 +1,55 @@
+// Boost.Geometry
+
+// Copyright (c) 2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_HAS_INFINITE_COORDINATE_HPP
+#define BOOST_GEOMETRY_UTIL_HAS_INFINITE_COORDINATE_HPP
+
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/util/has_nan_coordinate.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+struct isinf
+{
+ template <typename T>
+ static inline bool apply(T const& t)
+ {
+ return boost::math::isinf(t);
+ }
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+template <typename Point>
+bool has_infinite_coordinate(Point const& point)
+{
+ return detail::has_coordinate_with_property
+ <
+ Point,
+ detail::isinf,
+ boost::is_floating_point
+ <
+ typename coordinate_type<Point>::type
+ >::value
+ >::apply(point);
+}
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_UTIL_HAS_INFINITE_COORDINATE_HPP
diff --git a/boost/geometry/util/has_nan_coordinate.hpp b/boost/geometry/util/has_nan_coordinate.hpp
new file mode 100644
index 0000000000..93d7c7f035
--- /dev/null
+++ b/boost/geometry/util/has_nan_coordinate.hpp
@@ -0,0 +1,99 @@
+// Boost.Geometry
+
+// Copyright (c) 2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_HAS_NAN_COORDINATE_HPP
+#define BOOST_GEOMETRY_UTIL_HAS_NAN_COORDINATE_HPP
+
+#include <cstddef>
+
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include <boost/geometry/core/access.hpp>
+#include <boost/geometry/core/coordinate_dimension.hpp>
+#include <boost/geometry/core/coordinate_type.hpp>
+
+#include <boost/math/special_functions/fpclassify.hpp>
+
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+struct isnan
+{
+ template <typename T>
+ static inline bool apply(T const& t)
+ {
+ return boost::math::isnan(t);
+ }
+};
+
+template
+<
+ typename Point,
+ typename Predicate,
+ bool Enable,
+ std::size_t I = 0,
+ std::size_t N = geometry::dimension<Point>::value
+>
+struct has_coordinate_with_property
+{
+ static bool apply(Point const& point)
+ {
+ return Predicate::apply(geometry::get<I>(point))
+ || has_coordinate_with_property
+ <
+ Point, Predicate, Enable, I+1, N
+ >::apply(point);
+ }
+};
+
+template <typename Point, typename Predicate, std::size_t I, std::size_t N>
+struct has_coordinate_with_property<Point, Predicate, false, I, N>
+{
+ static inline bool apply(Point const&)
+ {
+ return false;
+ }
+};
+
+template <typename Point, typename Predicate, std::size_t N>
+struct has_coordinate_with_property<Point, Predicate, true, N, N>
+{
+ static bool apply(Point const& )
+ {
+ return false;
+ }
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+template <typename Point>
+bool has_nan_coordinate(Point const& point)
+{
+ return detail::has_coordinate_with_property
+ <
+ Point,
+ detail::isnan,
+ boost::is_floating_point
+ <
+ typename coordinate_type<Point>::type
+ >::value
+ >::apply(point);
+}
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_UTIL_HAS_NAN_COORDINATE_HPP
diff --git a/boost/geometry/util/has_non_finite_coordinate.hpp b/boost/geometry/util/has_non_finite_coordinate.hpp
new file mode 100644
index 0000000000..50075641ed
--- /dev/null
+++ b/boost/geometry/util/has_non_finite_coordinate.hpp
@@ -0,0 +1,55 @@
+// Boost.Geometry
+
+// Copyright (c) 2015 Oracle and/or its affiliates.
+
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GEOMETRY_UTIL_HAS_NON_FINITE_COORDINATE_HPP
+#define BOOST_GEOMETRY_UTIL_HAS_NON_FINITE_COORDINATE_HPP
+
+#include <boost/type_traits/is_floating_point.hpp>
+
+#include <boost/geometry/core/coordinate_type.hpp>
+#include <boost/geometry/util/has_nan_coordinate.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+namespace boost { namespace geometry
+{
+
+#ifndef DOXYGEN_NO_DETAIL
+namespace detail
+{
+
+struct is_not_finite
+{
+ template <typename T>
+ static inline bool apply(T const& t)
+ {
+ return ! boost::math::isfinite(t);
+ }
+};
+
+} // namespace detail
+#endif // DOXYGEN_NO_DETAIL
+
+template <typename Point>
+bool has_non_finite_coordinate(Point const& point)
+{
+ return detail::has_coordinate_with_property
+ <
+ Point,
+ detail::is_not_finite,
+ boost::is_floating_point
+ <
+ typename coordinate_type<Point>::type
+ >::value
+ >::apply(point);
+}
+
+}} // namespace boost::geometry
+
+#endif // BOOST_GEOMETRY_UTIL_HAS_NON_FINITE_COORDINATE_HPP
diff --git a/boost/geometry/util/math.hpp b/boost/geometry/util/math.hpp
index d84b11f480..c193c8f3f1 100644
--- a/boost/geometry/util/math.hpp
+++ b/boost/geometry/util/math.hpp
@@ -201,11 +201,36 @@ struct smaller<Type, true>
{
static inline bool apply(Type const& a, Type const& b)
{
- if (equals<Type, true>::apply(a, b, equals_default_policy()))
+ if (!(a < b)) // a >= b
{
return false;
}
- return a < b;
+
+ return ! equals<Type, true>::apply(b, a, equals_default_policy());
+ }
+};
+
+template <typename Type,
+ bool IsFloatingPoint = boost::is_floating_point<Type>::value>
+struct smaller_or_equals
+{
+ static inline bool apply(Type const& a, Type const& b)
+ {
+ return a <= b;
+ }
+};
+
+template <typename Type>
+struct smaller_or_equals<Type, true>
+{
+ static inline bool apply(Type const& a, Type const& b)
+ {
+ if (a <= b)
+ {
+ return true;
+ }
+
+ return equals<Type, true>::apply(a, b, equals_default_policy());
}
};
@@ -407,6 +432,30 @@ struct relaxed_epsilon
}
};
+// This must be consistent with math::equals.
+// By default math::equals() scales the error by epsilon using the greater of
+// compared values but here is only one value, though it should work the same way.
+// (a-a) <= max(a, a) * EPS -> 0 <= a*EPS
+// (a+da-a) <= max(a+da, a) * EPS -> da <= (a+da)*EPS
+template <typename T, bool IsFloat = boost::is_floating_point<T>::value>
+struct scaled_epsilon
+{
+ static inline T apply(T const& val)
+ {
+ return (std::max)(abs<T>::apply(val), T(1))
+ * std::numeric_limits<T>::epsilon();
+ }
+};
+
+template <typename T>
+struct scaled_epsilon<T, false>
+{
+ static inline T apply(T const&)
+ {
+ return T(0);
+ }
+};
+
// ItoF ItoI FtoF
template <typename Result, typename Source,
bool ResultIsInteger = std::numeric_limits<Result>::is_integer,
@@ -460,6 +509,12 @@ inline T relaxed_epsilon(T const& factor)
return detail::relaxed_epsilon<T>::apply(factor);
}
+template <typename T>
+inline T scaled_epsilon(T const& value)
+{
+ return detail::scaled_epsilon<T>::apply(value);
+}
+
// Maybe replace this by boost equals or boost ublas numeric equals or so
@@ -512,6 +567,24 @@ inline bool larger(T1 const& a, T2 const& b)
>::apply(b, a);
}
+template <typename T1, typename T2>
+inline bool smaller_or_equals(T1 const& a, T2 const& b)
+{
+ return detail::smaller_or_equals
+ <
+ typename select_most_precise<T1, T2>::type
+ >::apply(a, b);
+}
+
+template <typename T1, typename T2>
+inline bool larger_or_equals(T1 const& a, T2 const& b)
+{
+ return detail::smaller_or_equals
+ <
+ typename select_most_precise<T1, T2>::type
+ >::apply(b, a);
+}
+
template <typename T>
inline T d2r()
diff --git a/boost/heap/binomial_heap.hpp b/boost/heap/binomial_heap.hpp
index 7e0760f4a2..01ccf3fc8d 100644
--- a/boost/heap/binomial_heap.hpp
+++ b/boost/heap/binomial_heap.hpp
@@ -404,8 +404,13 @@ public:
binomial_heap children(value_comp(), element->children, sz);
if (trees.empty()) {
stability_counter_type stability_count = super_t::get_stability_count();
+ size_t size = constant_time_size ? size_holder::get_size()
+ : 0;
swap(children);
super_t::set_stability_count(stability_count);
+
+ if (constant_time_size)
+ size_holder::set_size( size );
} else
merge_and_clear_nodes(children);
diff --git a/boost/icl/concept/interval.hpp b/boost/icl/concept/interval.hpp
index e350cc637d..487d424abd 100644
--- a/boost/icl/concept/interval.hpp
+++ b/boost/icl/concept/interval.hpp
@@ -455,7 +455,7 @@ enable_if< mpl::and_< mpl::or_<is_static_right_open<Type>, is_static_open<Type>
, typename interval_traits<Type>::domain_type>::type
last_next(const Type& object)
{
- typedef typename interval_traits<Type>::domain_type domain_type;
+ //CL typedef typename interval_traits<Type>::domain_type domain_type;
return upper(object); // NOTE: last_next is implemented to avoid calling pred(object)
} // For unsigned integral types this may cause underflow.
@@ -1148,6 +1148,8 @@ left_subtract(Type right, const Type& left_minuend)
{
if(exclusive_less(left_minuend, right))
return right;
+ else if(upper_less_equal(right, left_minuend))
+ return identity_element<Type>::value();
return construct<Type>(domain_next<Type>(upper(left_minuend)), upper(right));
}
@@ -1175,7 +1177,7 @@ left_subtract(Type right, const Type& left_minuend)
//- right_subtract -------------------------------------------------------------
/** subtract \c right_minuend from the \c left interval on it's right side.
- Return the difference: The part of \c left right of \c right_minuend.
+ Return the difference: The part of \c left left of \c right_minuend.
\code
left_over = left - right_minuend; //on the right side.
[a ... : left
diff --git a/boost/icl/concept/interval_associator.hpp b/boost/icl/concept/interval_associator.hpp
index 14d522eb3d..5ffbe6256b 100644
--- a/boost/icl/concept/interval_associator.hpp
+++ b/boost/icl/concept/interval_associator.hpp
@@ -121,7 +121,7 @@ typename enable_if
cardinality(const Type& object)
{
typedef typename Type::size_type size_type;
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::interval_type interval_type;
size_type size = identity_element<size_type>::value();
ICL_const_FORALL(typename Type, it, object)
@@ -139,7 +139,7 @@ typename enable_if
cardinality(const Type& object)
{
typedef typename Type::size_type size_type;
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::interval_type interval_type;
size_type size = identity_element<size_type>::value();
size_type interval_size;
diff --git a/boost/icl/concept/interval_associator_base.hpp b/boost/icl/concept/interval_associator_base.hpp
index 00f187ac3a..f8b56e95cf 100644
--- a/boost/icl/concept/interval_associator_base.hpp
+++ b/boost/icl/concept/interval_associator_base.hpp
@@ -28,7 +28,7 @@ typename enable_if<mpl::and_< is_interval_container<Type>
, typename Type::const_iterator>::type
find(const Type& object, const typename domain_type_of<Type>::type& key_val)
{
- typedef typename Type::const_iterator const_iterator;
+ //CL typedef typename Type::const_iterator const_iterator;
typedef typename Type::interval_type interval_type;
return object.find(icl::detail::unit_trail<interval_type>(key_val));
}
@@ -41,7 +41,7 @@ typename enable_if<mpl::and_< is_interval_container<Type>
, typename Type::const_iterator>::type
find(const Type& object, const typename domain_type_of<Type>::type& key_val)
{
- typedef typename Type::const_iterator const_iterator;
+ //CL typedef typename Type::const_iterator const_iterator;
typedef typename Type::interval_type interval_type;
return object.find(icl::singleton<interval_type>(key_val));
}
diff --git a/boost/icl/concept/interval_map.hpp b/boost/icl/concept/interval_map.hpp
index ac645b9038..58298d8042 100644
--- a/boost/icl/concept/interval_map.hpp
+++ b/boost/icl/concept/interval_map.hpp
@@ -306,7 +306,7 @@ typename enable_if<is_interval_map<Type>, void>::type
add_intersection(Type& section, const Type& object,
const typename Type::element_type& operand)
{
- typedef typename Type::segment_type segment_type;
+ //CL typedef typename Type::segment_type segment_type;
object.add_intersection(section, make_segment<Type>(operand));
}
@@ -346,8 +346,8 @@ typename enable_if
>::type
add_intersection(Type& section, const Type& object, const MapT& operand)
{
- typedef typename Type::segment_type segment_type;
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::segment_type segment_type;
+ //CL typedef typename Type::interval_type interval_type;
typedef typename MapT::const_iterator const_iterator;
if(operand.empty())
@@ -538,7 +538,7 @@ typename enable_if< mpl::and_< mpl::not_<is_total<Type> >
flip(Type& object, const OperandT& operand)
{
typedef typename OperandT::const_iterator const_iterator;
- typedef typename Type::codomain_type codomain_type;
+ //CL typedef typename Type::codomain_type codomain_type;
const_iterator common_lwb, common_upb;
diff --git a/boost/icl/detail/concept_check.hpp b/boost/icl/detail/concept_check.hpp
index e8ebb40553..5a37f5f25c 100644
--- a/boost/icl/detail/concept_check.hpp
+++ b/boost/icl/detail/concept_check.hpp
@@ -9,8 +9,8 @@ Copyright (c) 2009-2009: Joachim Faulhaber
#define BOOST_ICL_CONCEPT_CHECK_HPP_JOFA_090913
#include <boost/concept_check.hpp>
-#include <boost/concept/detail/concept_def.hpp>
+#include <boost/concept/detail/concept_def.hpp>
namespace boost{ namespace icl
{
@@ -24,7 +24,7 @@ namespace boost{ namespace icl
};
}}// namespace boost icl
-
+#include <boost/concept/detail/concept_undef.hpp>
#endif
diff --git a/boost/icl/detail/interval_set_algo.hpp b/boost/icl/detail/interval_set_algo.hpp
index 8d557c7da4..1b8216a0a7 100644
--- a/boost/icl/detail/interval_set_algo.hpp
+++ b/boost/icl/detail/interval_set_algo.hpp
@@ -246,7 +246,7 @@ inline typename Type::iterator
join_on_left(Type& object, typename Type::iterator& left_,
typename Type::iterator& right_)
{
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::interval_type interval_type;
// both left and right are in the set and they are neighbours
BOOST_ASSERT(exclusive_less(key_value<Type>(left_), key_value<Type>(right_)));
BOOST_ASSERT(joinable(object, left_, right_));
@@ -260,7 +260,7 @@ inline typename Type::iterator
join_on_right(Type& object, typename Type::iterator& left_,
typename Type::iterator& right_)
{
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::interval_type interval_type;
// both left and right are in the map and they are neighbours
BOOST_ASSERT(exclusive_less(key_value<Type>(left_), key_value<Type>(right_)));
BOOST_ASSERT(joinable(object, left_, right_));
@@ -569,7 +569,7 @@ template<class Type>
typename Type::iterator
add(Type& object, const typename Type::value_type& addend)
{
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::interval_type interval_type;
typedef typename Type::iterator iterator;
typedef typename on_style<Type, Type::fineness>::type on_style_;
@@ -590,7 +590,7 @@ typename Type::iterator
add(Type& object, typename Type::iterator prior_,
const typename Type::value_type& addend)
{
- typedef typename Type::interval_type interval_type;
+ //CL typedef typename Type::interval_type interval_type;
typedef typename Type::iterator iterator;
typedef typename on_style<Type, Type::fineness>::type on_style_;
@@ -614,7 +614,7 @@ void subtract(Type& object, const typename Type::value_type& minuend)
{
typedef typename Type::iterator iterator;
typedef typename Type::interval_type interval_type;
- typedef typename Type::value_type value_type;
+ //CL typedef typename Type::value_type value_type;
if(icl::is_empty(minuend)) return;
diff --git a/boost/icl/detail/subset_comparer.hpp b/boost/icl/detail/subset_comparer.hpp
index 92b780411a..29f25a2240 100644
--- a/boost/icl/detail/subset_comparer.hpp
+++ b/boost/icl/detail/subset_comparer.hpp
@@ -119,8 +119,8 @@ public:
int co_compare(LeftIterT& left, RightIterT& right)
{
using namespace boost::mpl;
- typedef typename codomain_type_of<LeftT>::type LeftCodomainT;
- typedef typename codomain_type_of<RightT>::type RightCodomainT;
+ //CL typedef typename codomain_type_of<LeftT>::type LeftCodomainT;
+ //CL typedef typename codomain_type_of<RightT>::type RightCodomainT;
return
if_<
diff --git a/boost/icl/interval_base_map.hpp b/boost/icl/interval_base_map.hpp
index 4de6962bcc..f61990b2d0 100644
--- a/boost/icl/interval_base_map.hpp
+++ b/boost/icl/interval_base_map.hpp
@@ -10,12 +10,11 @@ Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
#define BOOST_ICL_INTERVAL_BASE_MAP_HPP_JOFA_990223
#include <limits>
-#include <boost/type_traits/ice.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/not.hpp>
-#include <boost/icl/detail/notate.hpp>
+#include <boost/icl/detail/notate.hpp>
#include <boost/icl/detail/design_config.hpp>
#include <boost/icl/detail/on_absorbtion.hpp>
#include <boost/icl/detail/interval_map_algo.hpp>
diff --git a/boost/icl/map.hpp b/boost/icl/map.hpp
index af021da735..6f3c851098 100644
--- a/boost/icl/map.hpp
+++ b/boost/icl/map.hpp
@@ -22,7 +22,6 @@ Copyright (c) 2007-2011: Joachim Faulhaber
#endif
#include <string>
-#include <boost/type_traits/ice.hpp>
#include <boost/call_traits.hpp>
#include <boost/icl/detail/notate.hpp>
#include <boost/icl/detail/design_config.hpp>
diff --git a/boost/icl/type_traits/has_inverse.hpp b/boost/icl/type_traits/has_inverse.hpp
index e73d7af594..fb7c612b6a 100644
--- a/boost/icl/type_traits/has_inverse.hpp
+++ b/boost/icl/type_traits/has_inverse.hpp
@@ -18,8 +18,8 @@ namespace boost{ namespace icl
{
typedef has_inverse<Type> type;
BOOST_STATIC_CONSTANT(bool,
- value = (type_traits::ice_or<boost::is_signed<Type>::value,
- is_floating_point<Type>::value>::value));
+ value = ( boost::is_signed<Type>::value
+ || is_floating_point<Type>::value ) );
};
}} // namespace boost icl
diff --git a/boost/icl/type_traits/infinity.hpp b/boost/icl/type_traits/infinity.hpp
index 3fe8e4dfcf..25ccb93a71 100644
--- a/boost/icl/type_traits/infinity.hpp
+++ b/boost/icl/type_traits/infinity.hpp
@@ -10,7 +10,6 @@ Copyright (c) 2010-2011: Joachim Faulhaber
#include <string>
#include <boost/static_assert.hpp>
-#include <boost/type_traits/ice.hpp>
#include <boost/icl/type_traits/is_numeric.hpp>
#include <boost/icl/type_traits/rep_type_of.hpp>
#include <boost/icl/type_traits/size_type_of.hpp>
@@ -24,10 +23,9 @@ template<class Type> struct has_std_infinity
{
typedef has_std_infinity type;
BOOST_STATIC_CONSTANT(bool,
- value = (type_traits::ice_and
- < is_numeric<Type>::value
- , std::numeric_limits<Type>::has_infinity
- >::value)
+ value = ( is_numeric<Type>::value
+ && std::numeric_limits<Type>::has_infinity
+ )
);
};
@@ -35,10 +33,9 @@ template<class Type> struct has_max_infinity
{
typedef has_max_infinity type;
BOOST_STATIC_CONSTANT(bool,
- value = (type_traits::ice_and
- < is_numeric<Type>::value
- , type_traits::ice_not<std::numeric_limits<Type>::has_infinity>::value
- >::value)
+ value = ( is_numeric<Type>::value
+ && ! std::numeric_limits<Type>::has_infinity
+ )
);
};
diff --git a/boost/icl/type_traits/is_interval_separator.hpp b/boost/icl/type_traits/is_interval_separator.hpp
index dedd246c6f..dd498269f7 100644
--- a/boost/icl/type_traits/is_interval_separator.hpp
+++ b/boost/icl/type_traits/is_interval_separator.hpp
@@ -8,6 +8,8 @@ Copyright (c) 2008-2009: Joachim Faulhaber
#ifndef BOOST_ICL_TYPE_TRAITS_IS_INTERVAL_SEPARATOR_HPP_JOFA_081004
#define BOOST_ICL_TYPE_TRAITS_IS_INTERVAL_SEPARATOR_HPP_JOFA_081004
+#include <boost/config.hpp>
+
namespace boost{ namespace icl
{
template <class Type> struct is_interval_separator
diff --git a/boost/icl/type_traits/is_numeric.hpp b/boost/icl/type_traits/is_numeric.hpp
index ff7f550744..9ecc3a16b8 100644
--- a/boost/icl/type_traits/is_numeric.hpp
+++ b/boost/icl/type_traits/is_numeric.hpp
@@ -12,7 +12,6 @@ Copyright (c) 2010-2010: Joachim Faulhaber
#include <complex>
#include <functional>
#include <boost/type_traits/is_floating_point.hpp>
-#include <boost/type_traits/ice.hpp>
#include <boost/type_traits/is_integral.hpp>
namespace boost{ namespace icl
diff --git a/boost/interprocess/containers/pair.hpp b/boost/interprocess/containers/pair.hpp
index 62a1453284..a6e11f49d0 100644
--- a/boost/interprocess/containers/pair.hpp
+++ b/boost/interprocess/containers/pair.hpp
@@ -27,7 +27,6 @@ namespace boost {
namespace interprocess {
using boost::container::container_detail::pair;
-using boost::container::container_detail::piecewise_construct;
} //namespace interprocess {
} //namespace boost {
diff --git a/boost/interprocess/detail/config_begin.hpp b/boost/interprocess/detail/config_begin.hpp
index b1cf078e00..d003ccd314 100644
--- a/boost/interprocess/detail/config_begin.hpp
+++ b/boost/interprocess/detail/config_begin.hpp
@@ -43,3 +43,8 @@
#pragma warning (disable : 4671) // the copy constructor is inaccessible
#pragma warning (disable : 4250) // inherits 'x' via dominance
#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
diff --git a/boost/interprocess/detail/config_end.hpp b/boost/interprocess/detail/config_end.hpp
index 28ec407312..55bccd1bf1 100644
--- a/boost/interprocess/detail/config_end.hpp
+++ b/boost/interprocess/detail/config_end.hpp
@@ -11,3 +11,6 @@
#pragma warning (pop)
#endif
+#if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
+#pragma GCC diagnostic pop
+#endif
diff --git a/boost/interprocess/detail/os_thread_functions.hpp b/boost/interprocess/detail/os_thread_functions.hpp
index 8469862cc9..3ff0a402ba 100644
--- a/boost/interprocess/detail/os_thread_functions.hpp
+++ b/boost/interprocess/detail/os_thread_functions.hpp
@@ -77,7 +77,19 @@ namespace ipcdetail{
typedef unsigned long OS_process_id_t;
typedef unsigned long OS_thread_id_t;
-typedef void* OS_thread_t;
+struct OS_thread_t
+{
+ OS_thread_t()
+ : m_handle()
+ {}
+
+
+ void* handle() const
+ { return m_handle; }
+
+ void* m_handle;
+};
+
typedef OS_thread_id_t OS_systemwide_thread_id_t;
//process
@@ -495,18 +507,21 @@ inline int thread_create( OS_thread_t * thread, unsigned (__stdcall * start_rout
void* h = (void*)_beginthreadex( 0, 0, start_routine, arg, 0, 0 );
if( h != 0 ){
- *thread = h;
+ thread->m_handle = h;
return 0;
}
else{
return 1;
}
+
+ thread->m_handle = (void*)_beginthreadex( 0, 0, start_routine, arg, 0, 0 );
+ return thread->m_handle != 0;
}
inline void thread_join( OS_thread_t thread)
{
- winapi::wait_for_single_object( thread, winapi::infinite_time );
- winapi::close_handle( thread );
+ winapi::wait_for_single_object( thread.handle(), winapi::infinite_time );
+ winapi::close_handle( thread.handle() );
}
#endif
diff --git a/boost/interprocess/detail/posix_time_types_wrk.hpp b/boost/interprocess/detail/posix_time_types_wrk.hpp
index ba4973028f..5a12d83d76 100644
--- a/boost/interprocess/detail/posix_time_types_wrk.hpp
+++ b/boost/interprocess/detail/posix_time_types_wrk.hpp
@@ -28,8 +28,9 @@
#endif //#ifndef WIN32_LEAN_AND_MEAN
#endif //#ifdef _WIN32
-#include <boost/date_time/posix_time/posix_time_types.hpp>
-#include <boost/date_time/posix_time/conversion.hpp>
+#include <boost/date_time/microsec_time_clock.hpp>
+#include <boost/date_time/posix_time/ptime.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
namespace boost {
namespace interprocess {
diff --git a/boost/interprocess/detail/std_fwd.hpp b/boost/interprocess/detail/std_fwd.hpp
index 098e67067c..282771c3e6 100644
--- a/boost/interprocess/detail/std_fwd.hpp
+++ b/boost/interprocess/detail/std_fwd.hpp
@@ -22,26 +22,8 @@
// Standard predeclarations
//////////////////////////////////////////////////////////////////////////////
-#if defined(_LIBCPP_VERSION)
- #define BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic push
- #if defined(__clang__)
- #pragma GCC diagnostic ignored "-Wc++11-extensions"
- #endif
- #define BOOST_INTERPROCESS_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
- #define BOOST_INTERPROCESS_STD_NS_END _LIBCPP_END_NAMESPACE_STD
-#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION) //GCC >= 4.6
- #define BOOST_INTERPROCESS_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION
- #define BOOST_INTERPROCESS_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION } // namespace
-#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE) //GCC >= 4.2
- #define BOOST_INTERPROCESS_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
- #define BOOST_INTERPROCESS_STD_NS_END _GLIBCXX_END_NAMESPACE
-#else
- #define BOOST_INTERPROCESS_STD_NS_BEG namespace std{
- #define BOOST_INTERPROCESS_STD_NS_END }
-#endif
-
-BOOST_INTERPROCESS_STD_NS_BEG
+#include <boost/move/detail/std_ns_begin.hpp>
+BOOST_MOVE_STD_NS_BEG
struct input_iterator_tag;
struct forward_iterator_tag;
@@ -51,17 +33,25 @@ struct random_access_iterator_tag;
template<class T>
struct char_traits;
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1800) &&defined(BOOST_DINKUMWARE_STDLIB)
+#define BOOST_INTERPROCESS_STD_FWD_MSVC_IOS_BUG
+// Compiler bug workaround. Previous versions (<= VC11)
+// used dummy virtual functions
+# pragma vtordisp(push, 2)
+#endif
+
template<class CharT, class Traits>
class basic_ostream;
template<class CharT, class Traits>
class basic_istream;
-BOOST_INTERPROCESS_STD_NS_END
+#ifdef BOOST_INTERPROCESS_STD_FWD_MSVC_IOS_BUG
+# pragma vtordisp(pop)
+# undef BOOST_INTERPROCESS_STD_FWD_MSVC_IOS_BUG
+#endif
-#ifdef BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic pop
- #undef BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
-#endif //BOOST_INTERPROCESS_CLANG_INLINE_STD_NS
+BOOST_MOVE_STD_NS_END
+#include <boost/move/detail/std_ns_end.hpp>
#endif //#ifndef BOOST_INTERPROCESS_DETAIL_STD_FWD_HPP
diff --git a/boost/interprocess/detail/utilities.hpp b/boost/interprocess/detail/utilities.hpp
index f1375d7361..7ff3def65b 100644
--- a/boost/interprocess/detail/utilities.hpp
+++ b/boost/interprocess/detail/utilities.hpp
@@ -33,6 +33,7 @@
#include <boost/intrusive/pointer_traits.hpp>
#include <boost/move/utility_core.hpp>
#include <boost/static_assert.hpp>
+#include <boost/cstdint.hpp>
#include <climits>
namespace boost {
@@ -156,27 +157,28 @@ inline bool size_overflows(SizeType count)
}
template<class RawPointer>
-class pointer_size_t_caster
+class pointer_uintptr_caster;
+
+template<class T>
+class pointer_uintptr_caster<T*>
{
public:
- BOOST_STATIC_ASSERT(sizeof(std::size_t) == sizeof(void*));
-
- explicit pointer_size_t_caster(std::size_t sz)
- : m_ptr(reinterpret_cast<RawPointer>(sz))
+ BOOST_FORCEINLINE explicit pointer_uintptr_caster(uintptr_t sz)
+ : m_uintptr(sz)
{}
- explicit pointer_size_t_caster(RawPointer p)
- : m_ptr(p)
+ BOOST_FORCEINLINE explicit pointer_uintptr_caster(const volatile T *p)
+ : m_uintptr(reinterpret_cast<uintptr_t>(p))
{}
- std::size_t size() const
- { return reinterpret_cast<std::size_t>(m_ptr); }
+ BOOST_FORCEINLINE uintptr_t uintptr() const
+ { return m_uintptr; }
- RawPointer pointer() const
- { return m_ptr; }
+ BOOST_FORCEINLINE T* pointer() const
+ { return reinterpret_cast<T*>(m_uintptr); }
private:
- RawPointer m_ptr;
+ uintptr_t m_uintptr;
};
diff --git a/boost/interprocess/detail/win32_api.hpp b/boost/interprocess/detail/win32_api.hpp
index b924341c32..0329b6dbe4 100644
--- a/boost/interprocess/detail/win32_api.hpp
+++ b/boost/interprocess/detail/win32_api.hpp
@@ -1,6 +1,6 @@
//////////////////////////////////////////////////////////////////////////////
//
-// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2015. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
@@ -33,8 +33,12 @@
#ifdef BOOST_USE_WINDOWS_H
#include <windows.h>
-#include <Wbemidl.h>
-#include <Objbase.h>
+
+# if defined(BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME)
+# include <Wbemidl.h>
+# include <Objbase.h>
+# endif
+
#include <Shlobj.h>
#endif
@@ -43,8 +47,7 @@
# pragma comment( lib, "Advapi32.lib" )
# pragma comment( lib, "oleaut32.lib" )
# pragma comment( lib, "Ole32.lib" )
-# pragma comment( lib, "Psapi.lib" )
-# pragma comment( lib, "Shell32.lib" ) //SHGetSpecialFolderPathA
+# pragma comment( lib, "Shell32.lib" ) //SHGetFolderPath
#endif
#if defined (BOOST_INTERPROCESS_WINDOWS)
@@ -139,22 +142,6 @@ struct wchar_variant
#pragma warning (pop)
#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
struct IUnknown_BIPC
{
public:
@@ -648,6 +635,8 @@ typedef int (__stdcall *farproc_t)();
typedef GUID GUID_BIPC;
typedef VARIANT wchar_variant;
+#if defined(BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME)
+
typedef IUnknown IUnknown_BIPC;
typedef IWbemClassObject IWbemClassObject_BIPC;
@@ -660,6 +649,8 @@ typedef IWbemServices IWbemServices_BIPC;
typedef IWbemLocator IWbemLocator_BIPC;
+#endif
+
typedef OVERLAPPED interprocess_overlapped;
typedef FILETIME interprocess_filetime;
@@ -1412,13 +1403,13 @@ inline bool get_file_information_by_handle(void *hnd, interprocess_by_handle_fil
{ return 0 != GetFileInformationByHandle(hnd, info); }
inline long interlocked_increment(long volatile *addr)
-{ return BOOST_INTERLOCKED_INCREMENT(addr); }
+{ return BOOST_INTERLOCKED_INCREMENT(const_cast<long*>(addr)); }
inline long interlocked_decrement(long volatile *addr)
-{ return BOOST_INTERLOCKED_DECREMENT(addr); }
+{ return BOOST_INTERLOCKED_DECREMENT(const_cast<long*>(addr)); }
inline long interlocked_compare_exchange(long volatile *addr, long val1, long val2)
-{ return BOOST_INTERLOCKED_COMPARE_EXCHANGE(addr, val1, val2); }
+{ return BOOST_INTERLOCKED_COMPARE_EXCHANGE(const_cast<long*>(addr), val1, val2); }
inline long interlocked_exchange_add(long volatile* addend, long value)
{ return BOOST_INTERLOCKED_EXCHANGE_ADD(const_cast<long*>(addend), value); }
@@ -1964,7 +1955,7 @@ inline void get_shared_documents_folder(std::string &s)
(void)err;
}
}
- #else //registry alternative: SHGetSpecialFolderPathA
+ #else //registry alternative: SHGetFolderPath
const int BIPC_CSIDL_COMMON_APPDATA = 0x0023; // All Users\Application Data
const int BIPC_CSIDL_FLAG_CREATE = 0x8000; // new for Win2K, or this in to force creation of folder
const int BIPC_SHGFP_TYPE_CURRENT = 0; // current value for user, verify it exists
@@ -2007,6 +1998,8 @@ inline void get_registry_value(const char *folder, const char *value_key, std::v
}
}
+#if defined(BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME)
+
struct co_uninitializer
{
co_uninitializer(bool b_uninitialize)
@@ -2147,8 +2140,6 @@ inline bool get_wmi_class_attribute( std::wstring& strValue, const wchar_t *wmi_
return bRet;
}
-#ifdef BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME
-
//Obtains the bootup time from WMI LastBootUpTime.
//This time seems to change with hibernation and clock synchronization so avoid it.
inline bool get_last_bootup_time( std::wstring& strValue )
diff --git a/boost/interprocess/detail/workaround.hpp b/boost/interprocess/detail/workaround.hpp
index daf4455be5..d7e86f464d 100644
--- a/boost/interprocess/detail/workaround.hpp
+++ b/boost/interprocess/detail/workaround.hpp
@@ -187,6 +187,9 @@
//Macros for documentation purposes. For code, expands to the argument
#define BOOST_INTERPROCESS_IMPDEF(TYPE) TYPE
#define BOOST_INTERPROCESS_SEEDOC(TYPE) TYPE
+#define BOOST_INTERPROCESS_DOC1ST(TYPE1, TYPE2) TYPE2
+#define BOOST_INTERPROCESS_I ,
+#define BOOST_INTERPROCESS_DOCIGN(T1) T1
#include <boost/interprocess/detail/config_end.hpp>
diff --git a/boost/interprocess/interprocess_fwd.hpp b/boost/interprocess/interprocess_fwd.hpp
index 14b7c2ba96..882256e934 100644
--- a/boost/interprocess/interprocess_fwd.hpp
+++ b/boost/interprocess/interprocess_fwd.hpp
@@ -14,6 +14,9 @@
#ifndef BOOST_CONFIG_HPP
# include <boost/config.hpp>
#endif
+#ifndef BOOST_CSTDINT_HPP
+# include <boost/cstdint.hpp>
+#endif
#
#if defined(BOOST_HAS_PRAGMA_ONCE)
# pragma once
@@ -238,8 +241,16 @@ class cached_adaptive_pool;
static const std::size_t offset_type_alignment = 0;
+#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
+# ifdef BOOST_HAS_INTPTR_T
+ using ::boost::uintptr_t;
+# else
+ typedef std::size_t uintptr_t;
+# endif
+#endif
+
template < class T, class DifferenceType = std::ptrdiff_t
- , class OffsetType = std::size_t, std::size_t Alignment = offset_type_alignment>
+ , class OffsetType = uintptr_t, std::size_t Alignment = offset_type_alignment>
class offset_ptr;
//////////////////////////////////////////////////////////////////////////////
diff --git a/boost/interprocess/mapped_region.hpp b/boost/interprocess/mapped_region.hpp
index 912b490900..e5eee0bf79 100644
--- a/boost/interprocess/mapped_region.hpp
+++ b/boost/interprocess/mapped_region.hpp
@@ -523,8 +523,8 @@ inline bool mapped_region::flush(std::size_t mapping_offset, std::size_t numbyte
inline bool mapped_region::shrink_by(std::size_t bytes, bool from_back)
{
- void *shrink_page_start;
- std::size_t shrink_page_bytes;
+ void *shrink_page_start = 0;
+ std::size_t shrink_page_bytes = 0;
if(!this->priv_shrink_param_check(bytes, from_back, shrink_page_start, shrink_page_bytes)){
return false;
}
diff --git a/boost/interprocess/offset_ptr.hpp b/boost/interprocess/offset_ptr.hpp
index dca55668b6..622b3cd6e3 100644
--- a/boost/interprocess/offset_ptr.hpp
+++ b/boost/interprocess/offset_ptr.hpp
@@ -52,14 +52,17 @@ namespace ipcdetail {
template<class OffsetType, std::size_t OffsetAlignment>
union offset_ptr_internal
{
+ BOOST_STATIC_ASSERT(sizeof(OffsetType) >= sizeof(uintptr_t));
+
explicit offset_ptr_internal(OffsetType off)
: m_offset(off)
{}
+
OffsetType m_offset; //Distance between this object and pointee address
+
typename ::boost::container::container_detail::aligned_storage
- < sizeof(OffsetType)
- , (OffsetAlignment == offset_type_alignment) ?
- ::boost::container::container_detail::alignment_of<OffsetType>::value : OffsetAlignment
+ < sizeof(OffsetType)//for offset_type_alignment m_offset will be enough
+ , (OffsetAlignment == offset_type_alignment) ? 1u : OffsetAlignment
>::type alignment_helper;
};
@@ -75,138 +78,92 @@ namespace ipcdetail {
// offset_ptr_to_raw_pointer
//
////////////////////////////////////////////////////////////////////////
- #define BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR
- #if defined(_MSC_VER) && (_MSC_VER >= 1800) && (defined(_M_AMD64) || defined(_M_X64))
- //Visual 2013 x64 optimizes more than we desire, so disable branchless option
- #else
- #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR
- #endif
- template<int Dummy>
- #ifndef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR
- BOOST_NOINLINE
- #elif defined(NDEBUG)
- inline
- #endif
- void * offset_ptr_to_raw_pointer(const volatile void *this_ptr, std::size_t offset)
+ #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR
+ BOOST_FORCEINLINE void * offset_ptr_to_raw_pointer(const volatile void *this_ptr, uintptr_t offset)
{
- typedef pointer_size_t_caster<void*> caster_t;
+ typedef pointer_uintptr_caster<void*> caster_t;
#ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR
if(offset == 1){
return 0;
}
else{
- const caster_t caster((void*)this_ptr);
- return caster_t(caster.size() + offset).pointer();
+ return caster_t(caster_t(this_ptr).uintptr() + offset).pointer();
}
#else
- const caster_t caster((void*)this_ptr);
- std::size_t target_offset = caster.size() + offset;
- std::size_t mask = -std::size_t(offset != 1);
+ uintptr_t mask = offset == 1;
+ --mask;
+ uintptr_t target_offset = caster_t(this_ptr).uintptr() + offset;
target_offset &= mask;
return caster_t(target_offset).pointer();
#endif
}
- #ifdef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR
- #undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_PTR
- #endif
- #ifdef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR
- #undef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR
- #endif
-
////////////////////////////////////////////////////////////////////////
//
// offset_ptr_to_offset
//
////////////////////////////////////////////////////////////////////////
- #define BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF
- //Branchless seems slower in x86
#define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF
-
- template<int Dummy>
- #ifndef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF
- BOOST_NOINLINE
- #elif defined(NDEBUG)
- inline
- #endif
- std::size_t offset_ptr_to_offset(const volatile void *ptr, const volatile void *this_ptr)
+ BOOST_FORCEINLINE uintptr_t offset_ptr_to_offset(const volatile void *ptr, const volatile void *this_ptr)
{
- typedef pointer_size_t_caster<void*> caster_t;
+ typedef pointer_uintptr_caster<void*> caster_t;
#ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF
//offset == 1 && ptr != 0 is not legal for this pointer
if(!ptr){
return 1;
}
else{
- const caster_t this_caster((void*)this_ptr);
- const caster_t ptr_caster((void*)ptr);
- std::size_t offset = ptr_caster.size() - this_caster.size();
+ uintptr_t offset = caster_t(ptr).uintptr() - caster_t(this_ptr).uintptr();
BOOST_ASSERT(offset != 1);
return offset;
}
#else
- const caster_t this_caster((void*)this_ptr);
- const caster_t ptr_caster((void*)ptr);
- //std::size_t other = -std::size_t(ptr != 0);
- //std::size_t offset = (ptr_caster.size() - this_caster.size()) & other;
- //return offset + !other;
+ //const uintptr_t other = -uintptr_t(ptr != 0);
+ //const uintptr_t offset = (caster_t(ptr).uintptr() - caster_t(this_ptr).uintptr()) & other;
+ //return offset + uintptr_t(!other);
//
- std::size_t offset = (ptr_caster.size() - this_caster.size() - 1) & -std::size_t(ptr != 0);
+ uintptr_t offset = caster_t(ptr).uintptr() - caster_t(this_ptr).uintptr();
+ --offset;
+ uintptr_t mask = uintptr_t(ptr == 0);
+ --mask;
+ offset &= mask;
return ++offset;
#endif
}
- #ifdef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF
- #undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF
- #endif
- #ifdef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF
- #undef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF
- #endif
-
////////////////////////////////////////////////////////////////////////
//
// offset_ptr_to_offset_from_other
//
////////////////////////////////////////////////////////////////////////
- #define BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER
- //Branchless seems slower in x86
#define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER
-
- template<int Dummy>
- #ifndef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER
- BOOST_NOINLINE
- #elif defined(NDEBUG)
- inline
- #endif
- std::size_t offset_ptr_to_offset_from_other
- (const volatile void *this_ptr, const volatile void *other_ptr, std::size_t other_offset)
+ BOOST_FORCEINLINE uintptr_t offset_ptr_to_offset_from_other
+ (const volatile void *this_ptr, const volatile void *other_ptr, uintptr_t other_offset)
{
- typedef pointer_size_t_caster<void*> caster_t;
+ typedef pointer_uintptr_caster<void*> caster_t;
#ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER
if(other_offset == 1){
return 1;
}
else{
- const caster_t this_caster((void*)this_ptr);
- const caster_t other_caster((void*)other_ptr);
- std::size_t offset = other_caster.size() - this_caster.size() + other_offset;
+ uintptr_t offset = caster_t(other_ptr).uintptr() - caster_t(this_ptr).uintptr() + other_offset;
BOOST_ASSERT(offset != 1);
return offset;
}
#else
- const caster_t this_caster((void*)this_ptr);
- const caster_t other_caster((void*)other_ptr);
- return ((other_caster.size() - this_caster.size()) & -std::size_t(other_offset != 1)) + other_offset;
+ uintptr_t mask = other_offset == 1;
+ --mask;
+ uintptr_t offset = caster_t(other_ptr).uintptr() - caster_t(this_ptr).uintptr();
+ offset &= mask;
+ return offset + other_offset;
+
+ //uintptr_t mask = -uintptr_t(other_offset != 1);
+ //uintptr_t offset = caster_t(other_ptr).uintptr() - caster_t(this_ptr).uintptr();
+ //offset &= mask;
+ //return offset + other_offset;
#endif
}
- #ifdef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER
- #undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_TO_OFF_FROM_OTHER
- #endif
- #ifdef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER
- #undef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER
- #endif
-
////////////////////////////////////////////////////////////////////////
//
// Let's assume cast to void and cv cast don't change any target address
@@ -216,15 +173,31 @@ namespace ipcdetail {
struct offset_ptr_maintains_address
{
static const bool value = ipcdetail::is_cv_same<From, To>::value
- || ipcdetail::is_cv_same<void, To>::value;
+ || ipcdetail::is_cv_same<void, To>::value
+ || ipcdetail::is_cv_same<char, To>::value
+ ;
};
+ template<class From, class To, class Ret = void>
+ struct enable_if_convertible_equal_address
+ : enable_if_c< is_convertible<From*, To*>::value
+ && offset_ptr_maintains_address<From, To>::value
+ , Ret>
+ {};
+
+ template<class From, class To, class Ret = void>
+ struct enable_if_convertible_unequal_address
+ : enable_if_c< is_convertible<From*, To*>::value
+ && !offset_ptr_maintains_address<From, To>::value
+ , Ret>
+ {};
+
} //namespace ipcdetail {
#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
//!A smart pointer that stores the offset between between the pointer and the
//!the object it points. This allows offset allows special properties, since
-//!the pointer is independent from the address address of the pointee, if the
+//!the pointer is independent from the address of the pointee, if the
//!pointer and the pointee are still separated by the same offset. This feature
//!converts offset_ptr in a smart pointer that can be placed in shared memory and
//!memory mapped files mapped in different addresses in every process.
@@ -232,11 +205,17 @@ namespace ipcdetail {
//! \tparam PointedType The type of the pointee.
//! \tparam DifferenceType A signed integer type that can represent the arithmetic operations on the pointer
//! \tparam OffsetType An unsigned integer type that can represent the
-//! distance between two pointers reinterpret_cast-ed as unsigned integers. In general this type
+//! distance between two pointers reinterpret_cast-ed as unsigned integers. This type
//! should be at least of the same size of std::uintptr_t. In some systems it's possible to communicate
//! between 32 and 64 bit processes using 64 bit offsets.
//! \tparam OffsetAlignment Alignment of the OffsetType stored inside. In some systems might be necessary
//! to align it to 64 bits in order to communicate 32 and 64 bit processes using 64 bit offsets.
+//!
+//!<b>Note</b>: offset_ptr uses implementation defined properties, present in most platforms, for
+//!performance reasons:
+//! - Assumes that uintptr_t representation of nullptr is (uintptr_t)zero.
+//! - Assumes that incrementing a uintptr_t obtained from a pointer is equivalent
+//! to incrementing the pointer and then converting it back to uintptr_t.
template <class PointedType, class DifferenceType, class OffsetType, std::size_t OffsetAlignment>
class offset_ptr
{
@@ -263,44 +242,42 @@ class offset_ptr
//!Default constructor (null pointer).
//!Never throws.
- offset_ptr()
+ BOOST_FORCEINLINE offset_ptr() BOOST_NOEXCEPT
: internal(1)
{}
//!Constructor from raw pointer (allows "0" pointer conversion).
//!Never throws.
- offset_ptr(pointer ptr)
- : internal(static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset<0>(ptr, this)))
+ BOOST_FORCEINLINE offset_ptr(pointer ptr) BOOST_NOEXCEPT
+ : internal(static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset(ptr, this)))
{}
//!Constructor from other pointer.
//!Never throws.
template <class T>
- offset_ptr( T *ptr
- , typename ipcdetail::enable_if< ipcdetail::is_convertible<T*, PointedType*> >::type * = 0)
+ BOOST_FORCEINLINE offset_ptr( T *ptr
+ , typename ipcdetail::enable_if< ipcdetail::is_convertible<T*, PointedType*> >::type * = 0) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(ptr), this)))
+ (ipcdetail::offset_ptr_to_offset(static_cast<PointedType*>(ptr), this)))
{}
//!Constructor from other offset_ptr
//!Never throws.
- offset_ptr(const offset_ptr& ptr)
+ BOOST_FORCEINLINE offset_ptr(const offset_ptr& ptr) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.internal.m_offset)))
+ (ipcdetail::offset_ptr_to_offset_from_other(this, &ptr, ptr.internal.m_offset)))
{}
//!Constructor from other offset_ptr. If pointers of pointee types are
//!convertible, offset_ptrs will be convertibles. Never throws.
template<class T2>
- offset_ptr( const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr
+ BOOST_FORCEINLINE offset_ptr( const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr
#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
- , typename ipcdetail::enable_if_c< ipcdetail::is_convertible<T2*, PointedType*>::value
- && ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value
- >::type * = 0
+ , typename ipcdetail::enable_if_convertible_equal_address<T2, PointedType>::type* = 0
#endif
- )
+ ) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.get_offset())))
+ (ipcdetail::offset_ptr_to_offset_from_other(this, &ptr, ptr.get_offset())))
{}
#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
@@ -308,12 +285,10 @@ class offset_ptr
//!Constructor from other offset_ptr. If pointers of pointee types are
//!convertible, offset_ptrs will be convertibles. Never throws.
template<class T2>
- offset_ptr( const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr
- , typename ipcdetail::enable_if_c< ipcdetail::is_convertible<T2*, PointedType*>::value
- && !ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value
- >::type * = 0)
+ BOOST_FORCEINLINE offset_ptr( const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr
+ , typename ipcdetail::enable_if_convertible_unequal_address<T2, PointedType>::type* = 0) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(ptr.get()), this)))
+ (ipcdetail::offset_ptr_to_offset(static_cast<PointedType*>(ptr.get()), this)))
{}
#endif
@@ -321,51 +296,51 @@ class offset_ptr
//!Emulates static_cast operator.
//!Never throws.
template<class T2, class P2, class O2, std::size_t A2>
- offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::static_cast_tag)
+ BOOST_FORCEINLINE offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::static_cast_tag) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(r.get()), this)))
+ (ipcdetail::offset_ptr_to_offset(static_cast<PointedType*>(r.get()), this)))
{}
//!Emulates const_cast operator.
//!Never throws.
template<class T2, class P2, class O2, std::size_t A2>
- offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::const_cast_tag)
+ BOOST_FORCEINLINE offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::const_cast_tag) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset<0>(const_cast<PointedType*>(r.get()), this)))
+ (ipcdetail::offset_ptr_to_offset(const_cast<PointedType*>(r.get()), this)))
{}
//!Emulates dynamic_cast operator.
//!Never throws.
template<class T2, class P2, class O2, std::size_t A2>
- offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::dynamic_cast_tag)
+ BOOST_FORCEINLINE offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::dynamic_cast_tag) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset<0>(dynamic_cast<PointedType*>(r.get()), this)))
+ (ipcdetail::offset_ptr_to_offset(dynamic_cast<PointedType*>(r.get()), this)))
{}
//!Emulates reinterpret_cast operator.
//!Never throws.
template<class T2, class P2, class O2, std::size_t A2>
- offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::reinterpret_cast_tag)
+ BOOST_FORCEINLINE offset_ptr(const offset_ptr<T2, P2, O2, A2> & r, ipcdetail::reinterpret_cast_tag) BOOST_NOEXCEPT
: internal(static_cast<OffsetType>
- (ipcdetail::offset_ptr_to_offset<0>(reinterpret_cast<PointedType*>(r.get()), this)))
+ (ipcdetail::offset_ptr_to_offset(reinterpret_cast<PointedType*>(r.get()), this)))
{}
//!Obtains raw pointer from offset.
//!Never throws.
- pointer get() const
- { return (pointer)ipcdetail::offset_ptr_to_raw_pointer<0>(this, this->internal.m_offset); }
+ BOOST_FORCEINLINE pointer get() const BOOST_NOEXCEPT
+ { return (pointer)ipcdetail::offset_ptr_to_raw_pointer(this, this->internal.m_offset); }
- offset_type get_offset() const
+ BOOST_FORCEINLINE offset_type get_offset() const BOOST_NOEXCEPT
{ return this->internal.m_offset; }
//!Pointer-like -> operator. It can return 0 pointer.
//!Never throws.
- pointer operator->() const
+ BOOST_FORCEINLINE pointer operator->() const BOOST_NOEXCEPT
{ return this->get(); }
//!Dereferencing operator, if it is a null offset_ptr behavior
//! is undefined. Never throws.
- reference operator* () const
+ BOOST_FORCEINLINE reference operator* () const BOOST_NOEXCEPT
{
pointer p = this->get();
reference r = *p;
@@ -374,75 +349,62 @@ class offset_ptr
//!Indexing operator.
//!Never throws.
- reference operator[](difference_type idx) const
+ BOOST_FORCEINLINE reference operator[](difference_type idx) const BOOST_NOEXCEPT
{ return this->get()[idx]; }
//!Assignment from pointer (saves extra conversion).
//!Never throws.
- offset_ptr& operator= (pointer from)
+ BOOST_FORCEINLINE offset_ptr& operator= (pointer from) BOOST_NOEXCEPT
{
this->internal.m_offset =
- static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset<0>(from, this));
+ static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset(from, this));
return *this;
}
//!Assignment from other offset_ptr.
//!Never throws.
- offset_ptr& operator= (const offset_ptr & ptr)
+ BOOST_FORCEINLINE offset_ptr& operator= (const offset_ptr & ptr) BOOST_NOEXCEPT
{
this->internal.m_offset =
- static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.internal.m_offset));
+ static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset_from_other(this, &ptr, ptr.internal.m_offset));
return *this;
}
//!Assignment from related offset_ptr. If pointers of pointee types
//! are assignable, offset_ptrs will be assignable. Never throws.
- template<class T2>
+ template<class T2> BOOST_FORCEINLINE
#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
- typename ipcdetail::enable_if_c< ipcdetail::is_convertible<T2*, PointedType*>::value
- && ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value
- , offset_ptr&>::type
+ typename ipcdetail::enable_if_c
+ < ipcdetail::is_convertible<T2*, PointedType*>::value, offset_ptr&>::type
#else
offset_ptr&
#endif
- operator= (const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr)
+ operator= (const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr) BOOST_NOEXCEPT
{
- this->internal.m_offset =
- static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset_from_other<0>(this, &ptr, ptr.get_offset()));
+ this->assign(ptr, ipcdetail::bool_<ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value>());
return *this;
}
- #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
- template<class T2>
- typename ipcdetail::enable_if_c<ipcdetail::is_convertible<T2*, PointedType*>::value
- && !ipcdetail::offset_ptr_maintains_address<T2, PointedType>::value
- , offset_ptr&>::type
- operator= (const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr)
- {
- this->internal.m_offset =
- static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset<0>(static_cast<PointedType*>(ptr.get()), this));
- return *this;
- }
- #endif
+ public:
//!offset_ptr += difference_type.
//!Never throws.
- offset_ptr &operator+= (difference_type offset)
+ BOOST_FORCEINLINE offset_ptr &operator+= (difference_type offset) BOOST_NOEXCEPT
{ this->inc_offset(offset * sizeof (PointedType)); return *this; }
//!offset_ptr -= difference_type.
//!Never throws.
- offset_ptr &operator-= (difference_type offset)
+ BOOST_FORCEINLINE offset_ptr &operator-= (difference_type offset) BOOST_NOEXCEPT
{ this->dec_offset(offset * sizeof (PointedType)); return *this; }
//!++offset_ptr.
//!Never throws.
- offset_ptr& operator++ (void)
+ BOOST_FORCEINLINE offset_ptr& operator++ (void) BOOST_NOEXCEPT
{ this->inc_offset(sizeof (PointedType)); return *this; }
//!offset_ptr++.
//!Never throws.
- offset_ptr operator++ (int)
+ BOOST_FORCEINLINE offset_ptr operator++ (int) BOOST_NOEXCEPT
{
offset_ptr tmp(*this);
this->inc_offset(sizeof (PointedType));
@@ -451,12 +413,12 @@ class offset_ptr
//!--offset_ptr.
//!Never throws.
- offset_ptr& operator-- (void)
+ BOOST_FORCEINLINE offset_ptr& operator-- (void) BOOST_NOEXCEPT
{ this->dec_offset(sizeof (PointedType)); return *this; }
//!offset_ptr--.
//!Never throws.
- offset_ptr operator-- (int)
+ BOOST_FORCEINLINE offset_ptr operator-- (int) BOOST_NOEXCEPT
{
offset_ptr tmp(*this);
this->dec_offset(sizeof (PointedType));
@@ -465,12 +427,17 @@ class offset_ptr
//!safe bool conversion operator.
//!Never throws.
- operator unspecified_bool_type() const
+ #if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS)
+ BOOST_FORCEINLINE operator unspecified_bool_type() const BOOST_NOEXCEPT
{ return this->internal.m_offset != 1? &self_t::unspecified_bool_type_func : 0; }
-
+ #else
+ explicit operator bool() const BOOST_NOEXCEPT
+ { return this->internal.m_offset != 1; }
+ #endif
+
//!Not operator. Not needed in theory, but improves portability.
//!Never throws
- bool operator! () const
+ BOOST_FORCEINLINE bool operator! () const BOOST_NOEXCEPT
{ return this->internal.m_offset == 1; }
//!Compatibility with pointer_traits
@@ -481,92 +448,92 @@ class offset_ptr
//!Compatibility with pointer_traits
//!
- static offset_ptr pointer_to(reference r)
+ BOOST_FORCEINLINE static offset_ptr pointer_to(reference r) BOOST_NOEXCEPT
{ return offset_ptr(&r); }
//!difference_type + offset_ptr
//!operation
- friend offset_ptr operator+(difference_type diff, offset_ptr right)
+ BOOST_FORCEINLINE friend offset_ptr operator+(difference_type diff, offset_ptr right) BOOST_NOEXCEPT
{ right += diff; return right; }
//!offset_ptr + difference_type
//!operation
- friend offset_ptr operator+(offset_ptr left, difference_type diff)
+ BOOST_FORCEINLINE friend offset_ptr operator+(offset_ptr left, difference_type diff) BOOST_NOEXCEPT
{ left += diff; return left; }
//!offset_ptr - diff
//!operation
- friend offset_ptr operator-(offset_ptr left, difference_type diff)
+ BOOST_FORCEINLINE friend offset_ptr operator-(offset_ptr left, difference_type diff) BOOST_NOEXCEPT
{ left -= diff; return left; }
//!offset_ptr - diff
//!operation
- friend offset_ptr operator-(difference_type diff, offset_ptr right)
+ BOOST_FORCEINLINE friend offset_ptr operator-(difference_type diff, offset_ptr right) BOOST_NOEXCEPT
{ right -= diff; return right; }
//!offset_ptr - offset_ptr
//!operation
- friend difference_type operator-(const offset_ptr &pt, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend difference_type operator-(const offset_ptr &pt, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return difference_type(pt.get()- pt2.get()); }
//Comparison
- friend bool operator== (const offset_ptr &pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator== (const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1.get() == pt2.get(); }
- friend bool operator!= (const offset_ptr &pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator!= (const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1.get() != pt2.get(); }
- friend bool operator<(const offset_ptr &pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator<(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1.get() < pt2.get(); }
- friend bool operator<=(const offset_ptr &pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator<=(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1.get() <= pt2.get(); }
- friend bool operator>(const offset_ptr &pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator>(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1.get() > pt2.get(); }
- friend bool operator>=(const offset_ptr &pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator>=(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1.get() >= pt2.get(); }
//Comparison to raw ptr to support literal 0
- friend bool operator== (pointer pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator== (pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1 == pt2.get(); }
- friend bool operator!= (pointer pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator!= (pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1 != pt2.get(); }
- friend bool operator<(pointer pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator<(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1 < pt2.get(); }
- friend bool operator<=(pointer pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator<=(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1 <= pt2.get(); }
- friend bool operator>(pointer pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator>(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1 > pt2.get(); }
- friend bool operator>=(pointer pt1, const offset_ptr &pt2)
+ BOOST_FORCEINLINE friend bool operator>=(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT
{ return pt1 >= pt2.get(); }
//Comparison
- friend bool operator== (const offset_ptr &pt1, pointer pt2)
+ BOOST_FORCEINLINE friend bool operator== (const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT
{ return pt1.get() == pt2; }
- friend bool operator!= (const offset_ptr &pt1, pointer pt2)
+ BOOST_FORCEINLINE friend bool operator!= (const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT
{ return pt1.get() != pt2; }
- friend bool operator<(const offset_ptr &pt1, pointer pt2)
+ BOOST_FORCEINLINE friend bool operator<(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT
{ return pt1.get() < pt2; }
- friend bool operator<=(const offset_ptr &pt1, pointer pt2)
+ BOOST_FORCEINLINE friend bool operator<=(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT
{ return pt1.get() <= pt2; }
- friend bool operator>(const offset_ptr &pt1, pointer pt2)
+ BOOST_FORCEINLINE friend bool operator>(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT
{ return pt1.get() > pt2; }
- friend bool operator>=(const offset_ptr &pt1, pointer pt2)
+ BOOST_FORCEINLINE friend bool operator>=(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT
{ return pt1.get() >= pt2; }
- friend void swap(offset_ptr &left, offset_ptr &right)
+ BOOST_FORCEINLINE friend void swap(offset_ptr &left, offset_ptr &right) BOOST_NOEXCEPT
{
pointer ptr = right.get();
right = left;
@@ -574,14 +541,36 @@ class offset_ptr
}
private:
+ template<class T2>
+ BOOST_FORCEINLINE void assign(const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr, ipcdetail::bool_<true>) BOOST_NOEXCEPT
+ { //no need to pointer adjustment
+ this->internal.m_offset =
+ static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset_from_other(this, &ptr, ptr.get_offset()));
+ }
+
+ template<class T2>
+ BOOST_FORCEINLINE void assign(const offset_ptr<T2, DifferenceType, OffsetType, OffsetAlignment> &ptr, ipcdetail::bool_<false>) BOOST_NOEXCEPT
+ { //we must convert to raw before calculating the offset
+ this->internal.m_offset =
+ static_cast<OffsetType>(ipcdetail::offset_ptr_to_offset(static_cast<PointedType*>(ptr.get()), this));
+ }
+
#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
- void inc_offset(DifferenceType bytes)
+ BOOST_FORCEINLINE void inc_offset(DifferenceType bytes) BOOST_NOEXCEPT
{ internal.m_offset += bytes; }
- void dec_offset(DifferenceType bytes)
+ BOOST_FORCEINLINE void dec_offset(DifferenceType bytes) BOOST_NOEXCEPT
{ internal.m_offset -= bytes; }
ipcdetail::offset_ptr_internal<OffsetType, OffsetAlignment> internal;
+
+ public:
+ BOOST_FORCEINLINE const OffsetType &priv_offset() const BOOST_NOEXCEPT
+ { return internal.m_offset; }
+
+ BOOST_FORCEINLINE OffsetType &priv_offset() BOOST_NOEXCEPT
+ { return internal.m_offset; }
+
#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED
};
@@ -601,8 +590,8 @@ inline std::basic_istream<E, T> & operator>>
//!Simulation of static_cast between pointers. Never throws.
template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2>
-inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
- static_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r)
+BOOST_FORCEINLINE boost::interprocess::offset_ptr<T1, P1, O1, A1>
+ static_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) BOOST_NOEXCEPT
{
return boost::interprocess::offset_ptr<T1, P1, O1, A1>
(r, boost::interprocess::ipcdetail::static_cast_tag());
@@ -610,8 +599,8 @@ inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
//!Simulation of const_cast between pointers. Never throws.
template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2>
-inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
- const_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r)
+BOOST_FORCEINLINE boost::interprocess::offset_ptr<T1, P1, O1, A1>
+ const_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) BOOST_NOEXCEPT
{
return boost::interprocess::offset_ptr<T1, P1, O1, A1>
(r, boost::interprocess::ipcdetail::const_cast_tag());
@@ -619,8 +608,8 @@ inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
//!Simulation of dynamic_cast between pointers. Never throws.
template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2>
-inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
- dynamic_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r)
+BOOST_FORCEINLINE boost::interprocess::offset_ptr<T1, P1, O1, A1>
+ dynamic_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) BOOST_NOEXCEPT
{
return boost::interprocess::offset_ptr<T1, P1, O1, A1>
(r, boost::interprocess::ipcdetail::dynamic_cast_tag());
@@ -628,8 +617,8 @@ inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
//!Simulation of reinterpret_cast between pointers. Never throws.
template<class T1, class P1, class O1, std::size_t A1, class T2, class P2, class O2, std::size_t A2>
-inline boost::interprocess::offset_ptr<T1, P1, O1, A1>
- reinterpret_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r)
+BOOST_FORCEINLINE boost::interprocess::offset_ptr<T1, P1, O1, A1>
+ reinterpret_pointer_cast(const boost::interprocess::offset_ptr<T2, P2, O2, A2> & r) BOOST_NOEXCEPT
{
return boost::interprocess::offset_ptr<T1, P1, O1, A1>
(r, boost::interprocess::ipcdetail::reinterpret_cast_tag());
@@ -662,7 +651,7 @@ namespace interprocess {
//!to_raw_pointer() enables boost::mem_fn to recognize offset_ptr.
//!Never throws.
template <class T, class P, class O, std::size_t A>
-inline T * to_raw_pointer(boost::interprocess::offset_ptr<T, P, O, A> const & p)
+BOOST_FORCEINLINE T * to_raw_pointer(boost::interprocess::offset_ptr<T, P, O, A> const & p) BOOST_NOEXCEPT
{ return ipcdetail::to_raw_pointer(p); }
} //namespace interprocess
@@ -699,33 +688,42 @@ template<class T, class P, class O, std::size_t A, std::size_t NumBits>
struct pointer_plus_bits<boost::interprocess::offset_ptr<T, P, O, A>, NumBits>
{
typedef boost::interprocess::offset_ptr<T, P, O, A> pointer;
- typedef ::boost::interprocess::pointer_size_t_caster<T*> caster_t;
//Bits are stored in the lower bits of the pointer except the LSB,
//because this bit is used to represent the null pointer.
- static const std::size_t Mask = ((std::size_t(1) << NumBits) - 1) << 1u;
+ static const uintptr_t Mask = ((uintptr_t(1) << uintptr_t(NumBits)) - uintptr_t(1)) << uintptr_t(1);
+ BOOST_STATIC_ASSERT(0 ==(Mask&1));
- static pointer get_pointer(const pointer &n)
+ //We must ALWAYS take argument "n" by reference as a copy of a null pointer
+ //with a bit (e.g. offset == 3) would be incorrectly copied and interpreted as non-null.
+
+ BOOST_FORCEINLINE static pointer get_pointer(const pointer &n) BOOST_NOEXCEPT
{
- caster_t caster(n.get());
- return pointer(caster_t(caster.size() & ~Mask).pointer());
+ pointer p;
+ O const tmp_off = n.priv_offset() & O(~Mask);
+ p.priv_offset() = boost::interprocess::ipcdetail::offset_ptr_to_offset_from_other(&p, &n, tmp_off);
+ return p;
}
- static void set_pointer(pointer &n, const pointer &p)
+ BOOST_FORCEINLINE static void set_pointer(pointer &n, const pointer &p) BOOST_NOEXCEPT
{
- caster_t n_caster(n.get());
- caster_t p_caster(p.get());
- BOOST_ASSERT(0 == (p_caster.size() & Mask));
- n = caster_t(p_caster.size() | (n_caster.size() & Mask)).pointer();
+ BOOST_ASSERT(0 == (get_bits)(p));
+ O const stored_bits = O(n.priv_offset() & Mask);
+ n = p;
+ n.priv_offset() |= stored_bits;
}
- static std::size_t get_bits(const pointer &n)
- { return (caster_t(n.get()).size() & Mask) >> 1u; }
+ BOOST_FORCEINLINE static std::size_t get_bits(const pointer &n) BOOST_NOEXCEPT
+ {
+ return std::size_t((n.priv_offset() & Mask) >> 1u);
+ }
- static void set_bits(pointer &n, std::size_t b)
+ BOOST_FORCEINLINE static void set_bits(pointer &n, std::size_t const b) BOOST_NOEXCEPT
{
BOOST_ASSERT(b < (std::size_t(1) << NumBits));
- caster_t n_caster(n.get());
- n = caster_t((n_caster.size() & ~Mask) | (b << 1u)).pointer();
+ O tmp = n.priv_offset();
+ tmp &= O(~Mask);
+ tmp |= O(b << 1u);
+ n.priv_offset() = tmp;
}
};
diff --git a/boost/interprocess/sync/interprocess_mutex.hpp b/boost/interprocess/sync/interprocess_mutex.hpp
index f3d52f9141..8bfc02c15d 100644
--- a/boost/interprocess/sync/interprocess_mutex.hpp
+++ b/boost/interprocess/sync/interprocess_mutex.hpp
@@ -158,7 +158,7 @@ inline void interprocess_mutex::lock()
{
#ifdef BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING
boost::posix_time::ptime wait_time
- = boost::posix_time::microsec_clock::universal_time()
+ = microsec_clock::universal_time()
+ boost::posix_time::milliseconds(BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS);
if (!m_mutex.timed_lock(wait_time))
{
diff --git a/boost/interprocess/sync/interprocess_recursive_mutex.hpp b/boost/interprocess/sync/interprocess_recursive_mutex.hpp
index 5da0c1f3b7..e382574937 100644
--- a/boost/interprocess/sync/interprocess_recursive_mutex.hpp
+++ b/boost/interprocess/sync/interprocess_recursive_mutex.hpp
@@ -154,7 +154,7 @@ inline void interprocess_recursive_mutex::lock()
{
#ifdef BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING
boost::posix_time::ptime wait_time
- = boost::posix_time::microsec_clock::universal_time()
+ = microsec_clock::universal_time()
+ boost::posix_time::milliseconds(BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS);
if (!mutex.timed_lock(wait_time)){
throw interprocess_exception(timeout_when_locking_error, "Interprocess mutex timeout when locking. Possible deadlock: owner died without unlocking?");
diff --git a/boost/interprocess/sync/interprocess_semaphore.hpp b/boost/interprocess/sync/interprocess_semaphore.hpp
index 8ae0c7933f..bb828dfb0e 100644
--- a/boost/interprocess/sync/interprocess_semaphore.hpp
+++ b/boost/interprocess/sync/interprocess_semaphore.hpp
@@ -122,7 +122,7 @@ inline void interprocess_semaphore::wait()
{
#ifdef BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING
boost::posix_time::ptime wait_time
- = boost::posix_time::microsec_clock::universal_time()
+ = microsec_clock::universal_time()
+ boost::posix_time::milliseconds(BOOST_INTERPROCESS_TIMEOUT_WHEN_LOCKING_DURATION_MS);
if (!m_sem.timed_wait(wait_time))
{
diff --git a/boost/intrusive/avl_set.hpp b/boost/intrusive/avl_set.hpp
index c3d8d999ac..5c51e5978d 100644
--- a/boost/intrusive/avl_set.hpp
+++ b/boost/intrusive/avl_set.hpp
@@ -328,7 +328,7 @@ class avl_set_impl
//! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp)
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
//! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const
std::pair<const_iterator, const_iterator>
@@ -339,7 +339,7 @@ class avl_set_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType& key, KeyTypeKeyCompare comp) const
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
diff --git a/boost/intrusive/bs_set.hpp b/boost/intrusive/bs_set.hpp
index a46ca38a01..2f560f5863 100644
--- a/boost/intrusive/bs_set.hpp
+++ b/boost/intrusive/bs_set.hpp
@@ -325,7 +325,7 @@ class bs_set_impl
//! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp)
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
//! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &)const
std::pair<const_iterator, const_iterator>
@@ -336,7 +336,7 @@ class bs_set_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType& key, KeyTypeKeyCompare comp) const
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
diff --git a/boost/intrusive/bstree.hpp b/boost/intrusive/bstree.hpp
index 7a67de6e12..b08c49b5f1 100644
--- a/boost/intrusive/bstree.hpp
+++ b/boost/intrusive/bstree.hpp
@@ -360,7 +360,11 @@ struct bstbase2
}
template<class KeyTypeKeyCompare>
- detail::key_nodeptr_comp<KeyTypeKeyCompare, value_traits, key_of_value> key_node_comp(KeyTypeKeyCompare comp) const
+ struct key_node_comp_ret
+ { typedef detail::key_nodeptr_comp<KeyTypeKeyCompare, value_traits, key_of_value> type; };
+
+ template<class KeyTypeKeyCompare>
+ typename key_node_comp_ret<KeyTypeKeyCompare>::type key_node_comp(KeyTypeKeyCompare comp) const
{
return detail::key_nodeptr_comp<KeyTypeKeyCompare, value_traits, key_of_value>(comp, &this->get_value_traits());
}
@@ -1245,6 +1249,19 @@ class bstree_impl
node_ptr to_insert(this->get_value_traits().to_node_ptr(value));
if(safemode_or_autounlink)
BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+
+ #if !(defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) ))
+ //Test insertion position is correct
+ iterator p(commit_data.node, this->priv_value_traits_ptr());
+ if(!commit_data.link_left){
+ ++p;
+ }
+ //Check if the insertion point is correct to detect wrong
+ //uses insert_unique_check
+ BOOST_ASSERT(( p == this->end() || !this->comp()(*p, value) ));
+ BOOST_ASSERT(( p == this->begin() || !this->comp()(value, *--p) ));
+ #endif
+
node_algorithms::insert_unique_commit
(this->header_ptr(), to_insert, commit_data);
this->sz_traits().increment();
@@ -1368,6 +1385,10 @@ class bstree_impl
size_type erase(const key_type &key)
{ return this->erase(key, this->key_comp()); }
+ //! <b>Requires</b>: key is a value such that `*this` is partitioned with respect to
+ //! comp(nk, key) and !comp(key, nk), with comp(nk, key) implying !comp(key, nk),
+ //! with nk the key_type of a value_type inserted into `*this`.
+ //!
//! <b>Effects</b>: Erases all the elements with the given key.
//! according to the comparison functor "comp".
//!
@@ -1448,6 +1469,10 @@ class bstree_impl
iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
{ size_type n; return this->private_erase(b, e, n, disposer); }
+ //! <b>Requires</b>: key is a value such that `*this` is partitioned with respect to
+ //! comp(nk, key) and !comp(key, nk), with comp(nk, key) implying !comp(key, nk)
+ //! and nk the key_type of a value_type inserted into `*this`.
+ //!
//! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
//!
//! <b>Effects</b>: Erases all the elements with the given key.
@@ -1520,6 +1545,10 @@ class bstree_impl
size_type count(const key_type &key) const
{ return size_type(this->count(key, this->key_comp())); }
+ //! <b>Requires</b>: key is a value such that `*this` is partitioned with respect to
+ //! comp(nk, key) and !comp(key, nk), with comp(nk, key) implying !comp(key, nk),
+ //! and nk the key_type of a value_type inserted into `*this`.
+ //!
//! <b>Effects</b>: Returns the number of contained elements with the given key
//!
//! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
@@ -1569,21 +1598,11 @@ class bstree_impl
//! <b>Throws</b>: If `key_compare` throws.
const_iterator lower_bound(const key_type &key) const;
- //! <b>Effects</b>: Returns an iterator to the first element whose
- //! key is not less than k or end() if that element does not exist.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `comp` throws.
+ //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &)
template<class KeyType, class KeyTypeKeyCompare>
iterator lower_bound(const KeyType &key, KeyTypeKeyCompare comp);
- //! <b>Effects</b>: Returns a const iterator to the first element whose
- //! key is not less than k or end() if that element does not exist.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `comp` throws.
+ //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
const_iterator lower_bound(const KeyType &key, KeyTypeKeyCompare comp) const;
@@ -1595,6 +1614,9 @@ class bstree_impl
//! <b>Throws</b>: If `key_compare` throws.
iterator upper_bound(const key_type &key);
+ //! <b>Requires</b>: key is a value such that `*this` is partitioned with respect to
+ //! !comp(key, nk), with nk the key_type of a value_type inserted into `*this`.
+ //!
//! <b>Effects</b>: Returns an iterator to the first element whose
//! key is greater than k according to comp or end() if that element
//! does not exist.
@@ -1605,21 +1627,10 @@ class bstree_impl
template<class KeyType, class KeyTypeKeyCompare>
iterator upper_bound(const KeyType &key, KeyTypeKeyCompare comp);
- //! <b>Effects</b>: Returns an iterator to the first element whose
- //! key is greater than k or end() if that element does not exist.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `key_compare` throws.
+ //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &)
const_iterator upper_bound(const key_type &key) const;
- //! <b>Effects</b>: Returns an iterator to the first element whose
- //! key is greater than k according to comp or end() if that element
- //! does not exist.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `comp` throws.
+ //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
const_iterator upper_bound(const KeyType &key, KeyTypeKeyCompare comp) const;
@@ -1631,6 +1642,10 @@ class bstree_impl
//! <b>Throws</b>: If `key_compare` throws.
iterator find(const key_type &key);
+ //! <b>Requires</b>: key is a value such that `*this` is partitioned with respect to
+ //! comp(nk, key) and !comp(key, nk), with comp(nk, key) implying !comp(key, nk),
+ //! and nk the key_type of a value_type inserted into `*this`.
+ //!
//! <b>Effects</b>: Finds an iterator to the first element whose key is
//! k or end() if that element does not exist.
//!
@@ -1640,20 +1655,10 @@ class bstree_impl
template<class KeyType, class KeyTypeKeyCompare>
iterator find(const KeyType &key, KeyTypeKeyCompare comp);
- //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
- //! k or end() if that element does not exist.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `key_compare` throws.
+ //! @copydoc ::boost::intrusive::bstree::find(const key_type &)
const_iterator find(const key_type &key) const;
- //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
- //! k or end() if that element does not exist.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `comp` throws.
+ //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
const_iterator find(const KeyType &key, KeyTypeKeyCompare comp) const;
@@ -1666,6 +1671,10 @@ class bstree_impl
//! <b>Throws</b>: If `key_compare` throws.
std::pair<iterator,iterator> equal_range(const key_type &key);
+ //! <b>Requires</b>: key is a value such that `*this` is partitioned with respect to
+ //! comp(nk, key) and !comp(key, nk), with comp(nk, key) implying !comp(key, nk),
+ //! with nk the key_type of a value_type inserted into `*this`.
+ //!
//! <b>Effects</b>: Finds a range containing all elements whose key is k or
//! an empty range that indicates the position where those elements would be
//! if they there is no elements with key k.
@@ -1676,29 +1685,21 @@ class bstree_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType &key, KeyTypeKeyCompare comp);
- //! <b>Effects</b>: Finds a range containing all elements whose key is k or
- //! an empty range that indicates the position where those elements would be
- //! if they there is no elements with key k.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `key_compare` throws.
- std::pair<const_iterator, const_iterator>
- equal_range(const key_type &key) const;
+ //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &)
+ std::pair<const_iterator, const_iterator> equal_range(const key_type &key) const;
- //! <b>Effects</b>: Finds a range containing all elements whose key is k or
- //! an empty range that indicates the position where those elements would be
- //! if they there is no elements with key k.
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `comp` throws.
+ //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType &key, KeyTypeKeyCompare comp) const;
- //! <b>Requires</b>: 'lower_key' must not be greater than 'upper_key'. If
- //! 'lower_key' == 'upper_key', ('left_closed' || 'right_closed') must be false.
+ //! <b>Requires</b>:
+ //! `upper_key` shall not precede `lower_key` according to key_compare.
+ //! [key_comp()(upper_key, lower_key) shall be false]
+ //!
+ //! If `lower_key` is equivalent to `upper_key`
+ //! [!key_comp()(upper_key, lower_key) && !key_comp()(lower_key, upper_key)] then
+ //! ('left_closed' || 'right_closed') must be false.
//!
//! <b>Effects</b>: Returns an a pair with the following criteria:
//!
@@ -1717,11 +1718,19 @@ class bstree_impl
std::pair<iterator,iterator> bounded_range
(const key_type &lower_key, const key_type &upper_value, bool left_closed, bool right_closed);
- //! <b>Requires</b>: KeyTypeKeyCompare is a function object that induces a strict weak
- //! ordering compatible with the strict weak ordering used to create the
- //! the container.
- //! 'lower_key' must not be greater than 'upper_key' according to 'comp'. If
- //! 'lower_key' == 'upper_key', ('left_closed' || 'right_closed') must be false.
+ //! <b>Requires</b>:
+ //! `lower_key` is a value such that `*this` is partitioned with respect to
+ //! comp(nk, lower_key) if left_closed is true, with respect to !comp(lower_key, nk) otherwise.
+ //!
+ //! `upper_key` is a value such that `*this` is partitioned with respect to
+ //! !comp(upper_key, nk) if right_closed is true, with respect to comp(nk, upper_key) otherwise.
+ //!
+ //! `upper_key` shall not precede `lower_key` according to comp
+ //! [comp(upper_key, lower_key) shall be false]
+ //!
+ //! If `lower_key` is equivalent to `upper_key`
+ //! [!comp(upper_key, lower_key) && !comp(lower_key, upper_key)] then
+ //! ('left_closed' || 'right_closed') must be false.
//!
//! <b>Effects</b>: Returns an a pair with the following criteria:
//!
@@ -1740,47 +1749,12 @@ class bstree_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> bounded_range
(const KeyType &lower_key, const KeyType &upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed);
-
- //! <b>Requires</b>: 'lower_key' must not be greater than 'upper_key'. If
- //! 'lower_key' == 'upper_key', ('left_closed' || 'right_closed') must be false.
- //!
- //! <b>Effects</b>: Returns an a pair with the following criteria:
- //!
- //! first = lower_bound(lower_key) if left_closed, upper_bound(lower_key) otherwise
- //!
- //! second = upper_bound(upper_key) if right_closed, lower_bound(upper_key) otherwise
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `key_compare` throws.
- //!
- //! <b>Note</b>: This function can be more efficient than calling upper_bound
- //! and lower_bound for lower_value and upper_value.
- //!
- //! <b>Note</b>: Experimental function, the interface might change in future releases.
+
+ //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type &,const key_type &,bool,bool)
std::pair<const_iterator,const_iterator> bounded_range
(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const;
- //! <b>Requires</b>: KeyTypeKeyCompare is a function object that induces a strict weak
- //! ordering compatible with the strict weak ordering used to create the
- //! the container.
- //! 'lower_key' must not be greater than 'upper_key' according to 'comp'. If
- //! 'lower_key' == 'upper_key', ('left_closed' || 'right_closed') must be false.
- //!
- //! <b>Effects</b>: Returns an a pair with the following criteria:
- //!
- //! first = lower_bound(lower_key, comp) if left_closed, upper_bound(lower_key, comp) otherwise
- //!
- //! second = upper_bound(upper_key, comp) if right_closed, lower_bound(upper_key, comp) otherwise
- //!
- //! <b>Complexity</b>: Logarithmic.
- //!
- //! <b>Throws</b>: If `comp` throws.
- //!
- //! <b>Note</b>: This function can be more efficient than calling upper_bound
- //! and lower_bound for lower_key and upper_key.
- //!
- //! <b>Note</b>: Experimental function, the interface might change in future releases.
+ //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator,const_iterator> bounded_range
(const KeyType &lower_key, const KeyType &upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const;
diff --git a/boost/intrusive/detail/ebo_functor_holder.hpp b/boost/intrusive/detail/ebo_functor_holder.hpp
index 27dd093b60..9fec5a32b7 100644
--- a/boost/intrusive/detail/ebo_functor_holder.hpp
+++ b/boost/intrusive/detail/ebo_functor_holder.hpp
@@ -22,6 +22,8 @@
# pragma once
#endif
+#include <boost/move/utility_core.hpp>
+
namespace boost {
namespace intrusive {
namespace detail {
@@ -155,20 +157,63 @@ template<typename T>
struct is_unary_or_binary_function : is_unary_or_binary_function_impl<T>
{};
-template<typename T, bool IsEmpty = true>
-class ebo_functor_holder_impl
+template<typename T, bool = is_unary_or_binary_function<T>::value>
+class ebo_functor_holder
{
+ BOOST_COPYABLE_AND_MOVABLE(ebo_functor_holder)
+
public:
- ebo_functor_holder_impl()
+ typedef T functor_type;
+
+ ebo_functor_holder()
+ : t_()
+ {}
+
+ explicit ebo_functor_holder(const T &t)
+ : t_(t)
{}
- ebo_functor_holder_impl(const T& t)
- : t_(t)
+
+ explicit ebo_functor_holder(BOOST_RV_REF(T) t)
+ : t_(::boost::move(t))
{}
+
template<class Arg1, class Arg2>
- ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2)
- : t_(arg1, arg2)
+ ebo_functor_holder(BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
+ : t_(::boost::forward<Arg1>(arg1), ::boost::forward<Arg2>(arg2))
+ {}
+
+ ebo_functor_holder(const ebo_functor_holder &x)
+ : t_(x)
+ {}
+
+ ebo_functor_holder(BOOST_RV_REF(ebo_functor_holder) x)
+ : t_(x.t_)
{}
+ ebo_functor_holder& operator=(BOOST_COPY_ASSIGN_REF(ebo_functor_holder) x)
+ {
+ this->get() = x.get();
+ return *this;
+ }
+
+ ebo_functor_holder& operator=(BOOST_RV_REF(ebo_functor_holder) x)
+ {
+ this->get() = ::boost::move(x.get());
+ return *this;
+ }
+
+ ebo_functor_holder& operator=(const T &x)
+ {
+ this->get() = x;
+ return *this;
+ }
+
+ ebo_functor_holder& operator=(BOOST_RV_REF(T) x)
+ {
+ this->get() = ::boost::move(x);
+ return *this;
+ }
+
T& get(){return t_;}
const T& get()const{return t_;}
@@ -177,50 +222,67 @@ class ebo_functor_holder_impl
};
template<typename T>
-class ebo_functor_holder_impl<T, false>
+class ebo_functor_holder<T, false>
: public T
{
+ BOOST_COPYABLE_AND_MOVABLE(ebo_functor_holder)
+
public:
- ebo_functor_holder_impl()
- {}
- explicit ebo_functor_holder_impl(const T& t)
- : T(t)
+ typedef T functor_type;
+
+ ebo_functor_holder()
+ : T()
{}
- template<class Arg1, class Arg2>
- ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2)
- : T(arg1, arg2)
+
+ explicit ebo_functor_holder(const T &t)
+ : T(t)
{}
- T& get(){return *this;}
- const T& get()const{return *this;}
-};
+ explicit ebo_functor_holder(BOOST_RV_REF(T) t)
+ : T(::boost::move(t))
+ {}
-template<typename T>
-class ebo_functor_holder
- : public ebo_functor_holder_impl<T, is_unary_or_binary_function<T>::value>
-{
- private:
- typedef ebo_functor_holder_impl<T, is_unary_or_binary_function<T>::value> super;
+ template<class Arg1, class Arg2>
+ ebo_functor_holder(BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2)
+ : T(::boost::forward<Arg1>(arg1), ::boost::forward<Arg2>(arg2))
+ {}
- public:
- typedef T functor_type;
- ebo_functor_holder(){}
- explicit ebo_functor_holder(const T& t)
- : super(t)
+ ebo_functor_holder(const ebo_functor_holder &x)
+ : T(static_cast<const T&>(x))
{}
- template<class Arg1, class Arg2>
- ebo_functor_holder(const Arg1& arg1, const Arg2& arg2)
- : super(arg1, arg2)
+ ebo_functor_holder(BOOST_RV_REF(ebo_functor_holder) x)
+ : T(BOOST_MOVE_BASE(T, x))
{}
- ebo_functor_holder& operator=(const ebo_functor_holder& x)
+ ebo_functor_holder& operator=(BOOST_COPY_ASSIGN_REF(ebo_functor_holder) x)
{
- this->get()=x.get();
+ const ebo_functor_holder&r = x;
+ this->get() = x.get();
+ return *this;
+ }
+
+ ebo_functor_holder& operator=(BOOST_RV_REF(ebo_functor_holder) x)
+ {
+ this->get() = ::boost::move(x.get());
+ return *this;
+ }
+
+ ebo_functor_holder& operator=(const T &x)
+ {
+ this->get() = x;
+ return *this;
+ }
+
+ ebo_functor_holder& operator=(BOOST_RV_REF(T) x)
+ {
+ this->get() = ::boost::move(x);
return *this;
}
-};
+ T& get(){return *this;}
+ const T& get()const{return *this;}
+};
} //namespace detail {
} //namespace intrusive {
diff --git a/boost/intrusive/detail/has_member_function_callable_with.hpp b/boost/intrusive/detail/has_member_function_callable_with.hpp
index 30bef56c2b..c9a8e7e637 100644
--- a/boost/intrusive/detail/has_member_function_callable_with.hpp
+++ b/boost/intrusive/detail/has_member_function_callable_with.hpp
@@ -167,7 +167,11 @@ BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG
void BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME();
};
- struct Base : public boost_intrusive_hmfcw::remove_cv<Type>::type, public BaseMixin {};
+ struct Base
+ : public boost_intrusive_hmfcw::remove_cv<Type>::type, public BaseMixin
+ { //Declare the unneeded default constructor as some old compilers wrongly require it with is_convertible
+ Base();
+ };
template <typename T, T t> class Helper{};
template <typename U>
@@ -244,11 +248,16 @@ BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEG
#if BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_MAX > 0
//1 to N arg specialization when BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME is present
+ //Declare some unneeded default constructor as some old compilers wrongly require it with is_convertible
#if defined(BOOST_NO_CXX11_DECLTYPE)
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_ITERATION(N)\
- template<class Fun> struct BOOST_MOVE_CAT(FunWrap##N, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME) : Fun\
+ \
+ template<class Fun>\
+ struct BOOST_MOVE_CAT(FunWrap##N, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME)\
+ : Fun\
{\
using Fun::BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME;\
+ BOOST_MOVE_CAT(FunWrap##N, BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME)();\
boost_intrusive_hmfcw::private_type BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME\
(BOOST_MOVE_REPEAT##N(boost_intrusive_hmfcw::dont_care)) const;\
};\
diff --git a/boost/intrusive/detail/key_nodeptr_comp.hpp b/boost/intrusive/detail/key_nodeptr_comp.hpp
index df2b895db9..1a5ec32acc 100644
--- a/boost/intrusive/detail/key_nodeptr_comp.hpp
+++ b/boost/intrusive/detail/key_nodeptr_comp.hpp
@@ -60,13 +60,15 @@ struct key_nodeptr_comp
//key_forward
template<class T>
- typename enable_if<is_node_ptr<T>, const key_type &>::type
- key_forward(const T &node) const
+ typename enable_if<is_node_ptr<T>, const key_type &>::type key_forward(const T &node) const
{ return key_of_value()(*traits_->to_value_ptr(node)); }
template<class T>
- typename disable_if<is_node_ptr<T>, const T &>::type
- const key_forward(const T &key) const
+ #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ const T &key_forward (const T &key, typename disable_if<is_node_ptr<T> >::type* =0) const
+ #else
+ typename disable_if<is_node_ptr<T>, const T &>::type key_forward(const T &key) const
+ #endif
{ return key; }
//operator() 1 arg
diff --git a/boost/intrusive/detail/math.hpp b/boost/intrusive/detail/math.hpp
index dfebe2ab42..4901053cb3 100644
--- a/boost/intrusive/detail/math.hpp
+++ b/boost/intrusive/detail/math.hpp
@@ -23,6 +23,7 @@
#include <cstddef>
#include <climits>
+#include <boost/intrusive/detail/mpl.hpp>
namespace boost {
namespace intrusive {
@@ -227,9 +228,28 @@ inline float fast_log2 (float val)
return val + static_cast<float>(log_2);
}
+inline bool is_pow2(std::size_t x)
+{ return (x & (x-1)) == 0; }
+
+template<std::size_t N>
+struct static_is_pow2
+{
+ static const bool value = (N & (N-1)) == 0;
+};
+
inline std::size_t ceil_log2 (std::size_t x)
{
- return static_cast<std::size_t>((x & (x-1)) != 0) + floor_log2(x);
+ return static_cast<std::size_t>(!(is_pow2)(x)) + floor_log2(x);
+}
+
+inline std::size_t ceil_pow2 (std::size_t x)
+{
+ return std::size_t(1u) << (ceil_log2)(x);
+}
+
+inline std::size_t previous_or_equal_pow2(std::size_t x)
+{
+ return std::size_t(1u) << floor_log2(x);
}
template<class SizeType, std::size_t N>
diff --git a/boost/intrusive/detail/parent_from_member.hpp b/boost/intrusive/detail/parent_from_member.hpp
index 30eba13e16..8701c3f269 100644
--- a/boost/intrusive/detail/parent_from_member.hpp
+++ b/boost/intrusive/detail/parent_from_member.hpp
@@ -115,10 +115,6 @@ inline const Parent *parent_from_member(const Member *member, const Member Paren
} //namespace intrusive {
} //namespace boost {
-#ifdef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
-#undef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
-#endif
-
#include <boost/intrusive/detail/config_end.hpp>
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP
diff --git a/boost/intrusive/detail/std_fwd.hpp b/boost/intrusive/detail/std_fwd.hpp
index 4b5cedbae3..8193ea8ed1 100644
--- a/boost/intrusive/detail/std_fwd.hpp
+++ b/boost/intrusive/detail/std_fwd.hpp
@@ -23,26 +23,8 @@
// Standard predeclarations
//////////////////////////////////////////////////////////////////////////////
-#if defined(_LIBCPP_VERSION)
- #define BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic push
- #if defined(__clang__)
- #pragma GCC diagnostic ignored "-Wc++11-extensions"
- #endif
- #define BOOST_INTRUSIVE_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
- #define BOOST_INTRUSIVE_STD_NS_END _LIBCPP_END_NAMESPACE_STD
-#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION) //GCC >= 4.6
- #define BOOST_INTRUSIVE_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION
- #define BOOST_INTRUSIVE_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION } // namespace
-#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE) //GCC >= 4.2
- #define BOOST_INTRUSIVE_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
- #define BOOST_INTRUSIVE_STD_NS_END _GLIBCXX_END_NAMESPACE
-#else
- #define BOOST_INTRUSIVE_STD_NS_BEG namespace std{
- #define BOOST_INTRUSIVE_STD_NS_END }
-#endif
-
-BOOST_INTRUSIVE_STD_NS_BEG
+#include <boost/move/detail/std_ns_begin.hpp>
+BOOST_MOVE_STD_NS_BEG
template<class T>
struct less;
@@ -55,11 +37,7 @@ struct forward_iterator_tag;
struct bidirectional_iterator_tag;
struct random_access_iterator_tag;
-BOOST_INTRUSIVE_STD_NS_END
-
-#ifdef BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic pop
- #undef BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
-#endif //BOOST_INTRUSIVE_CLANG_INLINE_STD_NS
+BOOST_MOVE_STD_NS_END
+#include <boost/move/detail/std_ns_end.hpp>
#endif //#ifndef BOOST_INTRUSIVE_DETAIL_STD_FWD_HPP
diff --git a/boost/intrusive/detail/tree_iterator.hpp b/boost/intrusive/detail/tree_iterator.hpp
index c2e980d27a..4985c6ce7b 100644
--- a/boost/intrusive/detail/tree_iterator.hpp
+++ b/boost/intrusive/detail/tree_iterator.hpp
@@ -106,14 +106,23 @@ class tree_iterator
return result;
}
- void go_left()
- { members_.nodeptr_ = node_traits::get_left(members_.nodeptr_); }
+ tree_iterator& go_left()
+ {
+ members_.nodeptr_ = node_traits::get_left(members_.nodeptr_);
+ return static_cast<tree_iterator&> (*this);
+ }
- void go_right()
- { members_.nodeptr_ = node_traits::get_right(members_.nodeptr_); }
+ tree_iterator& go_right()
+ {
+ members_.nodeptr_ = node_traits::get_right(members_.nodeptr_);
+ return static_cast<tree_iterator&> (*this);
+ }
- void go_parent()
- { members_.nodeptr_ = node_traits::get_parent(members_.nodeptr_); }
+ tree_iterator& go_parent()
+ {
+ members_.nodeptr_ = node_traits::get_parent(members_.nodeptr_);
+ return static_cast<tree_iterator&> (*this);
+ }
operator unspecified_bool_type() const
{ return members_.nodeptr_ ? &tree_iterator::unspecified_bool_type_func : 0; }
diff --git a/boost/intrusive/detail/tree_value_compare.hpp b/boost/intrusive/detail/tree_value_compare.hpp
index a05741edee..dc554442fe 100644
--- a/boost/intrusive/detail/tree_value_compare.hpp
+++ b/boost/intrusive/detail/tree_value_compare.hpp
@@ -34,14 +34,25 @@ struct tree_value_compare
typedef KeyOfValue key_of_value;
typedef Key key_type;
+
+ tree_value_compare()
+ : base_t()
+ {}
+
explicit tree_value_compare(const key_compare &kcomp)
: base_t(kcomp)
{}
- tree_value_compare()
- : base_t()
+ tree_value_compare (const tree_value_compare &x)
+ : base_t(x.base_t::get())
{}
+ tree_value_compare &operator=(const tree_value_compare &x)
+ { this->base_t::get() = x.base_t::get(); return *this; }
+
+ tree_value_compare &operator=(const key_compare &x)
+ { this->base_t::get() = x; return *this; }
+
const key_compare &key_comp() const
{ return static_cast<const key_compare &>(*this); }
@@ -54,13 +65,13 @@ struct tree_value_compare
{};
template<class U>
- typename boost::intrusive::detail::enable_if<is_key<U>, const key_type &>::type
- key_forward(const U &key) const
+ const key_type & key_forward
+ (const U &key, typename boost::intrusive::detail::enable_if<is_key<U> >::type* = 0) const
{ return key; }
template<class U>
- typename boost::intrusive::detail::disable_if<is_key<U>, const key_type &>::type
- key_forward(const U &key) const
+ const key_type & key_forward
+ (const U &key, typename boost::intrusive::detail::disable_if<is_key<U> >::type* = 0) const
{ return KeyOfValue()(key); }
template<class KeyType, class KeyType2>
diff --git a/boost/intrusive/intrusive_fwd.hpp b/boost/intrusive/intrusive_fwd.hpp
index b6b14c0698..f51276d636 100644
--- a/boost/intrusive/intrusive_fwd.hpp
+++ b/boost/intrusive/intrusive_fwd.hpp
@@ -16,7 +16,11 @@
#ifndef BOOST_CONFIG_HPP
# include <boost/config.hpp>
#endif
-
+#
+#ifndef BOOST_CSTDINT_HPP
+# include <boost/cstdint.hpp>
+#endif
+#
#if defined(BOOST_HAS_PRAGMA_ONCE)
# pragma once
#endif
@@ -65,6 +69,14 @@
namespace boost {
namespace intrusive {
+#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED)
+# ifdef BOOST_HAS_INTPTR_T
+ using ::boost::uintptr_t;
+# else
+ typedef std::size_t uintptr_t;
+# endif
+#endif
+
////////////////////////////
// Node algorithms
////////////////////////////
diff --git a/boost/intrusive/pointer_plus_bits.hpp b/boost/intrusive/pointer_plus_bits.hpp
index 117aff3c58..6168ea8ea4 100644
--- a/boost/intrusive/pointer_plus_bits.hpp
+++ b/boost/intrusive/pointer_plus_bits.hpp
@@ -64,25 +64,25 @@ struct pointer_plus_bits
template<class T, std::size_t NumBits>
struct pointer_plus_bits<T*, NumBits>
{
- static const std::size_t Mask = ((std::size_t(1u) << NumBits) - 1);
+ static const uintptr_t Mask = uintptr_t((uintptr_t(1u) << NumBits) - 1);
typedef T* pointer;
static pointer get_pointer(pointer n)
- { return pointer(std::size_t(n) & ~Mask); }
+ { return pointer(uintptr_t(n) & uintptr_t(~Mask)); }
static void set_pointer(pointer &n, pointer p)
{
- BOOST_INTRUSIVE_INVARIANT_ASSERT(0 == (std::size_t(p) & Mask));
- n = pointer(std::size_t(p) | (std::size_t(n) & Mask));
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(0 == (uintptr_t(p) & Mask));
+ n = pointer(uintptr_t(p) | (uintptr_t(n) & Mask));
}
static std::size_t get_bits(pointer n)
- { return (std::size_t(n) & Mask); }
+ { return std::size_t(uintptr_t(n) & Mask); }
static void set_bits(pointer &n, std::size_t c)
{
- BOOST_INTRUSIVE_INVARIANT_ASSERT(c <= Mask);
- n = pointer(std::size_t(get_pointer(n)) | c);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(uintptr_t(c) <= Mask);
+ n = pointer(uintptr_t((get_pointer)(n)) | uintptr_t(c));
}
};
diff --git a/boost/intrusive/pointer_traits.hpp b/boost/intrusive/pointer_traits.hpp
index 24843fddc5..731432b01f 100644
--- a/boost/intrusive/pointer_traits.hpp
+++ b/boost/intrusive/pointer_traits.hpp
@@ -223,7 +223,7 @@ struct pointer_traits
template<class UPtr>
static pointer priv_static_cast_from(boost::intrusive::detail::false_, const UPtr &uptr)
- { return pointer_to(*static_cast<element_type*>(to_raw_pointer(uptr))); }
+ { return uptr ? pointer_to(*static_cast<element_type*>(to_raw_pointer(uptr))) : pointer(); }
//priv_const_cast_from
template<class UPtr>
@@ -232,7 +232,7 @@ struct pointer_traits
template<class UPtr>
static pointer priv_const_cast_from(boost::intrusive::detail::false_, const UPtr &uptr)
- { return pointer_to(const_cast<element_type&>(*uptr)); }
+ { return uptr ? pointer_to(const_cast<element_type&>(*uptr)) : pointer(); }
//priv_dynamic_cast_from
template<class UPtr>
@@ -241,15 +241,7 @@ struct pointer_traits
template<class UPtr>
static pointer priv_dynamic_cast_from(boost::intrusive::detail::false_, const UPtr &uptr)
- {
- element_type *p = dynamic_cast<element_type*>(&*uptr);
- if(!p){
- return pointer();
- }
- else{
- return pointer_to(*p);
- }
- }
+ { return uptr ? pointer_to(dynamic_cast<element_type&>(*uptr)) : pointer(); }
///@endcond
};
diff --git a/boost/intrusive/rbtree_algorithms.hpp b/boost/intrusive/rbtree_algorithms.hpp
index 00d9fe3b18..2a74e1b2cd 100644
--- a/boost/intrusive/rbtree_algorithms.hpp
+++ b/boost/intrusive/rbtree_algorithms.hpp
@@ -448,6 +448,7 @@ class rbtree_algorithms
NodeTraits::set_color(x_parent, NodeTraits::red());
bstree_algo::rotate_left(x_parent, w, NodeTraits::get_parent(x_parent), header);
w = NodeTraits::get_right(x_parent);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(w);
}
node_ptr const w_left (NodeTraits::get_left(w));
node_ptr const w_right(NodeTraits::get_right(w));
@@ -463,6 +464,7 @@ class rbtree_algorithms
NodeTraits::set_color(w, NodeTraits::red());
bstree_algo::rotate_right(w, w_left, NodeTraits::get_parent(w), header);
w = NodeTraits::get_right(x_parent);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(w);
}
NodeTraits::set_color(w, NodeTraits::get_color(x_parent));
NodeTraits::set_color(x_parent, NodeTraits::black());
@@ -481,6 +483,7 @@ class rbtree_algorithms
NodeTraits::set_color(x_parent, NodeTraits::red());
bstree_algo::rotate_right(x_parent, w, NodeTraits::get_parent(x_parent), header);
w = NodeTraits::get_left(x_parent);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(w);
}
node_ptr const w_left (NodeTraits::get_left(w));
node_ptr const w_right(NodeTraits::get_right(w));
@@ -496,6 +499,7 @@ class rbtree_algorithms
NodeTraits::set_color(w, NodeTraits::red());
bstree_algo::rotate_left(w, w_right, NodeTraits::get_parent(w), header);
w = NodeTraits::get_left(x_parent);
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(w);
}
NodeTraits::set_color(w, NodeTraits::get_color(x_parent));
NodeTraits::set_color(x_parent, NodeTraits::black());
diff --git a/boost/intrusive/set.hpp b/boost/intrusive/set.hpp
index ae6a7a0812..f0072eab20 100644
--- a/boost/intrusive/set.hpp
+++ b/boost/intrusive/set.hpp
@@ -328,7 +328,7 @@ class set_impl
//! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp)
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
//! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const
std::pair<const_iterator, const_iterator>
@@ -339,7 +339,7 @@ class set_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType& key, KeyTypeKeyCompare comp) const
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
diff --git a/boost/intrusive/sg_set.hpp b/boost/intrusive/sg_set.hpp
index 560845e7a2..e6d4e377d3 100644
--- a/boost/intrusive/sg_set.hpp
+++ b/boost/intrusive/sg_set.hpp
@@ -326,7 +326,7 @@ class sg_set_impl
//! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp)
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
//! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const
std::pair<const_iterator, const_iterator>
@@ -337,7 +337,7 @@ class sg_set_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType& key, KeyTypeKeyCompare comp) const
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
diff --git a/boost/intrusive/sgtree.hpp b/boost/intrusive/sgtree.hpp
index dc84c80462..b4c4cdec1a 100644
--- a/boost/intrusive/sgtree.hpp
+++ b/boost/intrusive/sgtree.hpp
@@ -826,18 +826,17 @@ class sgtree_impl
//! <b>Complexity</b>: Linear to the elements in the subtree.
void balance_factor(float new_alpha)
{
- BOOST_INTRUSIVE_INVARIANT_ASSERT((new_alpha > 0.5f && new_alpha < 1.0f));
- if(new_alpha < 0.5f && new_alpha >= 1.0f) return;
-
//The alpha factor CAN't be changed if the fixed, floating operation-less
//1/sqrt(2) alpha factor option is activated
BOOST_STATIC_ASSERT((floating_point));
- float old_alpha = this->get_alpha_traits().get_alpha();
- this->get_alpha_traits().set_alpha(new_alpha);
-
- if(new_alpha < old_alpha){
- this->max_tree_size_ = this->size();
- this->rebalance();
+ BOOST_INTRUSIVE_INVARIANT_ASSERT((new_alpha > 0.5f && new_alpha < 1.0f));
+ if(new_alpha >= 0.5f && new_alpha < 1.0f){
+ float old_alpha = this->get_alpha_traits().get_alpha();
+ this->get_alpha_traits().set_alpha(new_alpha);
+ if(new_alpha < old_alpha){
+ this->max_tree_size_ = this->size();
+ this->rebalance();
+ }
}
}
diff --git a/boost/intrusive/splay_set.hpp b/boost/intrusive/splay_set.hpp
index eea19d7999..3d43215023 100644
--- a/boost/intrusive/splay_set.hpp
+++ b/boost/intrusive/splay_set.hpp
@@ -333,7 +333,7 @@ class splay_set_impl
//! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp)
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
//! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const
std::pair<const_iterator, const_iterator>
@@ -344,7 +344,7 @@ class splay_set_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType& key, KeyTypeKeyCompare comp) const
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
diff --git a/boost/intrusive/treap_set.hpp b/boost/intrusive/treap_set.hpp
index 188c80fdce..60cf449147 100644
--- a/boost/intrusive/treap_set.hpp
+++ b/boost/intrusive/treap_set.hpp
@@ -375,7 +375,7 @@ class treap_set_impl
//! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)
template<class KeyType, class KeyTypeKeyCompare>
std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp)
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
//! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const
std::pair<const_iterator, const_iterator>
@@ -386,7 +386,7 @@ class treap_set_impl
template<class KeyType, class KeyTypeKeyCompare>
std::pair<const_iterator, const_iterator>
equal_range(const KeyType& key, KeyTypeKeyCompare comp) const
- { return this->tree_type::lower_bound_range(key, comp); }
+ { return this->tree_type::equal_range(key, comp); }
#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
diff --git a/boost/iterator/zip_iterator.hpp b/boost/iterator/zip_iterator.hpp
index 304f65eb2f..83fa63b2a7 100644
--- a/boost/iterator/zip_iterator.hpp
+++ b/boost/iterator/zip_iterator.hpp
@@ -1,6 +1,8 @@
-// Copyright David Abrahams and Thomas Becker 2000-2006. Distributed
-// under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at
+// Copyright David Abrahams and Thomas Becker 2000-2006.
+// Copyright Kohei Takahashi 2012-2014.
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_ZIP_ITERATOR_TMB_07_13_2003_HPP_
@@ -12,19 +14,26 @@
#include <boost/iterator/iterator_facade.hpp>
#include <boost/iterator/iterator_adaptor.hpp> // for enable_if_convertible
#include <boost/iterator/iterator_categories.hpp>
-#include <boost/detail/iterator.hpp>
#include <boost/iterator/minimum_category.hpp>
-#include <boost/tuple/tuple.hpp>
+#include <utility> // for std::pair
+#include <boost/fusion/adapted/boost_tuple.hpp> // for backward compatibility
-#include <boost/type_traits/is_same.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/apply.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/lambda.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/transform.hpp>
#include <boost/mpl/placeholders.hpp>
-#include <boost/mpl/aux_/lambda_support.hpp>
+
+#include <boost/fusion/algorithm/iteration/for_each.hpp>
+#include <boost/fusion/algorithm/transformation/transform.hpp>
+#include <boost/fusion/sequence/convert.hpp>
+#include <boost/fusion/sequence/intrinsic/at_c.hpp>
+#include <boost/fusion/sequence/comparison/equal_to.hpp>
+#include <boost/fusion/support/tag_of_fwd.hpp>
namespace boost {
namespace iterators {
@@ -33,24 +42,6 @@ namespace iterators {
template<typename IteratorTuple>
class zip_iterator;
- // One important design goal of the zip_iterator is to isolate all
- // functionality whose implementation relies on the current tuple
- // implementation. This goal has been achieved as follows: Inside
- // the namespace detail there is a namespace tuple_impl_specific.
- // This namespace encapsulates all functionality that is specific
- // to the current Boost tuple implementation. More precisely, the
- // namespace tuple_impl_specific provides the following tuple
- // algorithms and meta-algorithms for the current Boost tuple
- // implementation:
- //
- // tuple_meta_transform
- // tuple_meta_accumulate
- // tuple_transform
- // tuple_for_each
- //
- // If the tuple implementation changes, all that needs to be
- // replaced is the implementation of these four (meta-)algorithms.
-
namespace detail
{
@@ -73,313 +64,96 @@ namespace iterators {
struct increment_iterator
{
template<typename Iterator>
- void operator()(Iterator& it)
+ void operator()(Iterator& it) const
{ ++it; }
};
//
struct decrement_iterator
{
template<typename Iterator>
- void operator()(Iterator& it)
+ void operator()(Iterator& it) const
{ --it; }
};
//
struct dereference_iterator
{
- template<typename Iterator>
- struct apply
+ template<typename>
+ struct result;
+
+ template<typename This, typename Iterator>
+ struct result<This(Iterator)>
{
typedef typename
- boost::detail::iterator_traits<Iterator>::reference
- type;
+ remove_reference<typename remove_cv<Iterator>::type>::type
+ iterator;
+
+ typedef typename iterator_reference<iterator>::type type;
};
template<typename Iterator>
- typename apply<Iterator>::type operator()(Iterator const& it)
+ typename result<dereference_iterator(Iterator)>::type
+ operator()(Iterator const& it) const
{ return *it; }
};
-
- // The namespace tuple_impl_specific provides two meta-
- // algorithms and two algorithms for tuples.
- //
- namespace tuple_impl_specific
- {
- // Meta-transform algorithm for tuples
- //
- template<typename Tuple, class UnaryMetaFun>
- struct tuple_meta_transform;
-
- template<typename Tuple, class UnaryMetaFun>
- struct tuple_meta_transform_impl
- {
- typedef tuples::cons<
- typename mpl::apply1<
- typename mpl::lambda<UnaryMetaFun>::type
- , typename Tuple::head_type
- >::type
- , typename tuple_meta_transform<
- typename Tuple::tail_type
- , UnaryMetaFun
- >::type
- > type;
- };
-
- template<typename Tuple, class UnaryMetaFun>
- struct tuple_meta_transform
- : mpl::eval_if<
- boost::is_same<Tuple, tuples::null_type>
- , mpl::identity<tuples::null_type>
- , tuple_meta_transform_impl<Tuple, UnaryMetaFun>
- >
- {
- };
-
- // Meta-accumulate algorithm for tuples. Note: The template
- // parameter StartType corresponds to the initial value in
- // ordinary accumulation.
- //
- template<class Tuple, class BinaryMetaFun, class StartType>
- struct tuple_meta_accumulate;
-
- template<
- typename Tuple
- , class BinaryMetaFun
- , typename StartType
- >
- struct tuple_meta_accumulate_impl
- {
- typedef typename mpl::apply2<
- typename mpl::lambda<BinaryMetaFun>::type
- , typename Tuple::head_type
- , typename tuple_meta_accumulate<
- typename Tuple::tail_type
- , BinaryMetaFun
- , StartType
- >::type
- >::type type;
- };
-
- template<
- typename Tuple
- , class BinaryMetaFun
- , typename StartType
- >
- struct tuple_meta_accumulate
- : mpl::eval_if<
- boost::is_same<Tuple, tuples::null_type>
- , mpl::identity<StartType>
- , tuple_meta_accumulate_impl<
- Tuple
- , BinaryMetaFun
- , StartType
- >
- >
- {
- };
-
-#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
- || ( \
- BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, != 0) && defined(_MSC_VER) \
- )
-// Not sure why intel's partial ordering fails in this case, but I'm
-// assuming int's an MSVC bug-compatibility feature.
-
-# define BOOST_TUPLE_ALGO_DISPATCH
-# define BOOST_TUPLE_ALGO(algo) algo##_impl
-# define BOOST_TUPLE_ALGO_TERMINATOR , int
-# define BOOST_TUPLE_ALGO_RECURSE , ...
-#else
-# define BOOST_TUPLE_ALGO(algo) algo
-# define BOOST_TUPLE_ALGO_TERMINATOR
-# define BOOST_TUPLE_ALGO_RECURSE
-#endif
-
- // transform algorithm for tuples. The template parameter Fun
- // must be a unary functor which is also a unary metafunction
- // class that computes its return type based on its argument
- // type. For example:
- //
- // struct to_ptr
- // {
- // template <class Arg>
- // struct apply
- // {
- // typedef Arg* type;
- // }
- //
- // template <class Arg>
- // Arg* operator()(Arg x);
- // };
- template<typename Fun>
- inline tuples::null_type BOOST_TUPLE_ALGO(tuple_transform)
- (tuples::null_type const&, Fun BOOST_TUPLE_ALGO_TERMINATOR)
- { return tuples::null_type(); }
-
- template<typename Tuple, typename Fun>
- inline typename tuple_meta_transform<
- Tuple
- , Fun
- >::type
-
- BOOST_TUPLE_ALGO(tuple_transform)(
- const Tuple& t,
- Fun f
- BOOST_TUPLE_ALGO_RECURSE
- )
- {
- typedef typename tuple_meta_transform<
- BOOST_DEDUCED_TYPENAME Tuple::tail_type
- , Fun
- >::type transformed_tail_type;
-
- return tuples::cons<
- BOOST_DEDUCED_TYPENAME mpl::apply1<
- Fun, BOOST_DEDUCED_TYPENAME Tuple::head_type
- >::type
- , transformed_tail_type
- >(
- f(boost::tuples::get<0>(t)), tuple_transform(t.get_tail(), f)
- );
- }
-
-#ifdef BOOST_TUPLE_ALGO_DISPATCH
- template<typename Tuple, typename Fun>
- inline typename tuple_meta_transform<
- Tuple
- , Fun
- >::type
-
- tuple_transform(
- const Tuple& t,
- Fun f
- )
- {
- return tuple_transform_impl(t, f, 1);
- }
-#endif
-
- // for_each algorithm for tuples.
- //
- template<typename Fun>
- inline Fun BOOST_TUPLE_ALGO(tuple_for_each)(
- tuples::null_type
- , Fun f BOOST_TUPLE_ALGO_TERMINATOR
- )
- { return f; }
-
-
- template<typename Tuple, typename Fun>
- inline Fun BOOST_TUPLE_ALGO(tuple_for_each)(
- Tuple& t
- , Fun f BOOST_TUPLE_ALGO_RECURSE)
- {
- f( t.get_head() );
- return tuple_for_each(t.get_tail(), f);
- }
-
-#ifdef BOOST_TUPLE_ALGO_DISPATCH
- template<typename Tuple, typename Fun>
- inline Fun
- tuple_for_each(
- Tuple& t,
- Fun f
- )
- {
- return tuple_for_each_impl(t, f, 1);
- }
-#endif
-
- // Equality of tuples. NOTE: "==" for tuples currently (7/2003)
- // has problems under some compilers, so I just do my own.
- // No point in bringing in a bunch of #ifdefs here. This is
- // going to go away with the next tuple implementation anyway.
- //
- inline bool tuple_equal(tuples::null_type, tuples::null_type)
- { return true; }
-
- template<typename Tuple1, typename Tuple2>
- inline bool tuple_equal(Tuple1 const& t1, Tuple2 const& t2)
- {
- return t1.get_head() == t2.get_head() &&
- tuple_equal(t1.get_tail(), t2.get_tail());
- }
- }
- //
- // end namespace tuple_impl_specific
-
- template<typename Iterator>
- struct iterator_reference
- {
- typedef typename boost::detail::iterator_traits<Iterator>::reference type;
- };
-
-#ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
- // Hack because BOOST_MPL_AUX_LAMBDA_SUPPORT doesn't seem to work
- // out well. Instantiating the nested apply template also
- // requires instantiating iterator_traits on the
- // placeholder. Instead we just specialize it as a metafunction
- // class.
- template<>
- struct iterator_reference<mpl::_1>
- {
- template <class T>
- struct apply : iterator_reference<T> {};
- };
-#endif
-
// Metafunction to obtain the type of the tuple whose element types
// are the reference types of an iterator tuple.
//
template<typename IteratorTuple>
struct tuple_of_references
- : tuple_impl_specific::tuple_meta_transform<
+ : mpl::transform<
IteratorTuple,
iterator_reference<mpl::_1>
>
{
};
+ // Specialization for std::pair
+ template<typename Iterator1, typename Iterator2>
+ struct tuple_of_references<std::pair<Iterator1, Iterator2> >
+ {
+ typedef std::pair<
+ typename iterator_reference<Iterator1>::type
+ , typename iterator_reference<Iterator2>::type
+ > type;
+ };
+
// Metafunction to obtain the minimal traversal tag in a tuple
// of iterators.
//
template<typename IteratorTuple>
struct minimum_traversal_category_in_iterator_tuple
{
- typedef typename tuple_impl_specific::tuple_meta_transform<
+ typedef typename mpl::transform<
IteratorTuple
, pure_traversal_tag<iterator_traversal<> >
>::type tuple_of_traversal_tags;
- typedef typename tuple_impl_specific::tuple_meta_accumulate<
+ typedef typename mpl::fold<
tuple_of_traversal_tags
- , minimum_category<>
, random_access_traversal_tag
+ , minimum_category<>
>::type type;
};
- // We need to call tuple_meta_accumulate with mpl::and_ as the
- // accumulating functor. To this end, we need to wrap it into
- // a struct that has exactly two arguments (that is, template
- // parameters) and not five, like mpl::and_ does.
- //
- template<typename Arg1, typename Arg2>
- struct and_with_two_args
- : mpl::and_<Arg1, Arg2>
- {
- };
-
-# ifdef BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT
- // Hack because BOOST_MPL_AUX_LAMBDA_SUPPORT doesn't seem to work
- // out well. In this case I think it's an MPL bug
- template<>
- struct and_with_two_args<mpl::_1,mpl::_2>
- {
- template <class A1, class A2>
- struct apply : mpl::and_<A1,A2>
- {};
- };
-# endif
+ template<typename Iterator1, typename Iterator2>
+ struct minimum_traversal_category_in_iterator_tuple<std::pair<Iterator1, Iterator2> >
+ {
+ typedef typename pure_traversal_tag<
+ typename iterator_traversal<Iterator1>::type
+ >::type iterator1_traversal;
+ typedef typename pure_traversal_tag<
+ typename iterator_traversal<Iterator2>::type
+ >::type iterator2_traversal;
+
+ typedef typename minimum_category<
+ iterator1_traversal
+ , typename minimum_category<
+ iterator2_traversal
+ , random_access_traversal_tag
+ >::type
+ >::type type;
+ };
///////////////////////////////////////////////////////////////////
//
@@ -401,9 +175,9 @@ namespace iterators {
typedef reference value_type;
// Difference type is the first iterator's difference type
- typedef typename boost::detail::iterator_traits<
- typename tuples::element<0, IteratorTuple>::type
- >::difference_type difference_type;
+ typedef typename iterator_difference<
+ typename mpl::at_c<IteratorTuple, 0>::type
+ >::type difference_type;
// Traversal catetgory is the minimum traversal category in the
// iterator tuple.
@@ -429,6 +203,30 @@ namespace iterators {
{
typedef int type;
};
+
+ template <typename reference>
+ struct converter
+ {
+ template <typename Seq>
+ static reference call(Seq seq)
+ {
+ typedef typename fusion::traits::tag_of<reference>::type tag;
+ return fusion::convert<tag>(seq);
+ }
+ };
+
+ template <typename Reference1, typename Reference2>
+ struct converter<std::pair<Reference1, Reference2> >
+ {
+ typedef std::pair<Reference1, Reference2> reference;
+ template <typename Seq>
+ static reference call(Seq seq)
+ {
+ return reference(
+ fusion::at_c<0>(seq)
+ , fusion::at_c<1>(seq));
+ }
+ };
}
/////////////////////////////////////////////////////////////////////
@@ -484,10 +282,11 @@ namespace iterators {
// iterators in the iterator tuple.
typename super_t::reference dereference() const
{
- return detail::tuple_impl_specific::tuple_transform(
- get_iterator_tuple(),
- detail::dereference_iterator()
- );
+ typedef typename super_t::reference reference;
+ typedef detail::converter<reference> gen;
+ return gen::call(fusion::transform(
+ get_iterator_tuple(),
+ detail::dereference_iterator()));
}
// Two zip iterators are equal if all iterators in the iterator
@@ -503,39 +302,35 @@ namespace iterators {
template<typename OtherIteratorTuple>
bool equal(const zip_iterator<OtherIteratorTuple>& other) const
{
- return detail::tuple_impl_specific::tuple_equal(
- get_iterator_tuple(),
- other.get_iterator_tuple()
- );
+ return fusion::equal_to(
+ get_iterator_tuple(),
+ other.get_iterator_tuple());
}
// Advancing a zip iterator means to advance all iterators in the
// iterator tuple.
void advance(typename super_t::difference_type n)
{
- detail::tuple_impl_specific::tuple_for_each(
+ fusion::for_each(
m_iterator_tuple,
- detail::advance_iterator<BOOST_DEDUCED_TYPENAME super_t::difference_type>(n)
- );
+ detail::advance_iterator<BOOST_DEDUCED_TYPENAME super_t::difference_type>(n));
}
// Incrementing a zip iterator means to increment all iterators in
// the iterator tuple.
void increment()
{
- detail::tuple_impl_specific::tuple_for_each(
- m_iterator_tuple,
- detail::increment_iterator()
- );
+ fusion::for_each(
+ m_iterator_tuple,
+ detail::increment_iterator());
}
// Decrementing a zip iterator means to decrement all iterators in
// the iterator tuple.
void decrement()
{
- detail::tuple_impl_specific::tuple_for_each(
- m_iterator_tuple,
- detail::decrement_iterator()
- );
+ fusion::for_each(
+ m_iterator_tuple,
+ detail::decrement_iterator());
}
// Distance is calculated using the first iterator in the tuple.
@@ -544,8 +339,8 @@ namespace iterators {
const zip_iterator<OtherIteratorTuple>& other
) const
{
- return boost::tuples::get<0>(other.get_iterator_tuple()) -
- boost::tuples::get<0>(this->get_iterator_tuple());
+ return fusion::at_c<0>(other.get_iterator_tuple()) -
+ fusion::at_c<0>(this->get_iterator_tuple());
}
// Data Members
diff --git a/boost/lambda/detail/lambda_functors.hpp b/boost/lambda/detail/lambda_functors.hpp
index 9ce29add96..febb6fc828 100644
--- a/boost/lambda/detail/lambda_functors.hpp
+++ b/boost/lambda/detail/lambda_functors.hpp
@@ -300,7 +300,7 @@ public:
namespace boost {
-#if !defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_NO_DECLTYPE)
+#if !defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_NO_CXX11_DECLTYPE)
template<class T>
struct result_of<boost::lambda::lambda_functor<T>()>
diff --git a/boost/lexical_cast.hpp b/boost/lexical_cast.hpp
index a880c0cd9c..dc3d7e3fb7 100644
--- a/boost/lexical_cast.hpp
+++ b/boost/lexical_cast.hpp
@@ -30,20 +30,19 @@
#include <boost/range/iterator_range_core.hpp>
#include <boost/lexical_cast/bad_lexical_cast.hpp>
#include <boost/lexical_cast/try_lexical_convert.hpp>
-#include <boost/utility/value_init.hpp>
namespace boost
{
template <typename Target, typename Source>
inline Target lexical_cast(const Source &arg)
{
- boost::value_initialized<Target> result;
+ Target result;
- if (!boost::conversion::detail::try_lexical_convert(arg, get(result))) {
+ if (!boost::conversion::detail::try_lexical_convert(arg, result)) {
boost::conversion::detail::throw_bad_cast<Source, Target>();
}
- return get(result);
+ return result;
}
template <typename Target>
diff --git a/boost/lexical_cast/detail/converter_lexical.hpp b/boost/lexical_cast/detail/converter_lexical.hpp
index 6a7878bdbe..fd866d84e5 100644
--- a/boost/lexical_cast/detail/converter_lexical.hpp
+++ b/boost/lexical_cast/detail/converter_lexical.hpp
@@ -364,7 +364,6 @@ namespace boost {
#endif
};
-#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
// Helper for floating point types.
// -1.23456789e-123456
// ^ sign
@@ -380,6 +379,8 @@ namespace boost {
Source, BOOST_DEDUCED_TYPENAME boost::enable_if<boost::is_float<Source> >::type
>
{
+
+#ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
BOOST_STATIC_ASSERT(
std::numeric_limits<Source>::max_exponent10 <= 999999L &&
std::numeric_limits<Source>::min_exponent10 >= -999999L
@@ -388,8 +389,10 @@ namespace boost {
BOOST_STATIC_CONSTANT(std::size_t, value =
5 + lcast_precision<Source>::value + 6
);
- };
+#else // #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+ BOOST_STATIC_CONSTANT(std::size_t, value = 156);
#endif // #ifndef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
+ };
}
namespace detail // lexical_cast_stream_traits<Source, Target>
diff --git a/boost/lexical_cast/try_lexical_convert.hpp b/boost/lexical_cast/try_lexical_convert.hpp
index 66270eee76..1881cdf371 100644
--- a/boost/lexical_cast/try_lexical_convert.hpp
+++ b/boost/lexical_cast/try_lexical_convert.hpp
@@ -23,6 +23,13 @@
# pragma once
#endif
+#if defined(__clang__) || (defined(__GNUC__) && \
+ !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wuninitialized"
+#endif
+
#include <string>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/identity.hpp>
@@ -195,5 +202,11 @@ namespace boost {
} // namespace boost
+#if defined(__clang__) || (defined(__GNUC__) && \
+ !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) && \
+ (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))
+#pragma GCC diagnostic pop
+#endif
+
#endif // BOOST_LEXICAL_CAST_TRY_LEXICAL_CONVERT_HPP
diff --git a/boost/locale/boundary/boundary_point.hpp b/boost/locale/boundary/boundary_point.hpp
index 31718f26bc..3c72dba662 100644
--- a/boost/locale/boundary/boundary_point.hpp
+++ b/boost/locale/boundary/boundary_point.hpp
@@ -156,19 +156,19 @@ namespace boundary {
typedef boundary_point<std::string::const_iterator> sboundary_point; ///< convenience typedef
typedef boundary_point<std::wstring::const_iterator> wsboundary_point; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef boundary_point<std::u16string::const_iterator> u16sboundary_point;///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef boundary_point<std::u32string::const_iterator> u32sboundary_point;///< convenience typedef
#endif
typedef boundary_point<char const *> cboundary_point; ///< convenience typedef
typedef boundary_point<wchar_t const *> wcboundary_point; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef boundary_point<char16_t const *> u16cboundary_point; ///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef boundary_point<char32_t const *> u32cboundary_point; ///< convenience typedef
#endif
diff --git a/boost/locale/boundary/facets.hpp b/boost/locale/boundary/facets.hpp
index 086d64158c..26c01e7d0d 100644
--- a/boost/locale/boundary/facets.hpp
+++ b/boost/locale/boundary/facets.hpp
@@ -152,7 +152,7 @@ namespace boost {
#endif
};
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
template<>
class BOOST_LOCALE_DECL boundary_indexing<char16_t> : public std::locale::facet {
public:
@@ -167,7 +167,7 @@ namespace boost {
};
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
template<>
class BOOST_LOCALE_DECL boundary_indexing<char32_t> : public std::locale::facet {
public:
diff --git a/boost/locale/boundary/index.hpp b/boost/locale/boundary/index.hpp
index 5948dccafe..8870c9bcfc 100644
--- a/boost/locale/boundary/index.hpp
+++ b/boost/locale/boundary/index.hpp
@@ -1036,37 +1036,37 @@ namespace boost {
typedef segment_index<std::string::const_iterator> ssegment_index; ///< convenience typedef
typedef segment_index<std::wstring::const_iterator> wssegment_index; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef segment_index<std::u16string::const_iterator> u16ssegment_index;///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef segment_index<std::u32string::const_iterator> u32ssegment_index;///< convenience typedef
#endif
typedef segment_index<char const *> csegment_index; ///< convenience typedef
typedef segment_index<wchar_t const *> wcsegment_index; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef segment_index<char16_t const *> u16csegment_index; ///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef segment_index<char32_t const *> u32csegment_index; ///< convenience typedef
#endif
typedef boundary_point_index<std::string::const_iterator> sboundary_point_index;///< convenience typedef
typedef boundary_point_index<std::wstring::const_iterator> wsboundary_point_index;///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef boundary_point_index<std::u16string::const_iterator> u16sboundary_point_index;///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef boundary_point_index<std::u32string::const_iterator> u32sboundary_point_index;///< convenience typedef
#endif
typedef boundary_point_index<char const *> cboundary_point_index; ///< convenience typedef
typedef boundary_point_index<wchar_t const *> wcboundary_point_index; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef boundary_point_index<char16_t const *> u16cboundary_point_index;///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef boundary_point_index<char32_t const *> u32cboundary_point_index;///< convenience typedef
#endif
diff --git a/boost/locale/boundary/segment.hpp b/boost/locale/boundary/segment.hpp
index d735d5b79b..516d883d54 100644
--- a/boost/locale/boundary/segment.hpp
+++ b/boost/locale/boundary/segment.hpp
@@ -27,7 +27,6 @@ namespace boundary {
int compare_text(LeftIterator l_begin,LeftIterator l_end,RightIterator r_begin,RightIterator r_end)
{
typedef LeftIterator left_iterator;
- typedef RightIterator right_iterator;
typedef typename std::iterator_traits<left_iterator>::value_type char_type;
typedef std::char_traits<char_type> traits;
while(l_begin!=l_end && r_begin!=r_end) {
@@ -436,19 +435,19 @@ namespace boundary {
typedef segment<std::string::const_iterator> ssegment; ///< convenience typedef
typedef segment<std::wstring::const_iterator> wssegment; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef segment<std::u16string::const_iterator> u16ssegment;///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef segment<std::u32string::const_iterator> u32ssegment;///< convenience typedef
#endif
typedef segment<char const *> csegment; ///< convenience typedef
typedef segment<wchar_t const *> wcsegment; ///< convenience typedef
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
typedef segment<char16_t const *> u16csegment; ///< convenience typedef
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
typedef segment<char32_t const *> u32csegment; ///< convenience typedef
#endif
diff --git a/boost/locale/conversion.hpp b/boost/locale/conversion.hpp
index 2b274ec53d..36f3a4fd64 100644
--- a/boost/locale/conversion.hpp
+++ b/boost/locale/conversion.hpp
@@ -102,7 +102,7 @@ namespace boost {
#endif
};
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
template<>
class BOOST_LOCALE_DECL converter<char16_t> : public converter_base, public std::locale::facet {
public:
@@ -117,7 +117,7 @@ namespace boost {
};
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
template<>
class BOOST_LOCALE_DECL converter<char32_t> : public converter_base, public std::locale::facet {
public:
diff --git a/boost/locale/encoding.hpp b/boost/locale/encoding.hpp
index 24742bf053..5fd9cb745c 100644
--- a/boost/locale/encoding.hpp
+++ b/boost/locale/encoding.hpp
@@ -212,7 +212,7 @@ namespace boost {
template<>
BOOST_LOCALE_DECL std::string from_utf(wchar_t const *begin,wchar_t const *end,std::string const &charset,method_type how);
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
template<>
BOOST_LOCALE_DECL std::basic_string<char16_t> to_utf(char const *begin,char const *end,std::string const &charset,method_type how);
@@ -220,7 +220,7 @@ namespace boost {
BOOST_LOCALE_DECL std::string from_utf(char16_t const *begin,char16_t const *end,std::string const &charset,method_type how);
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
template<>
BOOST_LOCALE_DECL std::basic_string<char32_t> to_utf(char const *begin,char const *end,std::string const &charset,method_type how);
diff --git a/boost/locale/format.hpp b/boost/locale/format.hpp
index 043044f6b1..4bf17057d9 100644
--- a/boost/locale/format.hpp
+++ b/boost/locale/format.hpp
@@ -473,14 +473,14 @@ namespace boost {
///
typedef basic_format<wchar_t> wformat;
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
///
/// Definition of char16_t based format
///
typedef basic_format<char16_t> u16format;
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
///
/// Definition of char32_t based format
///
diff --git a/boost/locale/generic_codecvt.hpp b/boost/locale/generic_codecvt.hpp
new file mode 100644
index 0000000000..245f96f8ad
--- /dev/null
+++ b/boost/locale/generic_codecvt.hpp
@@ -0,0 +1,676 @@
+//
+// Copyright (c) 2015 Artyom Beilis (Tonkikh)
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#ifndef BOOST_LOCALE_GENERIC_CODECVT_HPP
+#define BOOST_LOCALE_GENERIC_CODECVT_HPP
+
+#include <boost/locale/utf.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/static_assert.hpp>
+#include <locale>
+
+namespace boost {
+namespace locale {
+
+#ifndef BOOST_LOCALE_DOXYGEN
+//
+// Make sure that mbstate can keep 16 bit of UTF-16 sequence
+//
+BOOST_STATIC_ASSERT(sizeof(std::mbstate_t)>=2);
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1700
+// up to MSVC 11 (2012) do_length is non-standard it counts wide characters instead of narrow and does not change mbstate
+#define BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+#endif
+
+///
+/// \brief A base class that used to define constants for generic_codecvt
+///
+class generic_codecvt_base {
+public:
+ ///
+ /// Initail state for converting to or from unicode code points, used by initial_state in derived classes
+ ///
+ enum initial_convertion_state {
+ to_unicode_state, ///< The state would be used by to_unicode functions
+ from_unicode_state ///< The state would be used by from_unicode functions
+ };
+};
+
+///
+/// \brief Geneneric generic codecvt facet, various stateless encodings to UTF-16 and UTF-32 using wchar_t, char32_t and char16_t
+///
+/// Implementations should dervide from this class defining itself as CodecvtImpl and provide following members
+///
+/// - `state_type` - a type of special object that allows to store intermediate cached data, for example `iconv_t` descriptor
+/// - `state_type initial_state(generic_codecvt_base::initial_convertion_state direction) const` - member function that creates initial state
+/// - `int max_encoding_length() const` - a maximal length that one Unicode code point is represented, for UTF-8 for example it is 4 from ISO-8859-1 it is 1
+/// - `utf::code_point to_unicode(state_type &state,char const *&begin,char const *end)` - extract first code point from the text in range [begin,end), in case of success begin would point to the next character sequence to be encoded to next code point, in case of incomplete sequence - utf::incomplete shell be returned, and in case of invalid input sequence utf::illegal shell be returned and begin would remain unmodified
+/// - `utf::code_point from_unicode(state_type &state,utf::code_point u,char *begin,char const *end)` - convert a unicode code point `u` into a character seqnece at [begin,end). Return the length of the sequence in case of success, utf::incomplete in case of not enough room to encode the code point of utf::illegal in case conversion can not be performed
+///
+///
+/// For example implementaion of codecvt for latin1/ISO-8859-1 character set
+///
+/// \code
+///
+/// template<typename CharType>
+/// class latin1_codecvt :boost::locale::generic_codecvt<CharType,latin1_codecvt<CharType> >
+/// {
+/// public:
+///
+/// /* Standard codecvt constructor */
+/// latin1_codecvt(size_t refs = 0) : boost::locale::generic_codecvt<CharType,latin1_codecvt<CharType> >(refs)
+/// {
+/// }
+///
+/// /* State is unused but required by generic_codecvt */
+/// struct state_type {};
+///
+/// state_type initial_state(generic_codecvt_base::initial_convertion_state /*unused*/) const
+/// {
+/// return state_type();
+/// }
+///
+/// int max_encoding_length() const
+/// {
+/// return 1;
+/// }
+///
+/// boost::locale::utf::code_point to_unicode(state_type &,char const *&begin,char const *end) const
+/// {
+/// if(begin == end)
+/// return boost::locale::utf::incomplete;
+/// return *begin++;
+/// }
+///
+/// boost::locale::utf::code_point from_unicode(state_type &,boost::locale::utf::code_point u,char *begin,char const *end) const
+/// {
+/// if(u >= 256)
+/// return boost::locale::utf::illegal;
+/// if(begin == end)
+/// return boost::locale::utf::incomplete;
+/// *begin = u;
+/// return 1;
+/// }
+/// };
+///
+/// \endcode
+///
+/// When external tools used for encoding conversion, the `state_type` is useful to save objects used for conversions. For example,
+/// icu::UConverter can be saved in such a state for an efficient use:
+///
+/// \code
+/// template<typename CharType>
+/// class icu_codecvt :boost::locale::generic_codecvt<CharType,icu_codecvt<CharType> >
+/// {
+/// public:
+///
+/// /* Standard codecvt constructor */
+/// icu_codecvt(std::string const &name,refs = 0) :
+/// boost::locale::generic_codecvt<CharType,latin1_codecvt<CharType> >(refs)
+/// { ... }
+///
+/// /* State is unused but required by generic_codecvt */
+/// struct std::unique_ptr<UConverter,void (*)(UConverter*)> state_type;
+///
+/// state_type &&initial_state(generic_codecvt_base::initial_convertion_state /*unused*/) const
+/// {
+/// UErrorCode err = U_ZERO_ERROR;
+/// state_type ptr(ucnv_safeClone(converter_,0,0,&err,ucnv_close);
+/// return std::move(ptr);
+/// }
+///
+/// boost::locale::utf::code_point to_unicode(state_type &ptr,char const *&begin,char const *end) const
+/// {
+/// UErrorCode err = U_ZERO_ERROR;
+/// boost::locale::utf::code_point cp = ucnv_getNextUChar(ptr.get(),&begin,end,&err);
+/// ...
+/// }
+/// ...
+/// };
+/// \endcode
+///
+///
+template<typename CharType,typename CodecvtImpl,int CharSize=sizeof(CharType)>
+class generic_codecvt;
+
+///
+/// \brief UTF-16 to/from UTF-8 codecvt facet to use with char16_t or wchar_t on Windows
+///
+/// Note in order to fit the requirements of usability by std::wfstream it uses mbstate_t
+/// to handle intermediate states in handling of variable length UTF-16 sequences
+///
+/// Its member functions implement standard virtual functions of basic codecvt
+///
+template<typename CharType,typename CodecvtImpl>
+class generic_codecvt<CharType,CodecvtImpl,2> : public std::codecvt<CharType,char,std::mbstate_t>, public generic_codecvt_base
+{
+public:
+
+ typedef CharType uchar;
+
+ generic_codecvt(size_t refs = 0) :
+ std::codecvt<CharType,char,std::mbstate_t>(refs)
+ {
+ }
+ CodecvtImpl const &implementation() const
+ {
+ return *static_cast<CodecvtImpl const *>(this);
+ }
+
+protected:
+
+
+ virtual std::codecvt_base::result do_unshift(std::mbstate_t &s,char *from,char * /*to*/,char *&next) const
+ {
+ boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&s);
+#ifdef DEBUG_CODECVT
+ std::cout << "Entering unshift " << std::hex << state << std::dec << std::endl;
+#endif
+ if(state != 0)
+ return std::codecvt_base::error;
+ next=from;
+ return std::codecvt_base::ok;
+ }
+ virtual int do_encoding() const throw()
+ {
+ return 0;
+ }
+ virtual int do_max_length() const throw()
+ {
+ return implementation().max_encoding_length();
+ }
+ virtual bool do_always_noconv() const throw()
+ {
+ return false;
+ }
+
+ virtual int
+ do_length( std::mbstate_t
+ #ifdef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+ const
+ #endif
+ &std_state,
+ char const *from,
+ char const *from_end,
+ size_t max) const
+ {
+ #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+ char const *save_from = from;
+ boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&std_state);
+ #else
+ size_t save_max = max;
+ boost::uint16_t state = *reinterpret_cast<boost::uint16_t const *>(&std_state);
+ #endif
+
+ typedef typename CodecvtImpl::state_type state_type;
+ state_type cvt_state = implementation().initial_state(generic_codecvt_base::to_unicode_state);
+ while(max > 0 && from < from_end){
+ char const *prev_from = from;
+ boost::uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
+ if(ch==boost::locale::utf::incomplete || ch==boost::locale::utf::illegal) {
+ from = prev_from;
+ break;
+ }
+ max --;
+ if(ch > 0xFFFF) {
+ if(state == 0) {
+ from = prev_from;
+ state = 1;
+ }
+ else {
+ state = 0;
+ }
+ }
+ }
+ #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+ return from - save_from;
+ #else
+ return save_max - max;
+ #endif
+ }
+
+
+ virtual std::codecvt_base::result
+ do_in( std::mbstate_t &std_state,
+ char const *from,
+ char const *from_end,
+ char const *&from_next,
+ uchar *to,
+ uchar *to_end,
+ uchar *&to_next) const
+ {
+ std::codecvt_base::result r=std::codecvt_base::ok;
+
+ // mbstate_t is POD type and should be initialized to 0 (i.a. state = stateT())
+ // according to standard. We use it to keep a flag 0/1 for surrogate pair writing
+ //
+ // if 0 no code above >0xFFFF observed, of 1 a code above 0xFFFF observerd
+ // and first pair is written, but no input consumed
+ boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&std_state);
+ typedef typename CodecvtImpl::state_type state_type;
+ state_type cvt_state = implementation().initial_state(generic_codecvt_base::to_unicode_state);
+ while(to < to_end && from < from_end)
+ {
+#ifdef DEBUG_CODECVT
+ std::cout << "Entering IN--------------" << std::endl;
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ char const *from_saved = from;
+
+ uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
+
+ if(ch==boost::locale::utf::illegal) {
+ from = from_saved;
+ r=std::codecvt_base::error;
+ break;
+ }
+ if(ch==boost::locale::utf::incomplete) {
+ from = from_saved;
+ r=std::codecvt_base::partial;
+ break;
+ }
+ // Normal codepoints go direcly to stream
+ if(ch <= 0xFFFF) {
+ *to++=ch;
+ }
+ else {
+ // for other codepoints we do following
+ //
+ // 1. We can't consume our input as we may find ourselfs
+ // in state where all input consumed but not all output written,i.e. only
+ // 1st pair is written
+ // 2. We only write first pair and mark this in the state, we also revert back
+ // the from pointer in order to make sure this codepoint would be read
+ // once again and then we would consume our input together with writing
+ // second surrogate pair
+ ch-=0x10000;
+ boost::uint16_t vh = ch >> 10;
+ boost::uint16_t vl = ch & 0x3FF;
+ boost::uint16_t w1 = vh + 0xD800;
+ boost::uint16_t w2 = vl + 0xDC00;
+ if(state == 0) {
+ from = from_saved;
+ *to++ = w1;
+ state = 1;
+ }
+ else {
+ *to++ = w2;
+ state = 0;
+ }
+ }
+ }
+ from_next=from;
+ to_next=to;
+ if(r == std::codecvt_base::ok && (from!=from_end || state!=0))
+ r = std::codecvt_base::partial;
+#ifdef DEBUG_CODECVT
+ std::cout << "Returning ";
+ switch(r) {
+ case std::codecvt_base::ok:
+ std::cout << "ok" << std::endl;
+ break;
+ case std::codecvt_base::partial:
+ std::cout << "partial" << std::endl;
+ break;
+ case std::codecvt_base::error:
+ std::cout << "error" << std::endl;
+ break;
+ default:
+ std::cout << "other" << std::endl;
+ break;
+ }
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ return r;
+ }
+
+ virtual std::codecvt_base::result
+ do_out( std::mbstate_t &std_state,
+ uchar const *from,
+ uchar const *from_end,
+ uchar const *&from_next,
+ char *to,
+ char *to_end,
+ char *&to_next) const
+ {
+ std::codecvt_base::result r=std::codecvt_base::ok;
+ // mbstate_t is POD type and should be initialized to 0 (i.a. state = stateT())
+ // according to standard. We assume that sizeof(mbstate_t) >=2 in order
+ // to be able to store first observerd surrogate pair
+ //
+ // State: state!=0 - a first surrogate pair was observerd (state = first pair),
+ // we expect the second one to come and then zero the state
+ ///
+ boost::uint16_t &state = *reinterpret_cast<boost::uint16_t *>(&std_state);
+ typedef typename CodecvtImpl::state_type state_type;
+ state_type cvt_state = implementation().initial_state(generic_codecvt_base::from_unicode_state);
+ while(to < to_end && from < from_end)
+ {
+#ifdef DEBUG_CODECVT
+ std::cout << "Entering OUT --------------" << std::endl;
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ boost::uint32_t ch=0;
+ if(state != 0) {
+ // if the state idecates that 1st surrogate pair was written
+ // we should make sure that the second one that comes is actually
+ // second surrogate
+ boost::uint16_t w1 = state;
+ boost::uint16_t w2 = *from;
+ // we don't forward from as writing may fail to incomplete or
+ // partial conversion
+ if(0xDC00 <= w2 && w2<=0xDFFF) {
+ boost::uint16_t vh = w1 - 0xD800;
+ boost::uint16_t vl = w2 - 0xDC00;
+ ch=((uint32_t(vh) << 10) | vl) + 0x10000;
+ }
+ else {
+ // Invalid surrogate
+ r=std::codecvt_base::error;
+ break;
+ }
+ }
+ else {
+ ch = *from;
+ if(0xD800 <= ch && ch<=0xDBFF) {
+ // if this is a first surrogate pair we put
+ // it into the state and consume it, note we don't
+ // go forward as it should be illegal so we increase
+ // the from pointer manually
+ state = ch;
+ from++;
+ continue;
+ }
+ else if(0xDC00 <= ch && ch<=0xDFFF) {
+ // if we observe second surrogate pair and
+ // first only may be expected we should break from the loop with error
+ // as it is illegal input
+ r=std::codecvt_base::error;
+ break;
+ }
+ }
+ if(!boost::locale::utf::is_valid_codepoint(ch)) {
+ r=std::codecvt_base::error;
+ break;
+ }
+ boost::uint32_t len = implementation().from_unicode(cvt_state,ch,to,to_end);
+ if(len == boost::locale::utf::incomplete) {
+ r=std::codecvt_base::partial;
+ break;
+ }
+ else if(len == boost::locale::utf::illegal) {
+ r=std::codecvt_base::error;
+ break;
+ }
+ else
+ to+= len;
+ state = 0;
+ from++;
+ }
+ from_next=from;
+ to_next=to;
+ if(r==std::codecvt_base::ok && from!=from_end)
+ r = std::codecvt_base::partial;
+#ifdef DEBUG_CODECVT
+ std::cout << "Returning ";
+ switch(r) {
+ case std::codecvt_base::ok:
+ std::cout << "ok" << std::endl;
+ break;
+ case std::codecvt_base::partial:
+ std::cout << "partial" << std::endl;
+ break;
+ case std::codecvt_base::error:
+ std::cout << "error" << std::endl;
+ break;
+ default:
+ std::cout << "other" << std::endl;
+ break;
+ }
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ return r;
+ }
+
+};
+
+///
+/// \brief UTF-32 to/from UTF-8 codecvt facet to use with char32_t or wchar_t on POSIX platforms
+///
+/// Its member functions implement standard virtual functions of basic codecvt.
+/// mbstate_t is not used for UTF-32 handling due to fixed length encoding
+///
+template<typename CharType,typename CodecvtImpl>
+class generic_codecvt<CharType,CodecvtImpl,4> : public std::codecvt<CharType,char,std::mbstate_t>, public generic_codecvt_base
+{
+public:
+ typedef CharType uchar;
+
+ generic_codecvt(size_t refs = 0) :
+ std::codecvt<CharType,char,std::mbstate_t>(refs)
+ {
+ }
+
+ CodecvtImpl const &implementation() const
+ {
+ return *static_cast<CodecvtImpl const *>(this);
+ }
+
+protected:
+
+ virtual std::codecvt_base::result do_unshift(std::mbstate_t &/*s*/,char *from,char * /*to*/,char *&next) const
+ {
+ next=from;
+ return std::codecvt_base::ok;
+ }
+ virtual int do_encoding() const throw()
+ {
+ return 0;
+ }
+ virtual int do_max_length() const throw()
+ {
+ return implementation().max_encoding_length();
+ }
+ virtual bool do_always_noconv() const throw()
+ {
+ return false;
+ }
+
+ virtual int
+ do_length( std::mbstate_t
+ #ifdef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+ const
+ #endif
+ &/*state*/,
+ char const *from,
+ char const *from_end,
+ size_t max) const
+ {
+ #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+ char const *start_from = from;
+ #else
+ size_t save_max = max;
+ #endif
+ typedef typename CodecvtImpl::state_type state_type;
+ state_type cvt_state = implementation().initial_state(generic_codecvt_base::to_unicode_state);
+ while(max > 0 && from < from_end){
+ char const *save_from = from;
+ boost::uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
+ if(ch==boost::locale::utf::incomplete || ch==boost::locale::utf::illegal) {
+ from = save_from;
+ break;
+ }
+ max--;
+ }
+ #ifndef BOOST_LOCALE_DO_LENGTH_MBSTATE_CONST
+ return from - start_from;
+ #else
+ return save_max - max;
+ #endif
+ }
+
+
+ virtual std::codecvt_base::result
+ do_in( std::mbstate_t &/*state*/,
+ char const *from,
+ char const *from_end,
+ char const *&from_next,
+ uchar *to,
+ uchar *to_end,
+ uchar *&to_next) const
+ {
+ std::codecvt_base::result r=std::codecvt_base::ok;
+
+ // mbstate_t is POD type and should be initialized to 0 (i.a. state = stateT())
+ // according to standard. We use it to keep a flag 0/1 for surrogate pair writing
+ //
+ // if 0 no code above >0xFFFF observed, of 1 a code above 0xFFFF observerd
+ // and first pair is written, but no input consumed
+ typedef typename CodecvtImpl::state_type state_type;
+ state_type cvt_state = implementation().initial_state(generic_codecvt_base::to_unicode_state);
+ while(to < to_end && from < from_end)
+ {
+#ifdef DEBUG_CODECVT
+ std::cout << "Entering IN--------------" << std::endl;
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ char const *from_saved = from;
+
+ uint32_t ch=implementation().to_unicode(cvt_state,from,from_end);
+
+ if(ch==boost::locale::utf::illegal) {
+ r=std::codecvt_base::error;
+ from = from_saved;
+ break;
+ }
+ if(ch==boost::locale::utf::incomplete) {
+ r=std::codecvt_base::partial;
+ from=from_saved;
+ break;
+ }
+ *to++=ch;
+ }
+ from_next=from;
+ to_next=to;
+ if(r == std::codecvt_base::ok && from!=from_end)
+ r = std::codecvt_base::partial;
+#ifdef DEBUG_CODECVT
+ std::cout << "Returning ";
+ switch(r) {
+ case std::codecvt_base::ok:
+ std::cout << "ok" << std::endl;
+ break;
+ case std::codecvt_base::partial:
+ std::cout << "partial" << std::endl;
+ break;
+ case std::codecvt_base::error:
+ std::cout << "error" << std::endl;
+ break;
+ default:
+ std::cout << "other" << std::endl;
+ break;
+ }
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ return r;
+ }
+
+ virtual std::codecvt_base::result
+ do_out( std::mbstate_t &/*std_state*/,
+ uchar const *from,
+ uchar const *from_end,
+ uchar const *&from_next,
+ char *to,
+ char *to_end,
+ char *&to_next) const
+ {
+ std::codecvt_base::result r=std::codecvt_base::ok;
+ typedef typename CodecvtImpl::state_type state_type;
+ state_type cvt_state = implementation().initial_state(generic_codecvt_base::from_unicode_state);
+ while(to < to_end && from < from_end)
+ {
+#ifdef DEBUG_CODECVT
+ std::cout << "Entering OUT --------------" << std::endl;
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ boost::uint32_t ch=0;
+ ch = *from;
+ if(!boost::locale::utf::is_valid_codepoint(ch)) {
+ r=std::codecvt_base::error;
+ break;
+ }
+ boost::uint32_t len = implementation().from_unicode(cvt_state,ch,to,to_end);
+ if(len == boost::locale::utf::incomplete) {
+ r=std::codecvt_base::partial;
+ break;
+ }
+ else if(len == boost::locale::utf::illegal) {
+ r=std::codecvt_base::error;
+ break;
+ }
+ to+=len;
+ from++;
+ }
+ from_next=from;
+ to_next=to;
+ if(r==std::codecvt_base::ok && from!=from_end)
+ r = std::codecvt_base::partial;
+#ifdef DEBUG_CODECVT
+ std::cout << "Returning ";
+ switch(r) {
+ case std::codecvt_base::ok:
+ std::cout << "ok" << std::endl;
+ break;
+ case std::codecvt_base::partial:
+ std::cout << "partial" << std::endl;
+ break;
+ case std::codecvt_base::error:
+ std::cout << "error" << std::endl;
+ break;
+ default:
+ std::cout << "other" << std::endl;
+ break;
+ }
+ std::cout << "State " << std::hex << state <<std::endl;
+ std::cout << "Left in " << std::dec << from_end - from << " out " << to_end -to << std::endl;
+#endif
+ return r;
+ }
+};
+
+
+template<typename CharType,typename CodecvtImpl>
+class generic_codecvt<CharType,CodecvtImpl,1> : public std::codecvt<CharType,char,std::mbstate_t>, public generic_codecvt_base
+{
+public:
+ typedef CharType uchar;
+
+ CodecvtImpl const &implementation() const
+ {
+ return *static_cast<CodecvtImpl const *>(this);
+ }
+
+ generic_codecvt(size_t refs = 0) : std::codecvt<char,char,std::mbstate_t>(refs)
+ {
+ }
+};
+
+} // locale
+} // namespace boost
+
+#endif
+///
+// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
diff --git a/boost/locale/gnu_gettext.hpp b/boost/locale/gnu_gettext.hpp
index cc8844f3ae..ce2e7f265e 100644
--- a/boost/locale/gnu_gettext.hpp
+++ b/boost/locale/gnu_gettext.hpp
@@ -142,12 +142,12 @@ namespace gnu_gettext {
template<>
BOOST_LOCALE_DECL message_format<wchar_t> *create_messages_facet(messages_info const &info);
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
template<>
BOOST_LOCALE_DECL message_format<char16_t> *create_messages_facet(messages_info const &info);
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
template<>
BOOST_LOCALE_DECL message_format<char32_t> *create_messages_facet(messages_info const &info);
#endif
diff --git a/boost/locale/message.hpp b/boost/locale/message.hpp
index 092a2c192c..ec8f99f280 100644
--- a/boost/locale/message.hpp
+++ b/boost/locale/message.hpp
@@ -496,13 +496,13 @@ namespace boost {
/// Convenience typedef for wchar_t
///
typedef basic_message<wchar_t> wmessage;
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
///
/// Convenience typedef for char16_t
///
typedef basic_message<char16_t> u16message;
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
///
/// Convenience typedef for char32_t
///
@@ -722,7 +722,7 @@ namespace boost {
static std::locale::id id;
};
- #ifdef BOOST_HAS_CHAR16_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR16_T
template<>
struct BOOST_LOCALE_DECL base_message_format<char16_t> : public std::locale::facet
@@ -735,7 +735,7 @@ namespace boost {
#endif
- #ifdef BOOST_HAS_CHAR32_T
+ #ifdef BOOST_LOCALE_ENABLE_CHAR32_T
template<>
struct BOOST_LOCALE_DECL base_message_format<char32_t> : public std::locale::facet
diff --git a/boost/locale/utf8_codecvt.hpp b/boost/locale/utf8_codecvt.hpp
new file mode 100644
index 0000000000..a037c3d593
--- /dev/null
+++ b/boost/locale/utf8_codecvt.hpp
@@ -0,0 +1,69 @@
+//
+// Copyright (c) 2015 Artyom Beilis (Tonkikh)
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#ifndef BOOST_LOCALE_UTF8_CODECVT_HPP
+#define BOOST_LOCALE_UTF8_CODECVT_HPP
+
+#include <boost/locale/utf.hpp>
+#include <boost/locale/generic_codecvt.hpp>
+#include <boost/cstdint.hpp>
+#include <locale>
+
+namespace boost {
+namespace locale {
+
+///
+/// \brief Geneneric utf8 codecvt facet, it allows to convert UTF-8 strings to UTF-16 and UTF-32 using wchar_t, char32_t and char16_t
+///
+template<typename CharType>
+class utf8_codecvt : public generic_codecvt<CharType,utf8_codecvt<CharType> >
+{
+public:
+
+ struct state_type {};
+
+ utf8_codecvt(size_t refs = 0) : generic_codecvt<CharType,utf8_codecvt<CharType> >(refs)
+ {
+ }
+
+ static int max_encoding_length()
+ {
+ return 4;
+ }
+
+ static state_type initial_state(generic_codecvt_base::initial_convertion_state /* unused */)
+ {
+ return state_type();
+ }
+ static utf::code_point to_unicode(state_type &,char const *&begin,char const *end)
+ {
+ char const *p=begin;
+
+ utf::code_point c = utf::utf_traits<char>::decode(p,end);
+ if(c!=utf::illegal && c!=utf::incomplete)
+ begin = p;
+ return c;
+ }
+
+ static utf::code_point from_unicode(state_type &,utf::code_point u,char *begin,char const *end)
+ {
+ if(!utf::is_valid_codepoint(u))
+ return utf::illegal;
+ int width;
+ if((width=utf::utf_traits<char>::width(u)) > end - begin)
+ return utf::incomplete;
+ utf::utf_traits<char>::encode(u,begin);
+ return width;
+ }
+};
+
+} // locale
+} // namespace boost
+
+#endif
+///
+// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
diff --git a/boost/locale/util.hpp b/boost/locale/util.hpp
index 4d8206b528..022a5aad50 100644
--- a/boost/locale/util.hpp
+++ b/boost/locale/util.hpp
@@ -201,6 +201,21 @@ namespace util {
BOOST_LOCALE_DECL
std::locale create_codecvt(std::locale const &in,std::auto_ptr<base_converter> cvt,character_facet_type type);
+ ///
+ /// Install utf8 codecvt to UTF-16 or UTF-32 into locale \a in and return
+ /// new locale that is based on \a in and uses new facet.
+ ///
+ BOOST_LOCALE_DECL
+ std::locale create_utf8_codecvt(std::locale const &in,character_facet_type type);
+
+ ///
+ /// This function installs codecvt that can be used for conversion between single byte
+ /// character encodings like ISO-8859-1, koi8-r, windows-1255 and Unicode code points,
+ ///
+ /// Throws boost::locale::conv::invalid_charset_error if the chacater set is not supported or isn't single byte character
+ /// set
+ BOOST_LOCALE_DECL
+ std::locale create_simple_codecvt(std::locale const &in,std::string const &encoding,character_facet_type type);
} // util
} // locale
} // boost
diff --git a/boost/lockfree/detail/atomic.hpp b/boost/lockfree/detail/atomic.hpp
index f36ad4b6d5..47dcd8c504 100644
--- a/boost/lockfree/detail/atomic.hpp
+++ b/boost/lockfree/detail/atomic.hpp
@@ -18,11 +18,30 @@
#undef BOOST_LOCKFREE_NO_HDR_ATOMIC
#endif
+
// GCC supports atomic<> from version 4.8 onwards.
#if (BOOST_GCC >= 40800) && (__cplusplus >= 201103L)
#undef BOOST_LOCKFREE_NO_HDR_ATOMIC
#endif
+
+// Apple clang is 2 mayor versions ahead, but in fact 1 minor version behind
+#ifdef BOOST_CLANG
+
+#define BOOST_ATOMIC_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
+
+#if defined(__apple_build_version__) && (BOOST_ATOMIC_CLANG_VERSION >= 60100) && (__cplusplus >= 201103L)
+#undef BOOST_LOCKFREE_NO_HDR_ATOMIC
+#endif
+
+#if !defined(__apple_build_version__) && (BOOST_ATOMIC_CLANG_VERSION >= 30600) && (__cplusplus >= 201103L)
+#undef BOOST_LOCKFREE_NO_HDR_ATOMIC
+#endif
+
+#undef BOOST_ATOMIC_CLANG_VERSION
+
+#endif // BOOST_CLANG
+
#endif // BOOST_LOCKFREE_FORCE_STD_ATOMIC
diff --git a/boost/lockfree/detail/branch_hints.hpp b/boost/lockfree/detail/branch_hints.hpp
deleted file mode 100644
index 3a193f8b24..0000000000
--- a/boost/lockfree/detail/branch_hints.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-// branch hints
-// Copyright (C) 2007, 2008 Tim Blechmann
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_LOCKFREE_BRANCH_HINTS_HPP_INCLUDED
-#define BOOST_LOCKFREE_BRANCH_HINTS_HPP_INCLUDED
-
-namespace boost {
-namespace lockfree {
-namespace detail {
-/** \brief hint for the branch prediction */
-inline bool likely(bool expr)
-{
-#ifdef __GNUC__
- return __builtin_expect(expr, true);
-#else
- return expr;
-#endif
- }
-
-/** \brief hint for the branch prediction */
-inline bool unlikely(bool expr)
-{
-#ifdef __GNUC__
- return __builtin_expect(expr, false);
-#else
- return expr;
-#endif
-}
-
-} /* namespace detail */
-} /* namespace lockfree */
-} /* namespace boost */
-
-#endif /* BOOST_LOCKFREE_BRANCH_HINTS_HPP_INCLUDED */
diff --git a/boost/lockfree/detail/freelist.hpp b/boost/lockfree/detail/freelist.hpp
index b053dce00c..6b84e6c974 100644
--- a/boost/lockfree/detail/freelist.hpp
+++ b/boost/lockfree/detail/freelist.hpp
@@ -296,7 +296,7 @@ public:
tag_t get_next_tag() const
{
- tag_t next = (get_tag() + 1) & (std::numeric_limits<tag_t>::max)();
+ tag_t next = (get_tag() + 1u) & (std::numeric_limits<tag_t>::max)();
return next;
}
diff --git a/boost/lockfree/detail/tagged_ptr_dcas.hpp b/boost/lockfree/detail/tagged_ptr_dcas.hpp
index 8bc68386e6..6cb5a0616b 100644
--- a/boost/lockfree/detail/tagged_ptr_dcas.hpp
+++ b/boost/lockfree/detail/tagged_ptr_dcas.hpp
@@ -12,7 +12,6 @@
#include <cstddef> /* for std::size_t */
#include <limits>
-#include <boost/lockfree/detail/branch_hints.hpp>
namespace boost {
namespace lockfree {
diff --git a/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp b/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp
index e99e6bff6c..15d383018c 100644
--- a/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp
+++ b/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp
@@ -14,7 +14,6 @@
#include <boost/cstdint.hpp>
-#include <boost/lockfree/detail/branch_hints.hpp>
namespace boost {
namespace lockfree {
@@ -52,7 +51,7 @@ private:
return cu.tag[tag_index];
}
- static compressed_ptr_t pack_ptr(T * ptr, int tag)
+ static compressed_ptr_t pack_ptr(T * ptr, tag_t tag)
{
cast_unit ret;
ret.value = compressed_ptr_t(ptr);
@@ -132,7 +131,7 @@ public:
tag_t get_next_tag() const
{
- tag_t next = (get_tag() + 1) & (std::numeric_limits<tag_t>::max)();
+ tag_t next = (get_tag() + 1u) & (std::numeric_limits<tag_t>::max)();
return next;
}
diff --git a/boost/lockfree/queue.hpp b/boost/lockfree/queue.hpp
index 74001fba9d..4c982c4dd4 100644
--- a/boost/lockfree/queue.hpp
+++ b/boost/lockfree/queue.hpp
@@ -15,6 +15,7 @@
#include <boost/static_assert.hpp>
#include <boost/type_traits/has_trivial_assign.hpp>
#include <boost/type_traits/has_trivial_destructor.hpp>
+#include <boost/config.hpp> // for BOOST_LIKELY
#include <boost/lockfree/detail/atomic.hpp>
#include <boost/lockfree/detail/copy_payload.hpp>
@@ -286,8 +287,6 @@ private:
template <bool Bounded>
bool do_push(T const & t)
{
- using detail::likely;
-
node * n = pool.template construct<true, Bounded>(t, pool.null_handle());
handle_type node_handle = pool.get_handle(n);
@@ -301,7 +300,7 @@ private:
node * next_ptr = pool.get_pointer(next);
tagged_node_handle tail2 = tail_.load(memory_order_acquire);
- if (likely(tail == tail2)) {
+ if (BOOST_LIKELY(tail == tail2)) {
if (next_ptr == 0) {
tagged_node_handle new_tail_next(node_handle, next.get_next_tag());
if ( tail_node->next.compare_exchange_weak(next, new_tail_next) ) {
@@ -375,7 +374,6 @@ public:
template <typename U>
bool pop (U & ret)
{
- using detail::likely;
for (;;) {
tagged_node_handle head = head_.load(memory_order_acquire);
node * head_ptr = pool.get_pointer(head);
@@ -385,7 +383,7 @@ public:
node * next_ptr = pool.get_pointer(next);
tagged_node_handle head2 = head_.load(memory_order_acquire);
- if (likely(head == head2)) {
+ if (BOOST_LIKELY(head == head2)) {
if (pool.get_handle(head) == pool.get_handle(tail)) {
if (next_ptr == 0)
return false;
diff --git a/boost/lockfree/spsc_queue.hpp b/boost/lockfree/spsc_queue.hpp
index 3fbbea7a86..b877cde4db 100644
--- a/boost/lockfree/spsc_queue.hpp
+++ b/boost/lockfree/spsc_queue.hpp
@@ -18,12 +18,12 @@
#include <boost/static_assert.hpp>
#include <boost/utility.hpp>
#include <boost/utility/enable_if.hpp>
+#include <boost/config.hpp> // for BOOST_LIKELY
#include <boost/type_traits/has_trivial_destructor.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/lockfree/detail/atomic.hpp>
-#include <boost/lockfree/detail/branch_hints.hpp>
#include <boost/lockfree/detail/copy_payload.hpp>
#include <boost/lockfree/detail/parameter.hpp>
#include <boost/lockfree/detail/prefix.hpp>
@@ -62,7 +62,7 @@ protected:
static size_t next_index(size_t arg, size_t max_size)
{
size_t ret = arg + 1;
- while (unlikely(ret >= max_size))
+ while (BOOST_UNLIKELY(ret >= max_size))
ret -= max_size;
return ret;
}
@@ -709,13 +709,13 @@ public:
}
template <typename U>
- explicit spsc_queue(typename allocator::template rebind<U>::other const & alloc)
+ explicit spsc_queue(typename allocator::template rebind<U>::other const &)
{
// just for API compatibility: we don't actually need an allocator
BOOST_STATIC_ASSERT(!runtime_sized);
}
- explicit spsc_queue(allocator const & alloc)
+ explicit spsc_queue(allocator const &)
{
// just for API compatibility: we don't actually need an allocator
BOOST_ASSERT(!runtime_sized);
diff --git a/boost/log/attributes/attribute_set.hpp b/boost/log/attributes/attribute_set.hpp
index c44d03fe52..05fa3aaa96 100644
--- a/boost/log/attributes/attribute_set.hpp
+++ b/boost/log/attributes/attribute_set.hpp
@@ -60,9 +60,16 @@ public:
}
//! Conversion operator (would be invoked in case of reading from the container)
- operator mapped_type() const BOOST_NOEXCEPT;
+ BOOST_FORCEINLINE operator mapped_type() const BOOST_NOEXCEPT
+ {
+ return read_mapped_value();
+ }
//! Assignment operator (would be invoked in case of writing to the container)
mapped_type& operator= (mapped_type const& val) const;
+
+private:
+ //! Reads the referenced mapped value from the container
+ mapped_type read_mapped_value() const BOOST_NOEXCEPT;
};
} // namespace aux
@@ -468,8 +475,8 @@ inline void swap(attribute_set& left, attribute_set& right) BOOST_NOEXCEPT
namespace aux {
-//! Conversion operator (would be invoked in case of reading from the container)
-inline attribute_set_reference_proxy::operator mapped_type() const BOOST_NOEXCEPT
+//! Reads the referenced mapped value from the container
+inline attribute_set_reference_proxy::mapped_type attribute_set_reference_proxy::read_mapped_value() const BOOST_NOEXCEPT
{
attribute_set::iterator it = m_pContainer->find(m_key);
if (it != m_pContainer->end())
diff --git a/boost/log/attributes/counter.hpp b/boost/log/attributes/counter.hpp
index 6cd5bd8ce0..b7d9994027 100644
--- a/boost/log/attributes/counter.hpp
+++ b/boost/log/attributes/counter.hpp
@@ -22,7 +22,8 @@
#include <boost/log/attributes/attribute_cast.hpp>
#include <boost/log/attributes/attribute_value_impl.hpp>
#ifndef BOOST_LOG_NO_THREADS
-#include <boost/detail/atomic_count.hpp>
+#include <boost/memory_order.hpp>
+#include <boost/atomic/atomic.hpp>
#endif // BOOST_LOG_NO_THREADS
#include <boost/log/detail/header.hpp>
@@ -39,37 +40,50 @@ namespace attributes {
/*!
* \brief A class of an attribute that counts an integral value
*
- * This type of attribute acts as a counter, that is, it returns a monotonously
+ * This attribute acts as a counter - it returns a monotonously
* changing value each time requested. The attribute value type can be specified
- * as a template parameter. However, the type must be an integral type of size no
- * more than <tt>sizeof(long)</tt>.
+ * as a template parameter. The type must be an integral type.
*/
template< typename T >
class counter :
public attribute
{
- // For now only integral types up to long are supported
- BOOST_STATIC_ASSERT_MSG(is_integral< T >::value && sizeof(T) <= sizeof(long), "Boost.Log: Only integral types up to long are supported by counter attribute");
+ BOOST_STATIC_ASSERT_MSG(is_integral< T >::value, "Boost.Log: Only integral types are supported by the counter attribute");
public:
//! A counter value type
typedef T value_type;
protected:
- //! Base class for factory implementation
- class BOOST_LOG_NO_VTABLE BOOST_SYMBOL_VISIBLE impl :
+ //! Factory implementation
+ class BOOST_SYMBOL_VISIBLE impl :
public attribute::impl
{
- };
+ private:
+#ifndef BOOST_LOG_NO_THREADS
+ boost::atomic< value_type > m_counter;
+#else
+ value_type m_counter;
+#endif
+ const value_type m_step;
+
+ public:
+ impl(value_type initial, value_type step) BOOST_NOEXCEPT :
+ m_counter(initial), m_step(step)
+ {
+ }
- //! Generic factory implementation
- class impl_generic;
+ attribute_value get_value()
+ {
#ifndef BOOST_LOG_NO_THREADS
- //! Increment-by-one factory implementation
- class impl_inc;
- //! Decrement-by-one factory implementation
- class impl_dec;
+ value_type value = m_counter.fetch_add(m_step, boost::memory_order_relaxed);
+#else
+ value_type value = m_counter;
+ m_counter += m_step;
#endif
+ return make_attribute_value(value);
+ }
+ };
public:
/*!
@@ -77,24 +91,13 @@ public:
*
* \param initial Initial value of the counter
* \param step Changing step of the counter. Each value acquired from the attribute
- * will be greater than the previous one to this amount.
+ * will be greater than the previous one by this amount.
*/
- explicit counter(value_type initial = (value_type)0, long step = 1) :
-#ifndef BOOST_LOG_NO_THREADS
- attribute()
- {
- if (step == 1)
- this->set_impl(new impl_inc(initial));
- else if (step == -1)
- this->set_impl(new impl_dec(initial));
- else
- this->set_impl(new impl_generic(initial, step));
- }
-#else
- attribute(new impl_generic(initial, step))
+ explicit counter(value_type initial = (value_type)0, value_type step = (value_type)1) :
+ attribute(new impl(initial, step))
{
}
-#endif
+
/*!
* Constructor for casting support
*/
@@ -104,109 +107,6 @@ public:
}
};
-#ifndef BOOST_LOG_NO_THREADS
-
-template< typename T >
-class counter< T >::impl_generic :
- public impl
-{
-private:
- //! Initial value
- const value_type m_Initial;
- //! Step value
- const long m_Step;
- //! The counter
- boost::detail::atomic_count m_Counter;
-
-public:
- /*!
- * Initializing constructor
- */
- impl_generic(value_type initial, long step) : m_Initial(initial), m_Step(step), m_Counter(-1)
- {
- }
-
- attribute_value get_value()
- {
- const unsigned long next_counter = static_cast< unsigned long >(++m_Counter);
- value_type next = static_cast< value_type >(m_Initial + (next_counter * m_Step));
- return make_attribute_value(next);
- }
-};
-
-template< typename T >
-class counter< T >::impl_inc :
- public impl
-{
-private:
- //! The counter
- boost::detail::atomic_count m_Counter;
-
-public:
- /*!
- * Initializing constructor
- */
- explicit impl_inc(value_type initial) : m_Counter(initial - 1)
- {
- }
-
- attribute_value get_value()
- {
- return make_attribute_value(static_cast< value_type >(++m_Counter));
- }
-};
-
-template< typename T >
-class counter< T >::impl_dec :
- public impl
-{
-private:
- //! The counter
- boost::detail::atomic_count m_Counter;
-
-public:
- /*!
- * Initializing constructor
- */
- explicit impl_dec(value_type initial) : m_Counter(initial + 1)
- {
- }
-
- attribute_value get_value()
- {
- return make_attribute_value(static_cast< value_type >(--m_Counter));
- }
-};
-
-#else // BOOST_LOG_NO_THREADS
-
-template< typename T >
-class counter< T >::impl_generic :
- public impl
-{
-private:
- //! Step value
- const long m_Step;
- //! The counter
- value_type m_Counter;
-
-public:
- /*!
- * Initializing constructor
- */
- impl_generic(value_type initial, long step) : m_Step(step), m_Counter(initial - step)
- {
- }
-
- attribute_value get_value()
- {
- m_Counter += m_Step;
- return make_attribute_value(m_Counter);
- }
-};
-
-#endif // BOOST_LOG_NO_THREADS
-
} // namespace attributes
BOOST_LOG_CLOSE_NAMESPACE // namespace log
diff --git a/boost/log/detail/spin_mutex.hpp b/boost/log/detail/adaptive_mutex.hpp
index 866c4af0a6..25e7559e17 100644
--- a/boost/log/detail/spin_mutex.hpp
+++ b/boost/log/detail/adaptive_mutex.hpp
@@ -5,7 +5,7 @@
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
- * \file spin_mutex.hpp
+ * \file adaptive_mutex.hpp
* \author Andrey Semashev
* \date 01.08.2010
*
@@ -13,8 +13,8 @@
* at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
*/
-#ifndef BOOST_LOG_DETAIL_SPIN_MUTEX_HPP_INCLUDED_
-#define BOOST_LOG_DETAIL_SPIN_MUTEX_HPP_INCLUDED_
+#ifndef BOOST_LOG_DETAIL_ADAPTIVE_MUTEX_HPP_INCLUDED_
+#define BOOST_LOG_DETAIL_ADAPTIVE_MUTEX_HPP_INCLUDED_
#include <boost/log/detail/config.hpp>
@@ -28,60 +28,35 @@
#include <boost/thread/exceptions.hpp>
#if defined(BOOST_THREAD_POSIX) // This one can be defined by users, so it should go first
-#define BOOST_LOG_SPIN_MUTEX_USE_PTHREAD
+#define BOOST_LOG_ADAPTIVE_MUTEX_USE_PTHREAD
#elif defined(BOOST_WINDOWS)
-#define BOOST_LOG_SPIN_MUTEX_USE_WINAPI
+#define BOOST_LOG_ADAPTIVE_MUTEX_USE_WINAPI
#elif defined(BOOST_HAS_PTHREADS)
-#define BOOST_LOG_SPIN_MUTEX_USE_PTHREAD
+#define BOOST_LOG_ADAPTIVE_MUTEX_USE_PTHREAD
#endif
-#if defined(BOOST_LOG_SPIN_MUTEX_USE_WINAPI)
+#if defined(BOOST_LOG_ADAPTIVE_MUTEX_USE_WINAPI)
#include <boost/detail/interlocked.hpp>
-
-#if defined(BOOST_USE_WINDOWS_H)
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
-#endif
-
-#include <windows.h>
-
-#else // defined(BOOST_USE_WINDOWS_H)
-
-namespace boost {
-
-BOOST_LOG_OPEN_NAMESPACE
-
-namespace aux {
-
-extern "C" {
-
-__declspec(dllimport) int __stdcall SwitchToThread();
-
-} // extern "C"
-
-} // namespace aux
-
-BOOST_LOG_CLOSE_NAMESPACE // namespace log
-
-} // namespace boost
-
-#endif // BOOST_USE_WINDOWS_H
+#include <boost/detail/winapi/thread.hpp>
#if defined(__INTEL_COMPILER) || defined(_MSC_VER)
# if defined(_M_IX86)
# define BOOST_LOG_PAUSE_OP __asm { pause }
# elif defined(_M_AMD64)
extern "C" void _mm_pause(void);
-#pragma intrinsic(_mm_pause)
+# if defined(BOOST_MSVC)
+# pragma intrinsic(_mm_pause)
+# endif
# define BOOST_LOG_PAUSE_OP _mm_pause()
# endif
# if defined(__INTEL_COMPILER)
# define BOOST_LOG_COMPILER_BARRIER __memory_barrier()
# else
extern "C" void _ReadWriteBarrier(void);
-#pragma intrinsic(_ReadWriteBarrier)
+# if defined(BOOST_MSVC)
+# pragma intrinsic(_ReadWriteBarrier)
+# endif
# define BOOST_LOG_COMPILER_BARRIER _ReadWriteBarrier()
# endif
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
@@ -97,8 +72,8 @@ BOOST_LOG_OPEN_NAMESPACE
namespace aux {
-//! A simple spinning mutex
-class spin_mutex
+//! A mutex that performs spinning or thread yielding in case of contention
+class adaptive_mutex
{
private:
enum state
@@ -110,7 +85,7 @@ private:
long m_State;
public:
- spin_mutex() : m_State(0) {}
+ adaptive_mutex() : m_State(0) {}
bool try_lock()
{
@@ -157,8 +132,8 @@ public:
}
// Non-copyable
- BOOST_DELETED_FUNCTION(spin_mutex(spin_mutex const&))
- BOOST_DELETED_FUNCTION(spin_mutex& operator= (spin_mutex const&))
+ BOOST_DELETED_FUNCTION(adaptive_mutex(adaptive_mutex const&))
+ BOOST_DELETED_FUNCTION(adaptive_mutex& operator= (adaptive_mutex const&))
};
#undef BOOST_LOG_PAUSE_OP
@@ -172,94 +147,46 @@ BOOST_LOG_CLOSE_NAMESPACE // namespace log
#include <boost/log/detail/footer.hpp>
-#elif defined(BOOST_LOG_SPIN_MUTEX_USE_PTHREAD)
+#elif defined(BOOST_LOG_ADAPTIVE_MUTEX_USE_PTHREAD)
#include <pthread.h>
#include <boost/assert.hpp>
#include <boost/log/detail/header.hpp>
+#if defined(PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP)
+#define BOOST_LOG_ADAPTIVE_MUTEX_USE_PTHREAD_MUTEX_ADAPTIVE_NP
+#endif
+
namespace boost {
BOOST_LOG_OPEN_NAMESPACE
namespace aux {
-#if defined(_POSIX_SPIN_LOCKS) && _POSIX_SPIN_LOCKS > 0
-
-//! A simple spinning mutex
-class spin_mutex
+//! A mutex that performs spinning or thread yielding in case of contention
+class adaptive_mutex
{
private:
- pthread_spinlock_t m_State;
+ pthread_mutex_t m_State;
public:
- spin_mutex()
- {
- const int err = pthread_spin_init(&m_State, PTHREAD_PROCESS_PRIVATE);
- if (err != 0)
- throw_exception< thread_resource_error >(err, "failed to initialize a spin mutex", "spin_mutex::spin_mutex()", __FILE__, __LINE__);
- }
-
- ~spin_mutex()
- {
- BOOST_VERIFY(pthread_spin_destroy(&m_State) == 0);
- }
-
- bool try_lock()
- {
- const int err = pthread_spin_trylock(&m_State);
- if (err == 0)
- return true;
- if (err != EBUSY)
- throw_exception< lock_error >(err, "failed to lock a spin mutex", "spin_mutex::try_lock()", __FILE__, __LINE__);
- return false;
- }
-
- void lock()
+ adaptive_mutex()
{
- const int err = pthread_spin_lock(&m_State);
- if (err != 0)
- throw_exception< lock_error >(err, "failed to lock a spin mutex", "spin_mutex::lock()", __FILE__, __LINE__);
- }
+#if defined(BOOST_LOG_ADAPTIVE_MUTEX_USE_PTHREAD_MUTEX_ADAPTIVE_NP)
+ pthread_mutexattr_t attrs;
+ pthread_mutexattr_init(&attrs);
+ pthread_mutexattr_settype(&attrs, PTHREAD_MUTEX_ADAPTIVE_NP);
- void unlock()
- {
- BOOST_VERIFY(pthread_spin_unlock(&m_State) == 0);
- }
-
- // Non-copyable
- BOOST_DELETED_FUNCTION(spin_mutex(spin_mutex const&))
- BOOST_DELETED_FUNCTION(spin_mutex& operator= (spin_mutex const&))
-
-private:
- template< typename ExceptionT >
- static BOOST_NOINLINE BOOST_LOG_NORETURN void throw_exception(int err, const char* descr, const char* func, const char* file, int line)
- {
-#if !defined(BOOST_EXCEPTION_DISABLE)
- boost::exception_detail::throw_exception_(ExceptionT(err, descr), func, file, line);
+ const int err = pthread_mutex_init(&m_State, &attrs);
+ pthread_mutexattr_destroy(&attrs);
#else
- boost::throw_exception(ExceptionT(err, descr));
-#endif
- }
-};
-
-#else // defined(_POSIX_SPIN_LOCKS)
-
-//! Backup implementation in case if pthreads don't support spin locks
-class spin_mutex
-{
-private:
- pthread_mutex_t m_State;
-
-public:
- spin_mutex()
- {
const int err = pthread_mutex_init(&m_State, NULL);
- if (err != 0)
- throw_exception< thread_resource_error >(err, "failed to initialize a spin mutex", "spin_mutex::spin_mutex()", __FILE__, __LINE__);
+#endif
+ if (BOOST_UNLIKELY(err != 0))
+ throw_exception< thread_resource_error >(err, "Failed to initialize an adaptive mutex", "adaptive_mutex::adaptive_mutex()", __FILE__, __LINE__);
}
- ~spin_mutex()
+ ~adaptive_mutex()
{
BOOST_VERIFY(pthread_mutex_destroy(&m_State) == 0);
}
@@ -269,16 +196,16 @@ public:
const int err = pthread_mutex_trylock(&m_State);
if (err == 0)
return true;
- if (err != EBUSY)
- throw_exception< lock_error >(err, "failed to lock a spin mutex", "spin_mutex::try_lock()", __FILE__, __LINE__);
+ if (BOOST_UNLIKELY(err != EBUSY))
+ throw_exception< lock_error >(err, "Failed to lock an adaptive mutex", "adaptive_mutex::try_lock()", __FILE__, __LINE__);
return false;
}
void lock()
{
const int err = pthread_mutex_lock(&m_State);
- if (err != 0)
- throw_exception< lock_error >(err, "failed to lock a spin mutex", "spin_mutex::lock()", __FILE__, __LINE__);
+ if (BOOST_UNLIKELY(err != 0))
+ throw_exception< lock_error >(err, "Failed to lock an adaptive mutex", "adaptive_mutex::lock()", __FILE__, __LINE__);
}
void unlock()
@@ -287,8 +214,8 @@ public:
}
// Non-copyable
- BOOST_DELETED_FUNCTION(spin_mutex(spin_mutex const&))
- BOOST_DELETED_FUNCTION(spin_mutex& operator= (spin_mutex const&))
+ BOOST_DELETED_FUNCTION(adaptive_mutex(adaptive_mutex const&))
+ BOOST_DELETED_FUNCTION(adaptive_mutex& operator= (adaptive_mutex const&))
private:
template< typename ExceptionT >
@@ -302,8 +229,6 @@ private:
}
};
-#endif // defined(_POSIX_SPIN_LOCKS)
-
} // namespace aux
BOOST_LOG_CLOSE_NAMESPACE // namespace log
@@ -316,4 +241,4 @@ BOOST_LOG_CLOSE_NAMESPACE // namespace log
#endif // BOOST_LOG_NO_THREADS
-#endif // BOOST_LOG_DETAIL_SPIN_MUTEX_HPP_INCLUDED_
+#endif // BOOST_LOG_DETAIL_ADAPTIVE_MUTEX_HPP_INCLUDED_
diff --git a/boost/log/detail/code_conversion.hpp b/boost/log/detail/code_conversion.hpp
index 41c086e109..86cdfd8800 100644
--- a/boost/log/detail/code_conversion.hpp
+++ b/boost/log/detail/code_conversion.hpp
@@ -34,6 +34,9 @@ BOOST_LOG_OPEN_NAMESPACE
namespace aux {
+// Implementation note: We have to implement char<->wchar_t conversions even in the absence of the native wchar_t
+// type. These conversions are used in sinks, e.g. to convert multibyte strings to wide-character filesystem paths.
+
//! The function converts one string to the character type of another
BOOST_LOG_API void code_convert_impl(const wchar_t* str1, std::size_t len, std::string& str2, std::locale const& loc = std::locale());
//! The function converts one string to the character type of another
@@ -111,8 +114,12 @@ inline std::string const& to_narrow(std::string const& str, std::locale const&)
inline std::string to_narrow(std::wstring const& str, std::locale const& loc = std::locale())
{
std::string res;
- aux::code_convert(str, res, loc);
+ aux::code_convert_impl(str.c_str(), str.size(), res, loc);
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ return static_cast< std::string&& >(res);
+#else
return res;
+#endif
}
//! The function converts the passed string to the wide-character encoding
@@ -131,8 +138,12 @@ inline std::wstring const& to_wide(std::wstring const& str, std::locale const&)
inline std::wstring to_wide(std::string const& str, std::locale const& loc = std::locale())
{
std::wstring res;
- aux::code_convert(str, res, loc);
+ aux::code_convert_impl(str.c_str(), str.size(), res, loc);
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ return static_cast< std::wstring&& >(res);
+#else
return res;
+#endif
}
} // namespace aux
diff --git a/boost/log/detail/config.hpp b/boost/log/detail/config.hpp
index 64b4412383..5ddfd403b6 100644
--- a/boost/log/detail/config.hpp
+++ b/boost/log/detail/config.hpp
@@ -26,10 +26,15 @@
#include <limits.h> // To bring in libc macros
#include <boost/config.hpp>
+// The library requires dynamic_cast in a few places
#if defined(BOOST_NO_RTTI)
# error Boost.Log: RTTI is required by the library
#endif
+#if defined(BOOST_WINDOWS)
+#include <boost/detail/winapi/config.hpp>
+#endif
+
#if defined(_MSC_VER) && _MSC_VER >= 1600
# define BOOST_LOG_HAS_PRAGMA_DETECT_MISMATCH
#endif
@@ -181,13 +186,8 @@
# endif
# if defined(BOOST_LOG_DLL)
-# if defined(BOOST_SYMBOL_IMPORT)
-# define BOOST_LOG_API BOOST_SYMBOL_IMPORT
-# elif defined(BOOST_HAS_DECLSPEC)
-# define BOOST_LOG_API __declspec(dllimport)
-# endif
-# endif
-# ifndef BOOST_LOG_API
+# define BOOST_LOG_API BOOST_SYMBOL_IMPORT
+# else
# define BOOST_LOG_API
# endif
//
@@ -221,13 +221,8 @@
#else // !defined(BOOST_LOG_BUILDING_THE_LIB)
# if defined(BOOST_LOG_DLL)
-# if defined(BOOST_SYMBOL_EXPORT)
-# define BOOST_LOG_API BOOST_SYMBOL_EXPORT
-# elif defined(BOOST_HAS_DECLSPEC)
-# define BOOST_LOG_API __declspec(dllexport)
-# endif
-# endif
-# ifndef BOOST_LOG_API
+# define BOOST_LOG_API BOOST_SYMBOL_EXPORT
+# else
# define BOOST_LOG_API BOOST_SYMBOL_VISIBLE
# endif
@@ -287,11 +282,11 @@ namespace boost {
# if defined(BOOST_THREAD_PLATFORM_PTHREAD)
# define BOOST_LOG_VERSION_NAMESPACE v2_mt_posix
# elif defined(BOOST_THREAD_PLATFORM_WIN32)
-# if defined(BOOST_LOG_USE_WINNT6_API)
+# if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
# define BOOST_LOG_VERSION_NAMESPACE v2_mt_nt6
# else
# define BOOST_LOG_VERSION_NAMESPACE v2_mt_nt5
-# endif // defined(BOOST_LOG_USE_WINNT6_API)
+# endif
# else
# define BOOST_LOG_VERSION_NAMESPACE v2_mt
# endif
@@ -303,11 +298,11 @@ namespace boost {
# if defined(BOOST_THREAD_PLATFORM_PTHREAD)
# define BOOST_LOG_VERSION_NAMESPACE v2s_mt_posix
# elif defined(BOOST_THREAD_PLATFORM_WIN32)
-# if defined(BOOST_LOG_USE_WINNT6_API)
+# if BOOST_USE_WINAPI_VERSION >= BOOST_WINAPI_VERSION_WIN6
# define BOOST_LOG_VERSION_NAMESPACE v2s_mt_nt6
# else
# define BOOST_LOG_VERSION_NAMESPACE v2s_mt_nt5
-# endif // defined(BOOST_LOG_USE_WINNT6_API)
+# endif
# else
# define BOOST_LOG_VERSION_NAMESPACE v2s_mt
# endif
diff --git a/boost/log/detail/is_character_type.hpp b/boost/log/detail/is_character_type.hpp
index 29f7dccd55..9b5e9ee2c4 100644
--- a/boost/log/detail/is_character_type.hpp
+++ b/boost/log/detail/is_character_type.hpp
@@ -40,13 +40,11 @@ struct is_character_type< char >
static BOOST_CONSTEXPR_OR_CONST bool value = true;
};
-#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
template< >
struct is_character_type< wchar_t >
{
static BOOST_CONSTEXPR_OR_CONST bool value = true;
};
-#endif
#if !defined(BOOST_NO_CXX11_CHAR16_T)
template< >
diff --git a/boost/log/detail/light_rw_mutex.hpp b/boost/log/detail/light_rw_mutex.hpp
index 5b064c64b7..1ecf700047 100644
--- a/boost/log/detail/light_rw_mutex.hpp
+++ b/boost/log/detail/light_rw_mutex.hpp
@@ -28,7 +28,7 @@
#if defined(BOOST_THREAD_POSIX) // This one can be defined by users, so it should go first
#define BOOST_LOG_LWRWMUTEX_USE_PTHREAD
-#elif defined(BOOST_WINDOWS) && defined(BOOST_LOG_USE_WINNT6_API)
+#elif defined(BOOST_WINDOWS) && (BOOST_USE_WINAPI_VERSION+0) >= (BOOST_WINAPI_VERSION_WIN6+0)
#define BOOST_LOG_LWRWMUTEX_USE_SRWLOCK
#elif defined(BOOST_HAS_PTHREADS)
#define BOOST_LOG_LWRWMUTEX_USE_PTHREAD
@@ -36,40 +36,7 @@
#if defined(BOOST_LOG_LWRWMUTEX_USE_SRWLOCK)
-#if defined(BOOST_USE_WINDOWS_H)
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0600 // _WIN32_WINNT_LONGHORN
-#endif
-
-#include <windows.h>
-
-#else // defined(BOOST_USE_WINDOWS_H)
-
-namespace boost {
-
-BOOST_LOG_OPEN_NAMESPACE
-
-namespace aux {
-
-extern "C" {
-
-struct SRWLOCK { void* p; };
-__declspec(dllimport) void __stdcall InitializeSRWLock(SRWLOCK*);
-__declspec(dllimport) void __stdcall ReleaseSRWLockExclusive(SRWLOCK*);
-__declspec(dllimport) void __stdcall ReleaseSRWLockShared(SRWLOCK*);
-__declspec(dllimport) void __stdcall AcquireSRWLockExclusive(SRWLOCK*);
-__declspec(dllimport) void __stdcall AcquireSRWLockShared(SRWLOCK*);
-
-} // extern "C"
-
-} // namespace aux
-
-BOOST_LOG_CLOSE_NAMESPACE // namespace log
-
-} // namespace boost
-
-#endif // BOOST_USE_WINDOWS_H
+#include <boost/detail/winapi/srw_lock.hpp>
namespace boost {
@@ -80,28 +47,28 @@ namespace aux {
//! A light read/write mutex that uses WinNT 6 and later APIs
class light_rw_mutex
{
- SRWLOCK m_Mutex;
+ boost::detail::winapi::SRWLOCK_ m_Mutex;
public:
light_rw_mutex()
{
- InitializeSRWLock(&m_Mutex);
+ boost::detail::winapi::InitializeSRWLock(&m_Mutex);
}
void lock_shared()
{
- AcquireSRWLockShared(&m_Mutex);
+ boost::detail::winapi::AcquireSRWLockShared(&m_Mutex);
}
void unlock_shared()
{
- ReleaseSRWLockShared(&m_Mutex);
+ boost::detail::winapi::ReleaseSRWLockShared(&m_Mutex);
}
void lock()
{
- AcquireSRWLockExclusive(&m_Mutex);
+ boost::detail::winapi::AcquireSRWLockExclusive(&m_Mutex);
}
void unlock()
{
- ReleaseSRWLockExclusive(&m_Mutex);
+ boost::detail::winapi::ReleaseSRWLockExclusive(&m_Mutex);
}
// Noncopyable
diff --git a/boost/log/detail/setup_config.hpp b/boost/log/detail/setup_config.hpp
index fec50fba56..8fde5b3e86 100644
--- a/boost/log/detail/setup_config.hpp
+++ b/boost/log/detail/setup_config.hpp
@@ -30,11 +30,12 @@
# define BOOST_LOG_SETUP_DLL
# endif
-# if defined(BOOST_HAS_DECLSPEC) && defined(BOOST_LOG_SETUP_DLL)
-# define BOOST_LOG_SETUP_API __declspec(dllimport)
+# if defined(BOOST_LOG_SETUP_DLL)
+# define BOOST_LOG_SETUP_API BOOST_SYMBOL_IMPORT
# else
# define BOOST_LOG_SETUP_API
-# endif // defined(BOOST_HAS_DECLSPEC)
+# endif
+
//
// Automatically link to the correct build variant where possible.
//
@@ -48,12 +49,10 @@
#else // !defined(BOOST_LOG_SETUP_BUILDING_THE_LIB)
-# if defined(BOOST_HAS_DECLSPEC) && defined(BOOST_LOG_SETUP_DLL)
-# define BOOST_LOG_SETUP_API __declspec(dllexport)
-# elif defined(__GNUC__) && __GNUC__ >= 4 && (defined(linux) || defined(__linux) || defined(__linux__))
-# define BOOST_LOG_SETUP_API __attribute__((visibility("default")))
+# if defined(BOOST_LOG_SETUP_DLL)
+# define BOOST_LOG_SETUP_API BOOST_SYMBOL_EXPORT
# else
-# define BOOST_LOG_SETUP_API
+# define BOOST_LOG_SETUP_API BOOST_SYMBOL_VISIBLE
# endif
#endif // !defined(BOOST_LOG_SETUP_BUILDING_THE_LIB)
diff --git a/boost/log/detail/thread_specific.hpp b/boost/log/detail/thread_specific.hpp
index 8f5958c886..7e38be5aab 100644
--- a/boost/log/detail/thread_specific.hpp
+++ b/boost/log/detail/thread_specific.hpp
@@ -38,11 +38,11 @@ namespace aux {
class thread_specific_base
{
private:
- union key_storage
- {
- void* as_pointer;
- unsigned int as_dword;
- };
+#if defined(BOOST_THREAD_PLATFORM_WIN32)
+ typedef unsigned long key_storage;
+#else
+ typedef void* key_storage;
+#endif
key_storage m_Key;
diff --git a/boost/log/expressions/formatter.hpp b/boost/log/expressions/formatter.hpp
index 09eb57c0d5..5dc6a5b132 100644
--- a/boost/log/expressions/formatter.hpp
+++ b/boost/log/expressions/formatter.hpp
@@ -15,6 +15,8 @@
#ifndef BOOST_LOG_EXPRESSIONS_FORMATTER_HPP_INCLUDED_
#define BOOST_LOG_EXPRESSIONS_FORMATTER_HPP_INCLUDED_
+#include <locale>
+#include <ostream>
#include <boost/ref.hpp>
#include <boost/move/core.hpp>
#include <boost/move/utility.hpp>
@@ -53,10 +55,80 @@ class stream_ref :
public reference_wrapper< StreamT >
{
public:
+ typedef typename StreamT::char_type char_type;
+ typedef typename StreamT::traits_type traits_type;
+ typedef typename StreamT::allocator_type allocator_type;
+ typedef typename StreamT::streambuf_type streambuf_type;
+ typedef typename StreamT::string_type string_type;
+ typedef typename StreamT::ostream_type ostream_type;
+ typedef typename StreamT::pos_type pos_type;
+ typedef typename StreamT::off_type off_type;
+ typedef typename StreamT::int_type int_type;
+
+ typedef typename StreamT::failure failure;
+ typedef typename StreamT::fmtflags fmtflags;
+ typedef typename StreamT::iostate iostate;
+ typedef typename StreamT::openmode openmode;
+ typedef typename StreamT::seekdir seekdir;
+ typedef typename StreamT::Init Init;
+
+ typedef typename StreamT::event event;
+ typedef typename StreamT::event_callback event_callback;
+
+ typedef typename StreamT::sentry sentry;
+
+ static BOOST_CONSTEXPR_OR_CONST fmtflags boolalpha = StreamT::boolalpha;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags dec = StreamT::dec;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags fixed = StreamT::fixed;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags hex = StreamT::hex;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags internal = StreamT::internal;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags left = StreamT::left;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags oct = StreamT::oct;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags right = StreamT::right;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags scientific = StreamT::scientific;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags showbase = StreamT::showbase;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags showpoint = StreamT::showpoint;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags skipws = StreamT::skipws;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags unitbuf = StreamT::unitbuf;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags uppercase = StreamT::uppercase;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags adjustfield = StreamT::adjustfield;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags basefield = StreamT::basefield;
+ static BOOST_CONSTEXPR_OR_CONST fmtflags floatfield = StreamT::floatfield;
+
+ static BOOST_CONSTEXPR_OR_CONST iostate badbit = StreamT::badbit;
+ static BOOST_CONSTEXPR_OR_CONST iostate eofbit = StreamT::eofbit;
+ static BOOST_CONSTEXPR_OR_CONST iostate failbit = StreamT::failbit;
+ static BOOST_CONSTEXPR_OR_CONST iostate goodbit = StreamT::goodbit;
+
+ static BOOST_CONSTEXPR_OR_CONST openmode app = StreamT::app;
+ static BOOST_CONSTEXPR_OR_CONST openmode ate = StreamT::ate;
+ static BOOST_CONSTEXPR_OR_CONST openmode binary = StreamT::binary;
+ static BOOST_CONSTEXPR_OR_CONST openmode in = StreamT::in;
+ static BOOST_CONSTEXPR_OR_CONST openmode out = StreamT::out;
+ static BOOST_CONSTEXPR_OR_CONST openmode trunc = StreamT::trunc;
+
+ static BOOST_CONSTEXPR_OR_CONST seekdir beg = StreamT::beg;
+ static BOOST_CONSTEXPR_OR_CONST seekdir cur = StreamT::cur;
+ static BOOST_CONSTEXPR_OR_CONST seekdir end = StreamT::end;
+
+ static BOOST_CONSTEXPR_OR_CONST event erase_event = StreamT::erase_event;
+ static BOOST_CONSTEXPR_OR_CONST event imbue_event = StreamT::imbue_event;
+ static BOOST_CONSTEXPR_OR_CONST event copyfmt_event = StreamT::copyfmt_event;
+
+
BOOST_FORCEINLINE explicit stream_ref(StreamT& strm) : reference_wrapper< StreamT >(strm)
{
}
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ template< typename T >
+ BOOST_FORCEINLINE StreamT& operator<< (T&& val) const
+ {
+ StreamT& strm = this->get();
+ strm << static_cast< T&& >(val);
+ return strm;
+ }
+#else
template< typename T >
BOOST_FORCEINLINE StreamT& operator<< (T& val) const
{
@@ -72,8 +144,149 @@ public:
strm << val;
return strm;
}
+#endif
+
+ BOOST_FORCEINLINE void attach(string_type& str) const { this->get().attach(str); }
+ BOOST_FORCEINLINE void detach() const { this->get().detach(); }
+ BOOST_FORCEINLINE string_type const& str() const { return this->get().str(); }
+ BOOST_FORCEINLINE ostream_type& stream() const { return this->get().stream(); }
+ BOOST_FORCEINLINE fmtflags flags() const { return this->get().flags(); }
+ BOOST_FORCEINLINE fmtflags flags(fmtflags f) const { return this->get().flags(f); }
+ BOOST_FORCEINLINE fmtflags setf(fmtflags f) const { return this->get().setf(f); }
+ BOOST_FORCEINLINE fmtflags setf(fmtflags f, fmtflags mask) const { return this->get().setf(f, mask); }
+ BOOST_FORCEINLINE void unsetf(fmtflags f) const { this->get().unsetf(f); }
+
+ BOOST_FORCEINLINE std::streamsize precision() const { return this->get().precision(); }
+ BOOST_FORCEINLINE std::streamsize precision(std::streamsize p) const { return this->get().precision(p); }
+
+ BOOST_FORCEINLINE std::streamsize width() const { return this->get().width(); }
+ BOOST_FORCEINLINE std::streamsize width(std::streamsize w) const { return this->get().width(w); }
+
+ BOOST_FORCEINLINE std::locale getloc() const { return this->get().getloc(); }
+ BOOST_FORCEINLINE std::locale imbue(std::locale const& loc) const { return this->get().imbue(loc); }
+
+ static BOOST_FORCEINLINE int xalloc() { return StreamT::xalloc(); }
+ BOOST_FORCEINLINE long& iword(int index) const { return this->get().iword(index); }
+ BOOST_FORCEINLINE void*& pword(int index) const { return this->get().pword(index); }
+
+ BOOST_FORCEINLINE void register_callback(event_callback fn, int index) const { this->get().register_callback(fn, index); }
+
+ static BOOST_FORCEINLINE bool sync_with_stdio(bool sync = true) { return StreamT::sync_with_stdio(sync); }
+
+ BOOST_EXPLICIT_OPERATOR_BOOL()
+ BOOST_FORCEINLINE bool operator! () const { return !this->get(); }
+
+ BOOST_FORCEINLINE iostate rdstate() const { return this->get().rdstate(); }
+ BOOST_FORCEINLINE void clear(iostate state = goodbit) const { this->get().clear(state); }
+ BOOST_FORCEINLINE void setstate(iostate state) const { this->get().setstate(state); }
+ BOOST_FORCEINLINE bool good() const { return this->get().good(); }
+ BOOST_FORCEINLINE bool eof() const { return this->get().eof(); }
+ BOOST_FORCEINLINE bool fail() const { return this->get().fail(); }
+ BOOST_FORCEINLINE bool bad() const { return this->get().bad(); }
+
+ BOOST_FORCEINLINE iostate exceptions() const { return this->get().exceptions(); }
+ BOOST_FORCEINLINE void exceptions(iostate s) const { this->get().exceptions(s); }
+
+ BOOST_FORCEINLINE ostream_type* tie() const { return this->get().tie(); }
+ BOOST_FORCEINLINE ostream_type* tie(ostream_type* strm) const { return this->get().tie(strm); }
+
+ BOOST_FORCEINLINE streambuf_type* rdbuf() const { return this->get().rdbuf(); }
+
+ BOOST_FORCEINLINE StreamT& copyfmt(std::basic_ios< char_type, traits_type >& rhs) const { return this->get().copyfmt(rhs); }
+ BOOST_FORCEINLINE StreamT& copyfmt(StreamT& rhs) const { return this->get().copyfmt(rhs); }
+
+ BOOST_FORCEINLINE char_type fill() const { return this->get().fill(); }
+ BOOST_FORCEINLINE char_type fill(char_type ch) const { return this->get().fill(ch); }
+
+ BOOST_FORCEINLINE char narrow(char_type ch, char def) const { return this->get().narrow(ch, def); }
+ BOOST_FORCEINLINE char_type widen(char ch) const { return this->get().widen(ch); }
+
+ BOOST_FORCEINLINE StreamT& flush() const { return this->get().flush(); }
+
+ BOOST_FORCEINLINE pos_type tellp() const { return this->get().tellp(); }
+ BOOST_FORCEINLINE StreamT& seekp(pos_type pos) const { return this->get().seekp(pos); }
+ BOOST_FORCEINLINE StreamT& seekp(off_type off, std::ios_base::seekdir dir) const { return this->get().seekp(off, dir); }
+
+ template< typename CharT >
+ BOOST_FORCEINLINE typename boost::log::aux::enable_if_streamable_char_type< CharT, StreamT& >::type
+ put(CharT c) const { return this->get().put(c); }
+
+ template< typename CharT >
+ BOOST_FORCEINLINE typename boost::log::aux::enable_if_streamable_char_type< CharT, StreamT& >::type
+ write(const CharT* p, std::streamsize size) const { return this->get().write(p, size); }
};
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::boolalpha;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::dec;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::fixed;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::hex;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::internal;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::left;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::oct;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::right;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::scientific;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::showbase;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::showpoint;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::skipws;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::unitbuf;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::uppercase;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::adjustfield;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::basefield;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::fmtflags stream_ref< StreamT >::floatfield;
+
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::iostate stream_ref< StreamT >::badbit;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::iostate stream_ref< StreamT >::eofbit;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::iostate stream_ref< StreamT >::failbit;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::iostate stream_ref< StreamT >::goodbit;
+
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::openmode stream_ref< StreamT >::app;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::openmode stream_ref< StreamT >::ate;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::openmode stream_ref< StreamT >::binary;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::openmode stream_ref< StreamT >::in;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::openmode stream_ref< StreamT >::out;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::openmode stream_ref< StreamT >::trunc;
+
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::seekdir stream_ref< StreamT >::beg;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::seekdir stream_ref< StreamT >::cur;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::seekdir stream_ref< StreamT >::end;
+
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::event stream_ref< StreamT >::erase_event;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::event stream_ref< StreamT >::imbue_event;
+template< typename StreamT >
+BOOST_CONSTEXPR_OR_CONST typename stream_ref< StreamT >::event stream_ref< StreamT >::copyfmt_event;
+
//! Default log record message formatter
struct message_formatter
{
@@ -84,7 +297,7 @@ struct message_formatter
}
template< typename StreamT >
- result_type operator() (record_view const& rec, StreamT& strm) const
+ BOOST_FORCEINLINE result_type operator() (record_view const& rec, StreamT& strm) const
{
boost::log::visit< expressions::tag::message::value_type >(m_MessageName, rec, boost::log::bind_output(strm));
}
diff --git a/boost/log/expressions/formatters/char_decorator.hpp b/boost/log/expressions/formatters/char_decorator.hpp
index 3082febbfb..e3188810ff 100644
--- a/boost/log/expressions/formatters/char_decorator.hpp
+++ b/boost/log/expressions/formatters/char_decorator.hpp
@@ -28,6 +28,7 @@
#include <boost/range/value_type.hpp>
#include <boost/move/core.hpp>
#include <boost/move/utility.hpp>
+#include <boost/core/enable_if.hpp>
#include <boost/utility/addressof.hpp>
#include <boost/phoenix/core/actor.hpp>
#include <boost/phoenix/core/meta_grammar.hpp>
@@ -109,10 +110,15 @@ public:
* of each pair is the source pattern, and the second one is the corresponding replacement.
*/
template< typename RangeT >
- explicit pattern_replacer(RangeT const& decorations)
+ explicit pattern_replacer(RangeT const& decorations
+#ifndef BOOST_LOG_DOXYGEN_PASS
+ // This is needed for a workaround against an MSVC-10 and older bug in constructor overload resolution
+ , typename boost::enable_if_has_type< typename range_const_iterator< RangeT >::type, int >::type = 0
+#endif
+ )
{
typedef typename range_const_iterator< RangeT >::type iterator;
- for (iterator it = begin(decorations), end_ = end(decorations); it != end_; ++it)
+ for (iterator it = boost::begin(decorations), end_ = boost::end(decorations); it != end_; ++it)
{
string_lengths lens;
{
@@ -140,8 +146,8 @@ public:
{
typedef typename range_const_iterator< FromRangeT >::type iterator1;
typedef typename range_const_iterator< ToRangeT >::type iterator2;
- iterator1 it1 = begin(from), end1 = end(from);
- iterator2 it2 = begin(to), end2 = end(to);
+ iterator1 it1 = boost::begin(from), end1 = boost::end(from);
+ iterator2 it2 = boost::begin(to), end2 = boost::end(to);
for (; it1 != end1 && it2 != end2; ++it1, ++it2)
{
string_lengths lens;
@@ -200,25 +206,21 @@ private:
template< typename RangeT >
static typename range_const_iterator< RangeT >::type string_begin(RangeT const& r)
{
- return begin(r);
+ return boost::begin(r);
}
static char_type* string_end(char_type* p)
{
- while (*p)
- ++p;
- return p;
+ return p + std::char_traits< char_type >::length(p);
}
static const char_type* string_end(const char_type* p)
{
- while (*p)
- ++p;
- return p;
+ return p + std::char_traits< char_type >::length(p);
}
template< typename RangeT >
static typename range_const_iterator< RangeT >::type string_end(RangeT const& r)
{
- return end(r);
+ return boost::end(r);
}
};
diff --git a/boost/log/sinks/async_frontend.hpp b/boost/log/sinks/async_frontend.hpp
index 7ba8a5a937..c0209bfb2f 100644
--- a/boost/log/sinks/async_frontend.hpp
+++ b/boost/log/sinks/async_frontend.hpp
@@ -15,6 +15,7 @@
#ifndef BOOST_LOG_SINKS_ASYNC_FRONTEND_HPP_INCLUDED_
#define BOOST_LOG_SINKS_ASYNC_FRONTEND_HPP_INCLUDED_
+#include <exception> // std::terminate
#include <boost/log/detail/config.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
@@ -27,6 +28,8 @@
#include <boost/bind.hpp>
#include <boost/static_assert.hpp>
+#include <boost/memory_order.hpp>
+#include <boost/atomic/atomic.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <boost/smart_ptr/make_shared_object.hpp>
#include <boost/thread/locks.hpp>
@@ -104,11 +107,11 @@ private:
frontend_mutex_type& m_Mutex;
condition_variable_any& m_Cond;
thread::id& m_ThreadID;
- bool volatile& m_StopRequested;
+ boost::atomic< bool >& m_StopRequested;
public:
//! Initializing constructor
- scoped_thread_id(frontend_mutex_type& mut, condition_variable_any& cond, thread::id& tid, bool volatile& sr)
+ scoped_thread_id(frontend_mutex_type& mut, condition_variable_any& cond, thread::id& tid, boost::atomic< bool >& sr)
: m_Mutex(mut), m_Cond(cond), m_ThreadID(tid), m_StopRequested(sr)
{
lock_guard< frontend_mutex_type > lock(m_Mutex);
@@ -117,7 +120,7 @@ private:
m_ThreadID = this_thread::get_id();
}
//! Initializing constructor
- scoped_thread_id(unique_lock< frontend_mutex_type >& l, condition_variable_any& cond, thread::id& tid, bool volatile& sr)
+ scoped_thread_id(unique_lock< frontend_mutex_type >& l, condition_variable_any& cond, thread::id& tid, boost::atomic< bool >& sr)
: m_Mutex(*l.mutex()), m_Cond(cond), m_ThreadID(tid), m_StopRequested(sr)
{
unique_lock< frontend_mutex_type > lock(move(l));
@@ -131,7 +134,7 @@ private:
try
{
lock_guard< frontend_mutex_type > lock(m_Mutex);
- m_StopRequested = false;
+ m_StopRequested.store(false, boost::memory_order_release);
m_ThreadID = thread::id();
m_Cond.notify_all();
}
@@ -140,9 +143,8 @@ private:
}
}
- private:
- scoped_thread_id(scoped_thread_id const&);
- scoped_thread_id& operator= (scoped_thread_id const&);
+ BOOST_DELETED_FUNCTION(scoped_thread_id(scoped_thread_id const&))
+ BOOST_DELETED_FUNCTION(scoped_thread_id& operator= (scoped_thread_id const&))
};
//! A scope guard that resets a flag on destructor
@@ -151,10 +153,10 @@ private:
private:
frontend_mutex_type& m_Mutex;
condition_variable_any& m_Cond;
- volatile bool& m_Flag;
+ boost::atomic< bool >& m_Flag;
public:
- explicit scoped_flag(frontend_mutex_type& mut, condition_variable_any& cond, volatile bool& f) :
+ explicit scoped_flag(frontend_mutex_type& mut, condition_variable_any& cond, boost::atomic< bool >& f) :
m_Mutex(mut), m_Cond(cond), m_Flag(f)
{
}
@@ -163,7 +165,7 @@ private:
try
{
lock_guard< frontend_mutex_type > lock(m_Mutex);
- m_Flag = false;
+ m_Flag.store(false, boost::memory_order_release);
m_Cond.notify_all();
}
catch (...)
@@ -171,9 +173,8 @@ private:
}
}
- private:
- scoped_flag(scoped_flag const&);
- scoped_flag& operator= (scoped_flag const&);
+ BOOST_DELETED_FUNCTION(scoped_flag(scoped_flag const&))
+ BOOST_DELETED_FUNCTION(scoped_flag& operator= (scoped_flag const&))
};
public:
@@ -209,9 +210,9 @@ private:
condition_variable_any m_BlockCond;
//! The flag indicates that the feeding loop has to be stopped
- volatile bool m_StopRequested; // TODO: make it a real atomic
+ boost::atomic< bool > m_StopRequested;
//! The flag indicates that queue flush has been requested
- volatile bool m_FlushRequested; // TODO: make it a real atomic
+ boost::atomic< bool > m_FlushRequested;
public:
/*!
@@ -259,10 +260,17 @@ public:
/*!
* Destructor. Implicitly stops the dedicated feeding thread, if one is running.
*/
- ~asynchronous_sink()
+ ~asynchronous_sink() BOOST_NOEXCEPT
{
- boost::this_thread::disable_interruption no_interrupts;
- stop();
+ try
+ {
+ boost::this_thread::disable_interruption no_interrupts;
+ stop();
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
}
/*!
@@ -278,11 +286,11 @@ public:
*/
void consume(record_view const& rec)
{
- if (m_FlushRequested)
+ if (BOOST_UNLIKELY(m_FlushRequested.load(boost::memory_order_acquire)))
{
unique_lock< frontend_mutex_type > lock(base_type::frontend_mutex());
// Wait until flush is done
- while (m_FlushRequested)
+ while (m_FlushRequested.load(boost::memory_order_acquire))
m_BlockCond.wait(lock);
}
queue_base_type::enqueue(rec);
@@ -293,7 +301,7 @@ public:
*/
bool try_consume(record_view const& rec)
{
- if (!m_FlushRequested)
+ if (!m_FlushRequested.load(boost::memory_order_acquire))
{
return queue_base_type::try_enqueue(rec);
}
@@ -319,7 +327,7 @@ public:
while (true)
{
do_feed_records();
- if (!m_StopRequested)
+ if (!m_StopRequested.load(boost::memory_order_acquire))
{
// Block until new record is available
record_view rec;
@@ -352,14 +360,14 @@ public:
{
try
{
- m_StopRequested = true;
+ m_StopRequested.store(true, boost::memory_order_release);
queue_base_type::interrupt_dequeue();
- while (m_StopRequested)
+ while (m_StopRequested.load(boost::memory_order_acquire))
m_BlockCond.wait(lock);
}
catch (...)
{
- m_StopRequested = false;
+ m_StopRequested.store(false, boost::memory_order_release);
throw;
}
@@ -386,8 +394,6 @@ public:
* The method feeds all log records that may have been buffered to the backend and returns.
* Unlike \c feed_records, in case of ordering queueing the method also feeds records
* that were enqueued during the ordering window, attempting to empty the queue completely.
- *
- * \pre The sink frontend must be constructed without spawning a dedicated thread
*/
void flush()
{
@@ -395,9 +401,9 @@ public:
if (m_FeedingThreadID != thread::id() || m_DedicatedFeedingThread.joinable())
{
// There is already a thread feeding records, let it do the job
- m_FlushRequested = true;
+ m_FlushRequested.store(true, boost::memory_order_release);
queue_base_type::interrupt_dequeue();
- while (!m_StopRequested && m_FlushRequested)
+ while (!m_StopRequested.load(boost::memory_order_acquire) && m_FlushRequested.load(boost::memory_order_acquire))
m_BlockCond.wait(lock);
// The condition may have been signalled when the feeding thread was finishing.
@@ -406,7 +412,7 @@ public:
return;
}
- m_FlushRequested = true;
+ m_FlushRequested.store(true, boost::memory_order_release);
// Flush records ourselves. The guard releases the lock.
scoped_thread_id guard(lock, m_BlockCond, m_FeedingThreadID, m_StopRequested);
@@ -425,11 +431,11 @@ private:
//! The record feeding loop
void do_feed_records()
{
- while (!m_StopRequested)
+ while (!m_StopRequested.load(boost::memory_order_acquire))
{
record_view rec;
bool dequeued = false;
- if (!m_FlushRequested)
+ if (BOOST_LIKELY(!m_FlushRequested.load(boost::memory_order_acquire)))
dequeued = queue_base_type::try_dequeue_ready(rec);
else
dequeued = queue_base_type::try_dequeue(rec);
@@ -440,7 +446,7 @@ private:
break;
}
- if (m_FlushRequested)
+ if (BOOST_UNLIKELY(m_FlushRequested.load(boost::memory_order_acquire)))
{
scoped_flag guard(base_type::frontend_mutex(), m_BlockCond, m_FlushRequested);
base_type::flush_backend(m_BackendMutex, *m_pBackend);
diff --git a/boost/log/sinks/unbounded_fifo_queue.hpp b/boost/log/sinks/unbounded_fifo_queue.hpp
index 3cfaa187e1..9fdb44cc3e 100644
--- a/boost/log/sinks/unbounded_fifo_queue.hpp
+++ b/boost/log/sinks/unbounded_fifo_queue.hpp
@@ -26,6 +26,8 @@
#error Boost.Log: This header content is only supported in multithreaded environment
#endif
+#include <boost/memory_order.hpp>
+#include <boost/atomic/atomic.hpp>
#include <boost/log/detail/event.hpp>
#include <boost/log/detail/threadsafe_queue.hpp>
#include <boost/log/core/record_view.hpp>
@@ -62,7 +64,7 @@ private:
//! Event object to block on
boost::log::aux::event m_event;
//! Interruption flag
- volatile bool m_interruption_requested; // TODO: make it atomic
+ boost::atomic< bool > m_interruption_requested;
protected:
//! Default constructor
@@ -113,11 +115,8 @@ protected:
while (true)
{
m_event.wait();
- if (m_interruption_requested)
- {
- m_interruption_requested = false;
+ if (m_interruption_requested.exchange(false, boost::memory_order_acquire))
return false;
- }
if (m_queue.try_pop(rec))
return true;
}
@@ -126,7 +125,7 @@ protected:
//! Wakes a thread possibly blocked in the \c dequeue method
void interrupt_dequeue()
{
- m_interruption_requested = true;
+ m_interruption_requested.store(true, boost::memory_order_release);
m_event.set_signalled();
}
};
diff --git a/boost/log/sources/record_ostream.hpp b/boost/log/sources/record_ostream.hpp
index b3c58e2ab0..c1e80593aa 100644
--- a/boost/log/sources/record_ostream.hpp
+++ b/boost/log/sources/record_ostream.hpp
@@ -39,6 +39,18 @@ namespace boost {
BOOST_LOG_OPEN_NAMESPACE
+template< typename CharT >
+class basic_record_ostream;
+
+namespace aux {
+
+template< typename StreamT, typename R >
+struct enable_if_record_ostream {};
+template< typename CharT, typename R >
+struct enable_if_record_ostream< basic_record_ostream< CharT >, R > { typedef R type; };
+
+} // namespace aux
+
/*!
* \brief Logging record adapter with a streaming capability
*
@@ -174,6 +186,55 @@ typedef basic_record_ostream< char > record_ostream; //!< Convenience typ
typedef basic_record_ostream< wchar_t > wrecord_ostream; //!< Convenience typedef for wide-character logging
#endif
+// Implementation note: these operators below should be the least attractive for the compiler
+// so that user's overloads are chosen, when present. We use function template partial ordering for this purpose.
+// We also don't use perfect forwarding for the right hand argument because in ths case the generic overload
+// would be more preferred than the typical one written by users:
+//
+// record_ostream& operator<< (record_ostream& strm, my_type const& arg);
+//
+// This is because my_type rvalues require adding const to the type, which counts as a conversion that is not required
+// if there is a perfect forwarding overload.
+template< typename StreamT, typename T >
+inline typename boost::log::aux::enable_if_record_ostream< StreamT, StreamT& >::type
+operator<< (StreamT& strm, T const& value)
+{
+ typedef basic_formatting_ostream< typename StreamT::char_type > formatting_ostream_type;
+ static_cast< formatting_ostream_type& >(strm) << value;
+ return strm;
+}
+
+template< typename StreamT, typename T >
+inline typename boost::log::aux::enable_if_record_ostream< StreamT, StreamT& >::type
+operator<< (StreamT& strm, T& value)
+{
+ typedef basic_formatting_ostream< typename StreamT::char_type > formatting_ostream_type;
+ static_cast< formatting_ostream_type& >(strm) << value;
+ return strm;
+}
+
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+template< typename StreamT, typename T >
+inline typename boost::log::aux::enable_if_record_ostream< StreamT, StreamT& >::type
+operator<< (StreamT&& strm, T const& value)
+{
+ typedef basic_formatting_ostream< typename StreamT::char_type > formatting_ostream_type;
+ static_cast< formatting_ostream_type& >(strm) << value;
+ return strm;
+}
+
+template< typename StreamT, typename T >
+inline typename boost::log::aux::enable_if_record_ostream< StreamT, StreamT& >::type
+operator<< (StreamT&& strm, T& value)
+{
+ typedef basic_formatting_ostream< typename StreamT::char_type > formatting_ostream_type;
+ static_cast< formatting_ostream_type& >(strm) << value;
+ return strm;
+}
+
+#endif // !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
namespace aux {
//! Internal class that provides formatting streams for record pumps
diff --git a/boost/log/utility/formatting_ostream.hpp b/boost/log/utility/formatting_ostream.hpp
index 4345206f12..4d57ac4e32 100644
--- a/boost/log/utility/formatting_ostream.hpp
+++ b/boost/log/utility/formatting_ostream.hpp
@@ -128,6 +128,10 @@ public:
{
}
+ // A workaround for Solaris Studio 12.4 compiler, see: https://svn.boost.org/trac/boost/ticket/11545
+ BOOST_EXPLICIT_OPERATOR_BOOL()
+ bool operator! () const { return !static_cast< base_type const& >(*this); }
+
BOOST_DELETED_FUNCTION(sentry(sentry const&))
BOOST_DELETED_FUNCTION(sentry& operator= (sentry const&))
};
@@ -363,7 +367,7 @@ public:
write(const OtherCharT* p, std::streamsize size)
{
sentry guard(*this);
- if (guard)
+ if (!!guard)
{
m_stream.flush();
@@ -399,6 +403,8 @@ public:
return this->formatted_write(p, static_cast< std::streamsize >(std::char_traits< char >::length(p)));
}
+ // When no native character type is supported, the following overloads are disabled as they have ambiguous meaning.
+ // Use basic_string_ref, basic_string_view or basic_string to explicitly indicate that the data is a string.
#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
basic_formatting_ostream& operator<< (wchar_t c)
{
@@ -622,7 +628,7 @@ private:
basic_formatting_ostream& formatted_write(const char_type* p, std::streamsize size)
{
sentry guard(*this);
- if (guard)
+ if (!!guard)
{
m_stream.flush();
@@ -641,7 +647,7 @@ private:
basic_formatting_ostream& formatted_write(const OtherCharT* p, std::streamsize size)
{
sentry guard(*this);
- if (guard)
+ if (!!guard)
{
m_stream.flush();
@@ -779,6 +785,13 @@ void basic_formatting_ostream< CharT, TraitsT, AllocatorT >::aligned_write(const
// Implementation note: these operators below should be the least attractive for the compiler
// so that user's overloads are chosen, when present. We use function template partial ordering for this purpose.
+// We also don't use perfect forwarding for the right hand argument because in ths case the generic overload
+// would be more preferred than the typical one written by users:
+//
+// formatting_ostream& operator<< (formatting_ostream& strm, my_type const& arg);
+//
+// This is because my_type rvalues require adding const to the type, which counts as a conversion that is not required
+// if there is a perfect forwarding overload.
template< typename StreamT, typename T >
inline typename boost::log::aux::enable_if_formatting_ostream< StreamT, StreamT& >::type
operator<< (StreamT& strm, T const& value)
diff --git a/boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp b/boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp
index d01228a5da..21428ff949 100644
--- a/boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp
+++ b/boost/log/utility/type_dispatch/dynamic_type_dispatcher.hpp
@@ -70,7 +70,7 @@ private:
trampoline_t as_trampoline;
}
caster;
- caster.as_trampoline = &callback_base::trampoline< VisitorT, T >;
+ caster.as_trampoline = (trampoline_t)&callback_base::trampoline< VisitorT, T >;
this->m_pTrampoline = caster.as_pvoid;
}
};
diff --git a/boost/log/utility/type_dispatch/static_type_dispatcher.hpp b/boost/log/utility/type_dispatch/static_type_dispatcher.hpp
index bae420f7e5..c580213d66 100644
--- a/boost/log/utility/type_dispatch/static_type_dispatcher.hpp
+++ b/boost/log/utility/type_dispatch/static_type_dispatcher.hpp
@@ -89,7 +89,7 @@ private:
trampoline_t as_trampoline;
}
caster;
- caster.as_trampoline = &type_dispatcher::callback_base::trampoline< VisitorT, T >;
+ caster.as_trampoline = (trampoline_t)&type_dispatcher::callback_base::trampoline< VisitorT, T >;
p->second = caster.as_pvoid;
}
};
@@ -214,10 +214,10 @@ private:
protected:
//! Initializing constructor
- single_type_dispatcher_base(typeindex::type_index type, callback_base const& callback) BOOST_NOEXCEPT :
+ single_type_dispatcher_base(typeindex::type_index type, callback_base const& cb) BOOST_NOEXCEPT :
type_dispatcher(&single_type_dispatcher_base::get_callback),
m_type(type),
- m_callback(callback)
+ m_callback(cb)
{
}
@@ -242,11 +242,14 @@ template< typename T >
class single_type_dispatcher :
public single_type_dispatcher_base
{
+private:
+ typedef void (*trampoline_t)(void*, T const&);
+
public:
//! Constructor
template< typename VisitorT >
explicit single_type_dispatcher(VisitorT& visitor) BOOST_NOEXCEPT :
- single_type_dispatcher_base(typeindex::type_id< T >(), callback_base((void*)boost::addressof(visitor), &callback_base::trampoline< VisitorT, T >))
+ single_type_dispatcher_base(typeindex::type_id< T >(), callback_base((void*)boost::addressof(visitor), (trampoline_t)&callback_base::trampoline< VisitorT, T >))
{
}
diff --git a/boost/math/concepts/real_concept.hpp b/boost/math/concepts/real_concept.hpp
index 2b105e6c85..3a759955ab 100644
--- a/boost/math/concepts/real_concept.hpp
+++ b/boost/math/concepts/real_concept.hpp
@@ -215,10 +215,17 @@ inline real_concept floor(real_concept a)
{ return std::floor(a.value()); }
inline real_concept modf(real_concept a, real_concept* ipart)
{
+#ifdef __MINGW32__
+ real_concept_base_type ip;
+ real_concept_base_type result = boost::math::modf(a.value(), &ip);
+ *ipart = ip;
+ return result;
+#else
real_concept_base_type ip;
real_concept_base_type result = std::modf(a.value(), &ip);
*ipart = ip;
return result;
+#endif
}
inline real_concept frexp(real_concept a, int* expon)
{ return std::frexp(a.value(), expon); }
@@ -368,7 +375,7 @@ inline concepts::real_concept epsilon<concepts::real_concept>(BOOST_MATH_EXPLICI
}
template <>
-inline int digits<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept))
+inline BOOST_MATH_CONSTEXPR int digits<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::real_concept)) BOOST_NOEXCEPT
{
// Assume number of significand bits is same as real_concept_base_type,
// unless std::numeric_limits<T>::is_specialized to provide digits.
@@ -381,6 +388,26 @@ inline int digits<concepts::real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC
}
} // namespace tools
+/*
+namespace policies {
+ namespace detail {
+
+ template <class T>
+ inline concepts::real_concept raise_rounding_error(
+ const char*,
+ const char*,
+ const T& val,
+ const concepts::real_concept&,
+ const ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
+ {
+ errno = ERANGE;
+ // This may or may not do the right thing, but the user asked for the error
+ // to be silent so here we go anyway:
+ return val > 0 ? boost::math::tools::max_value<concepts::real_concept>() : -boost::math::tools::max_value<concepts::real_concept>();
+ }
+
+ }
+}*/
#if defined(__SGI_STL_PORT) || defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)
//
diff --git a/boost/math/concepts/std_real_concept.hpp b/boost/math/concepts/std_real_concept.hpp
index c565ce3773..b297501d98 100644
--- a/boost/math/concepts/std_real_concept.hpp
+++ b/boost/math/concepts/std_real_concept.hpp
@@ -378,7 +378,7 @@ inline concepts::std_real_concept epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC
}
template <>
-inline int digits<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept))
+inline BOOST_MATH_CONSTEXPR int digits<concepts::std_real_concept>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(concepts::std_real_concept)) BOOST_NOEXCEPT
{ // Assume number of significand bits is same as std_real_concept_base_type,
// unless std::numeric_limits<T>::is_specialized to provide digits.
return digits<concepts::std_real_concept_base_type>();
diff --git a/boost/math/constants/constants.hpp b/boost/math/constants/constants.hpp
index 59873c60d8..2a28f98f9e 100644
--- a/boost/math/constants/constants.hpp
+++ b/boost/math/constants/constants.hpp
@@ -158,7 +158,7 @@ namespace boost{ namespace math
#endif
}
template <class Real>
- const char* convert_from_string(const char* p, const mpl::true_&)
+ BOOST_CONSTEXPR const char* convert_from_string(const char* p, const mpl::true_&) BOOST_NOEXCEPT
{
return p;
}
@@ -211,7 +211,7 @@ namespace boost{ namespace math
#ifdef BOOST_MATH_USE_FLOAT128
# define BOOST_MATH_FLOAT128_CONSTANT_OVERLOAD(x) \
- static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_float128>&)\
+ static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_float128>&) BOOST_NOEXCEPT\
{ return BOOST_JOIN(x, Q); }
#else
# define BOOST_MATH_FLOAT128_CONSTANT_OVERLOAD(x)
@@ -242,11 +242,11 @@ namespace boost{ namespace math
constant_initializer<T, & BOOST_JOIN(constant_, name)<T>::get_from_string >::force_instantiate();\
return get_from_string();\
}\
- static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_float>)\
+ static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_float>) BOOST_NOEXCEPT\
{ return BOOST_JOIN(x, F); }\
- static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_double>&)\
+ static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_double>&) BOOST_NOEXCEPT\
{ return x; }\
- static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_long_double>&)\
+ static inline BOOST_CONSTEXPR T get(const mpl::int_<construct_from_long_double>&) BOOST_NOEXCEPT\
{ return BOOST_JOIN(x, L); }\
BOOST_MATH_FLOAT128_CONSTANT_OVERLOAD(x) \
template <int N> static inline const T& get(const mpl::int_<N>&)\
@@ -262,9 +262,9 @@ namespace boost{ namespace math
\
\
/* The actual forwarding function: */ \
- template <class T, class Policy> inline BOOST_CONSTEXPR typename detail::constant_return<T, Policy>::type name(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T) BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(Policy))\
+ template <class T, class Policy> inline BOOST_CONSTEXPR typename detail::constant_return<T, Policy>::type name(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T) BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(Policy)) BOOST_MATH_NOEXCEPT(T)\
{ return detail:: BOOST_JOIN(constant_, name)<T>::get(typename construction_traits<T, Policy>::type()); }\
- template <class T> inline BOOST_CONSTEXPR typename detail::constant_return<T>::type name(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))\
+ template <class T> inline BOOST_CONSTEXPR typename detail::constant_return<T>::type name(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T)) BOOST_MATH_NOEXCEPT(T)\
{ return name<T, boost::math::policies::policy<> >(); }\
\
\
diff --git a/boost/math/cstdfloat/cstdfloat_iostream.hpp b/boost/math/cstdfloat/cstdfloat_iostream.hpp
index ac94fd35f9..9aaf5f32fb 100644
--- a/boost/math/cstdfloat/cstdfloat_iostream.hpp
+++ b/boost/math/cstdfloat/cstdfloat_iostream.hpp
@@ -97,15 +97,18 @@
char* my_buffer2 = static_cast<char*>(0U);
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
my_buffer2 = new char[v + 3];
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const std::bad_alloc&)
{
BOOST_THROW_EXCEPTION(std::runtime_error("Formatting of boost::float128_t failed while allocating memory."));
}
-
+#endif
const int v2 = ::quadmath_snprintf(my_buffer2,
v + 3,
my_format_string,
diff --git a/boost/math/distributions/bernoulli.hpp b/boost/math/distributions/bernoulli.hpp
index 1355eda229..09b8a0a3e1 100644
--- a/boost/math/distributions/bernoulli.hpp
+++ b/boost/math/distributions/bernoulli.hpp
@@ -89,7 +89,7 @@ namespace boost
template <class RealType, class Policy>
inline bool check_dist_and_prob(const char* function, RealType p, RealType prob, RealType* result, const Policy& /* pol */)
{
- if(check_dist(function, p, result, Policy(), typename policies::method_error_check<Policy>::type()) && detail::check_probability(function, prob, result, Policy()) == false)
+ if((check_dist(function, p, result, Policy(), typename policies::method_error_check<Policy>::type()) && detail::check_probability(function, prob, result, Policy())) == false)
{
return false;
}
diff --git a/boost/math/distributions/binomial.hpp b/boost/math/distributions/binomial.hpp
index a48c89c5b9..620bf9b121 100644
--- a/boost/math/distributions/binomial.hpp
+++ b/boost/math/distributions/binomial.hpp
@@ -155,7 +155,7 @@ namespace boost
template <class RealType, class Policy>
inline bool check_dist_and_prob(const char* function, const RealType& N, RealType p, RealType prob, RealType* result, const Policy& pol)
{
- if(check_dist(function, N, p, result, pol) && detail::check_probability(function, prob, result, pol) == false)
+ if((check_dist(function, N, p, result, pol) && detail::check_probability(function, prob, result, pol)) == false)
return false;
return true;
}
diff --git a/boost/math/distributions/detail/hypergeometric_pdf.hpp b/boost/math/distributions/detail/hypergeometric_pdf.hpp
index 1e6a5ca20d..4364266514 100644
--- a/boost/math/distributions/detail/hypergeometric_pdf.hpp
+++ b/boost/math/distributions/detail/hypergeometric_pdf.hpp
@@ -311,7 +311,7 @@ T hypergeometric_pdf_prime_loop_imp(hypergeometric_pdf_prime_loop_data& data, hy
}
if(prime_powers)
{
- T p = integer_power<T>(data.current_prime, prime_powers);
+ T p = integer_power<T>(static_cast<T>(data.current_prime), prime_powers);
if((p > 1) && (tools::max_value<T>() / p < result.value))
{
//
diff --git a/boost/math/distributions/detail/hypergeometric_quantile.hpp b/boost/math/distributions/detail/hypergeometric_quantile.hpp
index a855a4a777..2cdee23c10 100644
--- a/boost/math/distributions/detail/hypergeometric_quantile.hpp
+++ b/boost/math/distributions/detail/hypergeometric_quantile.hpp
@@ -130,6 +130,29 @@ unsigned hypergeometric_quantile_imp(T p, T q, unsigned r, unsigned n, unsigned
unsigned x = base;
result = hypergeometric_pdf<T>(x, r, n, N, pol);
T diff = result;
+ if (diff == 0)
+ {
+ ++x;
+ // We want to skip through x values as fast as we can until we start getting non-zero values,
+ // otherwise we're just making lots of expensive PDF calls:
+ T log_pdf = boost::math::lgamma(static_cast<T>(n + 1), pol)
+ + boost::math::lgamma(static_cast<T>(r + 1), pol)
+ + boost::math::lgamma(static_cast<T>(N - n + 1), pol)
+ + boost::math::lgamma(static_cast<T>(N - r + 1), pol)
+ - boost::math::lgamma(static_cast<T>(N + 1), pol)
+ - boost::math::lgamma(static_cast<T>(x + 1), pol)
+ - boost::math::lgamma(static_cast<T>(n - x + 1), pol)
+ - boost::math::lgamma(static_cast<T>(r - x + 1), pol)
+ - boost::math::lgamma(static_cast<T>(N - n - r + x + 1), pol);
+ while (log_pdf < tools::log_min_value<T>())
+ {
+ log_pdf += -log(static_cast<T>(x + 1)) + log(static_cast<T>(n - x)) + log(static_cast<T>(r - x)) - log(static_cast<T>(N - n - r + x + 1));
+ ++x;
+ }
+ // By the time we get here, log_pdf may be fairly inaccurate due to
+ // roundoff errors, get a fresh PDF calculation before proceding:
+ diff = hypergeometric_pdf<T>(x, r, n, N, pol);
+ }
while(result < p)
{
diff = (diff > tools::min_value<T>() * 8)
@@ -155,6 +178,29 @@ unsigned hypergeometric_quantile_imp(T p, T q, unsigned r, unsigned n, unsigned
unsigned x = lim;
result = 0;
T diff = hypergeometric_pdf<T>(x, r, n, N, pol);
+ if (diff == 0)
+ {
+ // We want to skip through x values as fast as we can until we start getting non-zero values,
+ // otherwise we're just making lots of expensive PDF calls:
+ --x;
+ T log_pdf = boost::math::lgamma(static_cast<T>(n + 1), pol)
+ + boost::math::lgamma(static_cast<T>(r + 1), pol)
+ + boost::math::lgamma(static_cast<T>(N - n + 1), pol)
+ + boost::math::lgamma(static_cast<T>(N - r + 1), pol)
+ - boost::math::lgamma(static_cast<T>(N + 1), pol)
+ - boost::math::lgamma(static_cast<T>(x + 1), pol)
+ - boost::math::lgamma(static_cast<T>(n - x + 1), pol)
+ - boost::math::lgamma(static_cast<T>(r - x + 1), pol)
+ - boost::math::lgamma(static_cast<T>(N - n - r + x + 1), pol);
+ while (log_pdf < tools::log_min_value<T>())
+ {
+ log_pdf += log(static_cast<T>(x)) - log(static_cast<T>(n - x + 1)) - log(static_cast<T>(r - x + 1)) + log(static_cast<T>(N - n - r + x));
+ --x;
+ }
+ // By the time we get here, log_pdf may be fairly inaccurate due to
+ // roundoff errors, get a fresh PDF calculation before proceding:
+ diff = hypergeometric_pdf<T>(x, r, n, N, pol);
+ }
while(result + diff / 2 < q)
{
result += diff;
diff --git a/boost/math/distributions/exponential.hpp b/boost/math/distributions/exponential.hpp
index bfe7e6b4ac..05c49374ed 100644
--- a/boost/math/distributions/exponential.hpp
+++ b/boost/math/distributions/exponential.hpp
@@ -117,7 +117,7 @@ inline RealType pdf(const exponential_distribution<RealType, Policy>& dist, cons
return result;
// Workaround for VC11/12 bug:
if ((boost::math::isinf)(x))
- return 0;
+ return 0;
result = lambda * exp(-lambda * x);
return result;
} // pdf
@@ -178,7 +178,7 @@ inline RealType cdf(const complemented2_type<exponential_distribution<RealType,
return result;
// Workaround for VC11/12 bug:
if (c.param >= tools::max_value<RealType>())
- return 0;
+ return 0;
result = exp(-c.param * lambda);
return result;
diff --git a/boost/math/distributions/extreme_value.hpp b/boost/math/distributions/extreme_value.hpp
index 4c6b710cbd..cb86de6612 100644
--- a/boost/math/distributions/extreme_value.hpp
+++ b/boost/math/distributions/extreme_value.hpp
@@ -100,12 +100,12 @@ inline RealType pdf(const extreme_value_distribution<RealType, Policy>& dist, co
RealType a = dist.location();
RealType b = dist.scale();
RealType result = 0;
- if((boost::math::isinf)(x))
- return 0.0f;
if(0 == detail::verify_scale_b(function, b, &result, Policy()))
return result;
if(0 == detail::check_finite(function, a, &result, Policy()))
return result;
+ if((boost::math::isinf)(x))
+ return 0.0f;
if(0 == detail::check_x(function, x, &result, Policy()))
return result;
RealType e = (a - x) / b;
diff --git a/boost/math/distributions/fisher_f.hpp b/boost/math/distributions/fisher_f.hpp
index 9e259bcc96..798db2fa75 100644
--- a/boost/math/distributions/fisher_f.hpp
+++ b/boost/math/distributions/fisher_f.hpp
@@ -78,10 +78,10 @@ RealType pdf(const fisher_f_distribution<RealType, Policy>& dist, const RealType
// Error check:
RealType error_result = 0;
static const char* function = "boost::math::pdf(fisher_f_distribution<%1%> const&, %1%)";
- if(false == detail::check_df(
+ if(false == (detail::check_df(
function, df1, &error_result, Policy())
&& detail::check_df(
- function, df2, &error_result, Policy()))
+ function, df2, &error_result, Policy())))
return error_result;
if((x < 0) || !(boost::math::isfinite)(x))
diff --git a/boost/math/distributions/geometric.hpp b/boost/math/distributions/geometric.hpp
index 88947d6c57..6c9713eadd 100644
--- a/boost/math/distributions/geometric.hpp
+++ b/boost/math/distributions/geometric.hpp
@@ -105,7 +105,7 @@ namespace boost
template <class RealType, class Policy>
inline bool check_dist_and_prob(const char* function, RealType p, RealType prob, RealType* result, const Policy& pol)
{
- if(check_dist(function, p, result, pol) && detail::check_probability(function, prob, result, pol) == false)
+ if((check_dist(function, p, result, pol) && detail::check_probability(function, prob, result, pol)) == false)
{
return false;
}
diff --git a/boost/math/distributions/hypergeometric.hpp b/boost/math/distributions/hypergeometric.hpp
index 5d1ebc7388..21449638d9 100644
--- a/boost/math/distributions/hypergeometric.hpp
+++ b/boost/math/distributions/hypergeometric.hpp
@@ -41,12 +41,12 @@ namespace boost { namespace math {
unsigned defective()const
{
- return m_n;
+ return m_r;
}
unsigned sample_count()const
{
- return m_r;
+ return m_n;
}
bool check_params(const char* function, RealType* result)const
@@ -84,9 +84,9 @@ namespace boost { namespace math {
private:
// Data members:
- unsigned m_n; // number of "defective" items
+ unsigned m_n; // number of items picked
unsigned m_N; // number of "total" items
- unsigned m_r; // number of items picked
+ unsigned m_r; // number of "defective" items
}; // class hypergeometric_distribution
@@ -99,8 +99,8 @@ namespace boost { namespace math {
# pragma warning(push)
# pragma warning(disable:4267)
#endif
- unsigned r = dist.sample_count();
- unsigned n = dist.defective();
+ unsigned r = dist.defective();
+ unsigned n = dist.sample_count();
unsigned N = dist.total();
unsigned l = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
unsigned u = (std::min)(r, n);
@@ -127,7 +127,7 @@ namespace boost { namespace math {
return result;
return boost::math::detail::hypergeometric_pdf<RealType>(
- x, dist.sample_count(), dist.defective(), dist.total(), Policy());
+ x, dist.defective(), dist.sample_count(), dist.total(), Policy());
}
template <class RealType, class Policy, class U>
@@ -156,7 +156,7 @@ namespace boost { namespace math {
return result;
return boost::math::detail::hypergeometric_cdf<RealType>(
- x, dist.sample_count(), dist.defective(), dist.total(), false, Policy());
+ x, dist.defective(), dist.sample_count(), dist.total(), false, Policy());
}
template <class RealType, class Policy, class U>
@@ -185,7 +185,7 @@ namespace boost { namespace math {
return result;
return boost::math::detail::hypergeometric_cdf<RealType>(
- c.param, c.dist.sample_count(), c.dist.defective(), c.dist.total(), true, Policy());
+ c.param, c.dist.defective(), c.dist.sample_count(), c.dist.total(), true, Policy());
}
template <class RealType, class Policy, class U>
@@ -214,7 +214,7 @@ namespace boost { namespace math {
if (false == dist.check_params(function, &result)) return result;
if(false == detail::check_probability(function, p, &result, Policy())) return result;
- return static_cast<RealType>(detail::hypergeometric_quantile(p, RealType(1 - p), dist.sample_count(), dist.defective(), dist.total(), Policy()));
+ return static_cast<RealType>(detail::hypergeometric_quantile(p, RealType(1 - p), dist.defective(), dist.sample_count(), dist.total(), Policy()));
} // quantile
template <class RealType, class Policy>
@@ -228,30 +228,30 @@ namespace boost { namespace math {
if (false == c.dist.check_params(function, &result)) return result;
if(false == detail::check_probability(function, c.param, &result, Policy())) return result;
- return static_cast<RealType>(detail::hypergeometric_quantile(RealType(1 - c.param), c.param, c.dist.sample_count(), c.dist.defective(), c.dist.total(), Policy()));
+ return static_cast<RealType>(detail::hypergeometric_quantile(RealType(1 - c.param), c.param, c.dist.defective(), c.dist.sample_count(), c.dist.total(), Policy()));
} // quantile
template <class RealType, class Policy>
inline RealType mean(const hypergeometric_distribution<RealType, Policy>& dist)
{
- return static_cast<RealType>(dist.sample_count() * dist.defective()) / dist.total();
+ return static_cast<RealType>(dist.defective() * dist.sample_count()) / dist.total();
} // RealType mean(const hypergeometric_distribution<RealType, Policy>& dist)
template <class RealType, class Policy>
inline RealType variance(const hypergeometric_distribution<RealType, Policy>& dist)
{
- RealType r = static_cast<RealType>(dist.sample_count());
- RealType n = static_cast<RealType>(dist.defective());
+ RealType r = static_cast<RealType>(dist.defective());
+ RealType n = static_cast<RealType>(dist.sample_count());
RealType N = static_cast<RealType>(dist.total());
- return r * (n / N) * (1 - n / N) * (N - r) / (N - 1);
+ return n * r * (N - r) * (N - n) / (N * N * (N - 1));
} // RealType variance(const hypergeometric_distribution<RealType, Policy>& dist)
template <class RealType, class Policy>
inline RealType mode(const hypergeometric_distribution<RealType, Policy>& dist)
{
BOOST_MATH_STD_USING
- RealType r = static_cast<RealType>(dist.sample_count());
- RealType n = static_cast<RealType>(dist.defective());
+ RealType r = static_cast<RealType>(dist.defective());
+ RealType n = static_cast<RealType>(dist.sample_count());
RealType N = static_cast<RealType>(dist.total());
return floor((r + 1) * (n + 1) / (N + 2));
}
@@ -260,17 +260,17 @@ namespace boost { namespace math {
inline RealType skewness(const hypergeometric_distribution<RealType, Policy>& dist)
{
BOOST_MATH_STD_USING
- RealType r = static_cast<RealType>(dist.sample_count());
- RealType n = static_cast<RealType>(dist.defective());
+ RealType r = static_cast<RealType>(dist.defective());
+ RealType n = static_cast<RealType>(dist.sample_count());
RealType N = static_cast<RealType>(dist.total());
- return (N - 2 * n) * sqrt(N - 1) * (N - 2 * r) / (sqrt(n * r * (N - n) * (N - r)) * (N - 2));
+ return (N - 2 * r) * sqrt(N - 1) * (N - 2 * n) / (sqrt(n * r * (N - r) * (N - n)) * (N - 2));
} // RealType skewness(const hypergeometric_distribution<RealType, Policy>& dist)
template <class RealType, class Policy>
inline RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
{
- RealType r = static_cast<RealType>(dist.sample_count());
- RealType n = static_cast<RealType>(dist.defective());
+ RealType r = static_cast<RealType>(dist.defective());
+ RealType n = static_cast<RealType>(dist.sample_count());
RealType N = static_cast<RealType>(dist.total());
RealType t1 = N * N * (N - 1) / (r * (N - 2) * (N - 3) * (N - r));
RealType t2 = (N * (N + 1) - 6 * N * (N - r)) / (n * (N - n))
diff --git a/boost/math/distributions/inverse_gaussian.hpp b/boost/math/distributions/inverse_gaussian.hpp
index eeca12ad48..e3aa4e0650 100644
--- a/boost/math/distributions/inverse_gaussian.hpp
+++ b/boost/math/distributions/inverse_gaussian.hpp
@@ -82,6 +82,7 @@ public:
RealType result;
detail::check_scale(function, l_scale, &result, Policy());
detail::check_location(function, l_mean, &result, Policy());
+ detail::check_x_gt0(function, l_mean, &result, Policy());
}
RealType mean()const
@@ -146,6 +147,10 @@ inline RealType pdf(const inverse_gaussian_distribution<RealType, Policy>& dist,
{
return result;
}
+ if(false == detail::check_x_gt0(function, mean, &result, Policy()))
+ {
+ return result;
+ }
if(false == detail::check_positive_x(function, x, &result, Policy()))
{
return result;
@@ -179,6 +184,10 @@ inline RealType cdf(const inverse_gaussian_distribution<RealType, Policy>& dist,
{
return result;
}
+ if (false == detail::check_x_gt0(function, mean, &result, Policy()))
+ {
+ return result;
+ }
if(false == detail::check_positive_x(function, x, &result, Policy()))
{
return result;
@@ -322,6 +331,8 @@ inline RealType quantile(const inverse_gaussian_distribution<RealType, Policy>&
return result;
if(false == detail::check_location(function, mean, &result, Policy()))
return result;
+ if (false == detail::check_x_gt0(function, mean, &result, Policy()))
+ return result;
if(false == detail::check_probability(function, p, &result, Policy()))
return result;
if (p == 0)
@@ -380,6 +391,8 @@ inline RealType cdf(const complemented2_type<inverse_gaussian_distribution<RealT
return result;
if(false == detail::check_location(function, mean, &result, Policy()))
return result;
+ if (false == detail::check_x_gt0(function, mean, &result, Policy()))
+ return result;
if(false == detail::check_positive_x(function, x, &result, Policy()))
return result;
@@ -412,6 +425,8 @@ inline RealType quantile(const complemented2_type<inverse_gaussian_distribution<
return result;
if(false == detail::check_location(function, mean, &result, Policy()))
return result;
+ if (false == detail::check_x_gt0(function, mean, &result, Policy()))
+ return result;
RealType q = c.param;
if(false == detail::check_probability(function, q, &result, Policy()))
return result;
diff --git a/boost/math/distributions/negative_binomial.hpp b/boost/math/distributions/negative_binomial.hpp
index ca5723fa7d..3b4de4062f 100644
--- a/boost/math/distributions/negative_binomial.hpp
+++ b/boost/math/distributions/negative_binomial.hpp
@@ -124,7 +124,7 @@ namespace boost
template <class RealType, class Policy>
inline bool check_dist_and_prob(const char* function, const RealType& r, RealType p, RealType prob, RealType* result, const Policy& pol)
{
- if(check_dist(function, r, p, result, pol) && detail::check_probability(function, prob, result, pol) == false)
+ if((check_dist(function, r, p, result, pol) && detail::check_probability(function, prob, result, pol)) == false)
{
return false;
}
diff --git a/boost/math/distributions/non_central_beta.hpp b/boost/math/distributions/non_central_beta.hpp
index 6e699e509f..aa66ecec0d 100644
--- a/boost/math/distributions/non_central_beta.hpp
+++ b/boost/math/distributions/non_central_beta.hpp
@@ -515,7 +515,11 @@ namespace boost
T non_central_beta_pdf(T a, T b, T lam, T x, T y, const Policy& pol)
{
BOOST_MATH_STD_USING
- using namespace boost::math;
+ //
+ // Special cases:
+ //
+ if((x == 0) || (y == 0))
+ return 0;
//
// Variables come first:
//
diff --git a/boost/math/distributions/non_central_chi_squared.hpp b/boost/math/distributions/non_central_chi_squared.hpp
index 88933c1956..97f87ed4c0 100644
--- a/boost/math/distributions/non_central_chi_squared.hpp
+++ b/boost/math/distributions/non_central_chi_squared.hpp
@@ -73,7 +73,7 @@ namespace boost
//
int k = iround(lambda, pol);
// Forwards and backwards Poisson weights:
- T poisf = boost::math::gamma_p_derivative(1 + k, lambda, pol);
+ T poisf = boost::math::gamma_p_derivative(static_cast<T>(1 + k), lambda, pol);
T poisb = poisf * k / lambda;
// Initial forwards central chi squared term:
T gamf = boost::math::gamma_q(del + k, y, pol);
@@ -225,7 +225,7 @@ namespace boost
// Central chi squared term for backward iteration:
T gamkb = gamkf;
// Forwards Poisson weight:
- T poiskf = gamma_p_derivative(k+1, del, pol);
+ T poiskf = gamma_p_derivative(static_cast<T>(k+1), del, pol);
// Backwards Poisson weight:
T poiskb = poiskf;
// Forwards gamma function recursion term:
@@ -295,7 +295,7 @@ namespace boost
T l2 = lambda / 2;
T sum = 0;
int k = itrunc(l2);
- T pois = gamma_p_derivative(k + 1, l2, pol) * gamma_p_derivative(n2 + k, x2);
+ T pois = gamma_p_derivative(static_cast<T>(k + 1), l2, pol) * gamma_p_derivative(static_cast<T>(n2 + k), x2);
if(pois == 0)
return 0;
T poisb = pois;
@@ -334,7 +334,7 @@ namespace boost
BOOST_MATH_STD_USING
value_type result;
if(l == 0)
- result = cdf(boost::math::chi_squared_distribution<RealType, Policy>(k), x);
+ return invert == false ? cdf(boost::math::chi_squared_distribution<RealType, Policy>(k), x) : cdf(complement(boost::math::chi_squared_distribution<RealType, Policy>(k), x));
else if(x > k + l)
{
// Complement is the smaller of the two:
@@ -442,7 +442,7 @@ namespace boost
// noncentral chi squared", Biometrika 46: 364.
// See also:
// "A comparison of approximations to percentiles of the noncentral chi2-distribution",
- // Hardeo Sahai and Mario Miguel Ojeda, Revista de Matematica: Teoria y Aplicaciones 2003 10(1–2) : 57–76.
+ // Hardeo Sahai and Mario Miguel Ojeda, Revista de Matematica: Teoria y Aplicaciones 2003 10(1-2) : 57-76.
// Note that the latter reference refers to an approximation of the CDF, when they really mean the quantile.
//
value_type b = -(l * l) / (k + 3 * l);
@@ -693,18 +693,18 @@ namespace boost
static RealType find_degrees_of_freedom(RealType lam, RealType x, RealType p)
{
const char* function = "non_central_chi_squared<%1%>::find_degrees_of_freedom";
- typedef typename policies::evaluation<RealType, Policy>::type value_type;
+ typedef typename policies::evaluation<RealType, Policy>::type eval_type;
typedef typename policies::normalise<
Policy,
policies::promote_float<false>,
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- value_type result = detail::find_degrees_of_freedom(
- static_cast<value_type>(lam),
- static_cast<value_type>(x),
- static_cast<value_type>(p),
- static_cast<value_type>(1-p),
+ eval_type result = detail::find_degrees_of_freedom(
+ static_cast<eval_type>(lam),
+ static_cast<eval_type>(x),
+ static_cast<eval_type>(p),
+ static_cast<eval_type>(1-p),
forwarding_policy());
return policies::checked_narrowing_cast<RealType, forwarding_policy>(
result,
@@ -714,18 +714,18 @@ namespace boost
static RealType find_degrees_of_freedom(const complemented3_type<A,B,C>& c)
{
const char* function = "non_central_chi_squared<%1%>::find_degrees_of_freedom";
- typedef typename policies::evaluation<RealType, Policy>::type value_type;
+ typedef typename policies::evaluation<RealType, Policy>::type eval_type;
typedef typename policies::normalise<
Policy,
policies::promote_float<false>,
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- value_type result = detail::find_degrees_of_freedom(
- static_cast<value_type>(c.dist),
- static_cast<value_type>(c.param1),
- static_cast<value_type>(1-c.param2),
- static_cast<value_type>(c.param2),
+ eval_type result = detail::find_degrees_of_freedom(
+ static_cast<eval_type>(c.dist),
+ static_cast<eval_type>(c.param1),
+ static_cast<eval_type>(1-c.param2),
+ static_cast<eval_type>(c.param2),
forwarding_policy());
return policies::checked_narrowing_cast<RealType, forwarding_policy>(
result,
@@ -734,18 +734,18 @@ namespace boost
static RealType find_non_centrality(RealType v, RealType x, RealType p)
{
const char* function = "non_central_chi_squared<%1%>::find_non_centrality";
- typedef typename policies::evaluation<RealType, Policy>::type value_type;
+ typedef typename policies::evaluation<RealType, Policy>::type eval_type;
typedef typename policies::normalise<
Policy,
policies::promote_float<false>,
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- value_type result = detail::find_non_centrality(
- static_cast<value_type>(v),
- static_cast<value_type>(x),
- static_cast<value_type>(p),
- static_cast<value_type>(1-p),
+ eval_type result = detail::find_non_centrality(
+ static_cast<eval_type>(v),
+ static_cast<eval_type>(x),
+ static_cast<eval_type>(p),
+ static_cast<eval_type>(1-p),
forwarding_policy());
return policies::checked_narrowing_cast<RealType, forwarding_policy>(
result,
@@ -755,18 +755,18 @@ namespace boost
static RealType find_non_centrality(const complemented3_type<A,B,C>& c)
{
const char* function = "non_central_chi_squared<%1%>::find_non_centrality";
- typedef typename policies::evaluation<RealType, Policy>::type value_type;
+ typedef typename policies::evaluation<RealType, Policy>::type eval_type;
typedef typename policies::normalise<
Policy,
policies::promote_float<false>,
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- value_type result = detail::find_non_centrality(
- static_cast<value_type>(c.dist),
- static_cast<value_type>(c.param1),
- static_cast<value_type>(1-c.param2),
- static_cast<value_type>(c.param2),
+ eval_type result = detail::find_non_centrality(
+ static_cast<eval_type>(c.dist),
+ static_cast<eval_type>(c.param1),
+ static_cast<eval_type>(1-c.param2),
+ static_cast<eval_type>(c.param2),
forwarding_policy());
return policies::checked_narrowing_cast<RealType, forwarding_policy>(
result,
diff --git a/boost/math/distributions/non_central_t.hpp b/boost/math/distributions/non_central_t.hpp
index df7a58e575..718453b657 100644
--- a/boost/math/distributions/non_central_t.hpp
+++ b/boost/math/distributions/non_central_t.hpp
@@ -90,7 +90,7 @@ namespace boost
betaf -= xtermf;
T term = poisf * betaf;
sum += term;
- if((fabs(last_term) > fabs(term)) && (fabs(term/sum) < errtol))
+ if((fabs(last_term) >= fabs(term)) && (fabs(term/sum) < errtol))
break;
last_term = term;
++count;
@@ -358,7 +358,7 @@ namespace boost
s = boost::math::sign(pzero - q);
if(s != boost::math::sign(guess))
{
- guess = s;
+ guess = static_cast<T>(s);
}
value_type result = detail::generic_quantile(
diff --git a/boost/math/distributions/rayleigh.hpp b/boost/math/distributions/rayleigh.hpp
index 01f38c0b01..744733a9fa 100644
--- a/boost/math/distributions/rayleigh.hpp
+++ b/boost/math/distributions/rayleigh.hpp
@@ -182,7 +182,7 @@ inline RealType cdf(const complemented2_type<rayleigh_distribution<RealType, Pol
RealType ea = x * x / (2 * sigma * sigma);
// Fix for VC11/12 x64 bug in exp(float):
if (ea >= tools::max_value<RealType>())
- return 0;
+ return 0;
result = exp(-ea);
return result;
} // cdf complement
diff --git a/boost/math/distributions/skew_normal.hpp b/boost/math/distributions/skew_normal.hpp
index 98348e59bb..f348347ede 100644
--- a/boost/math/distributions/skew_normal.hpp
+++ b/boost/math/distributions/skew_normal.hpp
@@ -122,15 +122,6 @@ namespace boost{ namespace math{
const RealType shape = dist.shape();
static const char* function = "boost::math::pdf(const skew_normal_distribution<%1%>&, %1%)";
- if((boost::math::isinf)(x))
- {
- return 0; // pdf + and - infinity is zero.
- }
- // Below produces MSVC 4127 warnings, so the above used instead.
- //if(std::numeric_limits<RealType>::has_infinity && abs(x) == std::numeric_limits<RealType>::infinity())
- //{ // pdf + and - infinity is zero.
- // return 0;
- //}
RealType result = 0;
if(false == detail::check_scale(function, scale, &result, Policy()))
@@ -145,6 +136,15 @@ namespace boost{ namespace math{
{
return result;
}
+ if((boost::math::isinf)(x))
+ {
+ return 0; // pdf + and - infinity is zero.
+ }
+ // Below produces MSVC 4127 warnings, so the above used instead.
+ //if(std::numeric_limits<RealType>::has_infinity && abs(x) == std::numeric_limits<RealType>::infinity())
+ //{ // pdf + and - infinity is zero.
+ // return 0;
+ //}
if(false == detail::check_x(function, x, &result, Policy()))
{
return result;
diff --git a/boost/math/distributions/triangular.hpp b/boost/math/distributions/triangular.hpp
index 78ef0df744..1e49a38faf 100644
--- a/boost/math/distributions/triangular.hpp
+++ b/boost/math/distributions/triangular.hpp
@@ -8,6 +8,12 @@
#define BOOST_STATS_TRIANGULAR_HPP
// http://mathworld.wolfram.com/TriangularDistribution.html
+// Note that the 'constructors' defined by Wolfram are difference from those here,
+// for example
+// N[variance[triangulardistribution{1, +2}, 1.5], 50] computes
+// 0.041666666666666666666666666666666666666666666666667
+// TriangularDistribution{1, +2}, 1.5 is the analog of triangular_distribution(1, 1.5, 2)
+
// http://en.wikipedia.org/wiki/Triangular_distribution
#include <boost/math/distributions/fwd.hpp>
@@ -449,7 +455,7 @@ namespace boost{ namespace math
}
RealType lower = dist.lower();
RealType upper = dist.upper();
- if (mode < (upper - lower) / 2)
+ if (mode >= (upper + lower) / 2)
{
return lower + sqrt((upper - lower) * (mode - lower)) / constants::root_two<RealType>();
}
@@ -475,7 +481,9 @@ namespace boost{ namespace math
return result;
}
return root_two<RealType>() * (lower + upper - 2 * mode) * (2 * lower - upper - mode) * (lower - 2 * upper + mode) /
- (5 * pow((lower * lower + upper + upper + mode * mode - lower * upper - lower * mode - upper * mode), RealType(3)/RealType(2)));
+ (5 * pow((lower * lower + upper * upper + mode * mode
+ - lower * upper - lower * mode - upper * mode), RealType(3)/RealType(2)));
+ // #11768: Skewness formula for triangular distribution is incorrect - corrected 29 Oct 2015 for release 1.61.
} // RealType skewness(const triangular_distribution<RealType, Policy>& dist)
template <class RealType, class Policy>
diff --git a/boost/math/distributions/uniform.hpp b/boost/math/distributions/uniform.hpp
index a20597a66a..856c144e36 100644
--- a/boost/math/distributions/uniform.hpp
+++ b/boost/math/distributions/uniform.hpp
@@ -269,15 +269,18 @@ namespace boost{ namespace math
return result;
}
if(false == detail::check_probability("boost::math::quantile(const uniform_distribution<%1%>&, %1%)", q, &result, Policy()))
- if(q == 0)
- {
- return lower;
- }
- if(q == 1)
- {
- return upper;
- }
- return -q * (upper - lower) + upper;
+ {
+ return result;
+ }
+ if(q == 0)
+ {
+ return upper;
+ }
+ if(q == 1)
+ {
+ return lower;
+ }
+ return -q * (upper - lower) + upper;
} // RealType quantile(const complemented2_type<uniform_distribution<RealType, Policy>, RealType>& c)
template <class RealType, class Policy>
diff --git a/boost/math/policies/error_handling.hpp b/boost/math/policies/error_handling.hpp
index 674759006e..285fbea7c4 100644
--- a/boost/math/policies/error_handling.hpp
+++ b/boost/math/policies/error_handling.hpp
@@ -157,11 +157,11 @@ inline T raise_domain_error(
}
template <class T>
-inline T raise_domain_error(
+inline BOOST_MATH_CONSTEXPR T raise_domain_error(
const char* ,
const char* ,
const T& ,
- const ::boost::math::policies::domain_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::domain_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -173,7 +173,7 @@ inline T raise_domain_error(
const char* ,
const char* ,
const T& ,
- const ::boost::math::policies::domain_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::domain_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = EDOM;
// This may or may not do the right thing, but the user asked for the error
@@ -202,21 +202,21 @@ inline T raise_pole_error(
}
template <class T>
-inline T raise_pole_error(
+inline BOOST_MATH_CONSTEXPR T raise_pole_error(
const char* function,
const char* message,
const T& val,
- const ::boost::math::policies::pole_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::pole_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
return ::boost::math::policies::detail::raise_domain_error(function, message, val, ::boost::math::policies::domain_error< ::boost::math::policies::ignore_error>());
}
template <class T>
-inline T raise_pole_error(
+inline BOOST_MATH_CONSTEXPR T raise_pole_error(
const char* function,
const char* message,
const T& val,
- const ::boost::math::policies::pole_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::pole_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
return ::boost::math::policies::detail::raise_domain_error(function, message, val, ::boost::math::policies::domain_error< ::boost::math::policies::errno_on_error>());
}
@@ -256,10 +256,10 @@ inline T raise_overflow_error(
}
template <class T>
-inline T raise_overflow_error(
+inline BOOST_MATH_CONSTEXPR T raise_overflow_error(
const char* ,
const char* ,
- const ::boost::math::policies::overflow_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::overflow_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -267,11 +267,11 @@ inline T raise_overflow_error(
}
template <class T>
-inline T raise_overflow_error(
+inline BOOST_MATH_CONSTEXPR T raise_overflow_error(
const char* ,
const char* ,
const T&,
- const ::boost::math::policies::overflow_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::overflow_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -282,7 +282,7 @@ template <class T>
inline T raise_overflow_error(
const char* ,
const char* ,
- const ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = ERANGE;
// This may or may not do the right thing, but the user asked for the error
@@ -295,7 +295,7 @@ inline T raise_overflow_error(
const char* ,
const char* ,
const T&,
- const ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::overflow_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = ERANGE;
// This may or may not do the right thing, but the user asked for the error
@@ -342,10 +342,10 @@ inline T raise_underflow_error(
}
template <class T>
-inline T raise_underflow_error(
+inline BOOST_MATH_CONSTEXPR T raise_underflow_error(
const char* ,
const char* ,
- const ::boost::math::policies::underflow_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::underflow_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -356,7 +356,7 @@ template <class T>
inline T raise_underflow_error(
const char* /* function */,
const char* /* message */,
- const ::boost::math::policies::underflow_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::underflow_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = ERANGE;
// This may or may not do the right thing, but the user asked for the error
@@ -386,11 +386,11 @@ inline T raise_denorm_error(
}
template <class T>
-inline T raise_denorm_error(
+inline BOOST_MATH_CONSTEXPR T raise_denorm_error(
const char* ,
const char* ,
const T& val,
- const ::boost::math::policies::denorm_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::denorm_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -402,7 +402,7 @@ inline T raise_denorm_error(
const char* ,
const char* ,
const T& val,
- const ::boost::math::policies::denorm_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::denorm_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = ERANGE;
// This may or may not do the right thing, but the user asked for the error
@@ -433,11 +433,11 @@ inline T raise_evaluation_error(
}
template <class T>
-inline T raise_evaluation_error(
+inline BOOST_MATH_CONSTEXPR T raise_evaluation_error(
const char* ,
const char* ,
const T& val,
- const ::boost::math::policies::evaluation_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::evaluation_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -449,7 +449,7 @@ inline T raise_evaluation_error(
const char* ,
const char* ,
const T& val,
- const ::boost::math::policies::evaluation_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::evaluation_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = EDOM;
// This may or may not do the right thing, but the user asked for the error
@@ -481,12 +481,12 @@ inline TargetType raise_rounding_error(
}
template <class T, class TargetType>
-inline TargetType raise_rounding_error(
+inline BOOST_MATH_CONSTEXPR TargetType raise_rounding_error(
const char* ,
const char* ,
const T& val,
const TargetType&,
- const ::boost::math::policies::rounding_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::rounding_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -500,7 +500,7 @@ inline TargetType raise_rounding_error(
const char* ,
const T& val,
const TargetType&,
- const ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error>&)
+ const ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
{
errno = ERANGE;
// This may or may not do the right thing, but the user asked for the error
@@ -509,6 +509,20 @@ inline TargetType raise_rounding_error(
return val > 0 ? (std::numeric_limits<TargetType>::max)() : (std::numeric_limits<TargetType>::is_integer ? (std::numeric_limits<TargetType>::min)() : -(std::numeric_limits<TargetType>::max)());
}
+template <class T>
+inline T raise_rounding_error(
+ const char* ,
+ const char* ,
+ const T& val,
+ const T&,
+ const ::boost::math::policies::rounding_error< ::boost::math::policies::errno_on_error>&) BOOST_MATH_NOEXCEPT(T)
+{
+ errno = ERANGE;
+ // This may or may not do the right thing, but the user asked for the error
+ // to be silent so here we go anyway:
+ return val > 0 ? boost::math::tools::max_value<T>() : -boost::math::tools::max_value<T>();
+}
+
template <class T, class TargetType>
inline TargetType raise_rounding_error(
const char* function,
@@ -534,12 +548,12 @@ inline T raise_indeterminate_result_error(
}
template <class T, class R>
-inline T raise_indeterminate_result_error(
+inline BOOST_MATH_CONSTEXPR T raise_indeterminate_result_error(
const char* ,
const char* ,
const T& ,
const R& result,
- const ::boost::math::policies::indeterminate_result_error< ::boost::math::policies::ignore_error>&)
+ const ::boost::math::policies::indeterminate_result_error< ::boost::math::policies::ignore_error>&) BOOST_MATH_NOEXCEPT(T)
{
// This may or may not do the right thing, but the user asked for the error
// to be ignored so here we go anyway:
@@ -574,7 +588,7 @@ inline T raise_indeterminate_result_error(
} // namespace detail
template <class T, class Policy>
-inline T raise_domain_error(const char* function, const char* message, const T& val, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_domain_error(const char* function, const char* message, const T& val, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::domain_error_type policy_type;
return detail::raise_domain_error(
@@ -583,7 +597,7 @@ inline T raise_domain_error(const char* function, const char* message, const T&
}
template <class T, class Policy>
-inline T raise_pole_error(const char* function, const char* message, const T& val, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_pole_error(const char* function, const char* message, const T& val, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::pole_error_type policy_type;
return detail::raise_pole_error(
@@ -592,7 +606,7 @@ inline T raise_pole_error(const char* function, const char* message, const T& va
}
template <class T, class Policy>
-inline T raise_overflow_error(const char* function, const char* message, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_overflow_error(const char* function, const char* message, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::overflow_error_type policy_type;
return detail::raise_overflow_error<T>(
@@ -601,7 +615,7 @@ inline T raise_overflow_error(const char* function, const char* message, const P
}
template <class T, class Policy>
-inline T raise_overflow_error(const char* function, const char* message, const T& val, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_overflow_error(const char* function, const char* message, const T& val, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::overflow_error_type policy_type;
return detail::raise_overflow_error(
@@ -610,7 +624,7 @@ inline T raise_overflow_error(const char* function, const char* message, const T
}
template <class T, class Policy>
-inline T raise_underflow_error(const char* function, const char* message, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_underflow_error(const char* function, const char* message, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::underflow_error_type policy_type;
return detail::raise_underflow_error<T>(
@@ -619,7 +633,7 @@ inline T raise_underflow_error(const char* function, const char* message, const
}
template <class T, class Policy>
-inline T raise_denorm_error(const char* function, const char* message, const T& val, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_denorm_error(const char* function, const char* message, const T& val, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::denorm_error_type policy_type;
return detail::raise_denorm_error<T>(
@@ -629,7 +643,7 @@ inline T raise_denorm_error(const char* function, const char* message, const T&
}
template <class T, class Policy>
-inline T raise_evaluation_error(const char* function, const char* message, const T& val, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_evaluation_error(const char* function, const char* message, const T& val, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::evaluation_error_type policy_type;
return detail::raise_evaluation_error(
@@ -638,7 +652,7 @@ inline T raise_evaluation_error(const char* function, const char* message, const
}
template <class T, class TargetType, class Policy>
-inline TargetType raise_rounding_error(const char* function, const char* message, const T& val, const TargetType& t, const Policy&)
+inline BOOST_MATH_CONSTEXPR TargetType raise_rounding_error(const char* function, const char* message, const T& val, const TargetType& t, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::rounding_error_type policy_type;
return detail::raise_rounding_error(
@@ -647,7 +661,7 @@ inline TargetType raise_rounding_error(const char* function, const char* message
}
template <class T, class R, class Policy>
-inline T raise_indeterminate_result_error(const char* function, const char* message, const T& val, const R& result, const Policy&)
+inline BOOST_MATH_CONSTEXPR T raise_indeterminate_result_error(const char* function, const char* message, const T& val, const R& result, const Policy&) BOOST_NOEXCEPT_IF(is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T))
{
typedef typename Policy::indeterminate_result_error_type policy_type;
return detail::raise_indeterminate_result_error(
@@ -662,7 +676,7 @@ namespace detail
{
template <class R, class T, class Policy>
-inline bool check_overflow(T val, R* result, const char* function, const Policy& pol)
+inline bool check_overflow(T val, R* result, const char* function, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && (Policy::value != throw_on_error) && (Policy::value != user_error))
{
BOOST_MATH_STD_USING
if(fabs(val) > tools::max_value<R>())
@@ -674,7 +688,7 @@ inline bool check_overflow(T val, R* result, const char* function, const Policy&
return false;
}
template <class R, class T, class Policy>
-inline bool check_overflow(std::complex<T> val, R* result, const char* function, const Policy& pol)
+inline bool check_overflow(std::complex<T> val, R* result, const char* function, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && (Policy::value != throw_on_error) && (Policy::value != user_error))
{
typedef typename R::value_type r_type;
r_type re, im;
@@ -684,7 +698,7 @@ inline bool check_overflow(std::complex<T> val, R* result, const char* function,
return r;
}
template <class R, class T, class Policy>
-inline bool check_underflow(T val, R* result, const char* function, const Policy& pol)
+inline bool check_underflow(T val, R* result, const char* function, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && (Policy::value != throw_on_error) && (Policy::value != user_error))
{
if((val != 0) && (static_cast<R>(val) == 0))
{
@@ -694,7 +708,7 @@ inline bool check_underflow(T val, R* result, const char* function, const Policy
return false;
}
template <class R, class T, class Policy>
-inline bool check_underflow(std::complex<T> val, R* result, const char* function, const Policy& pol)
+inline bool check_underflow(std::complex<T> val, R* result, const char* function, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && (Policy::value != throw_on_error) && (Policy::value != user_error))
{
typedef typename R::value_type r_type;
r_type re, im;
@@ -704,7 +718,7 @@ inline bool check_underflow(std::complex<T> val, R* result, const char* function
return r;
}
template <class R, class T, class Policy>
-inline bool check_denorm(T val, R* result, const char* function, const Policy& pol)
+inline bool check_denorm(T val, R* result, const char* function, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && (Policy::value != throw_on_error) && (Policy::value != user_error))
{
BOOST_MATH_STD_USING
if((fabs(val) < static_cast<T>(tools::min_value<R>())) && (static_cast<R>(val) != 0))
@@ -715,7 +729,7 @@ inline bool check_denorm(T val, R* result, const char* function, const Policy& p
return false;
}
template <class R, class T, class Policy>
-inline bool check_denorm(std::complex<T> val, R* result, const char* function, const Policy& pol)
+inline bool check_denorm(std::complex<T> val, R* result, const char* function, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && (Policy::value != throw_on_error) && (Policy::value != user_error))
{
typedef typename R::value_type r_type;
r_type re, im;
@@ -727,22 +741,28 @@ inline bool check_denorm(std::complex<T> val, R* result, const char* function, c
// Default instantiations with ignore_error policy.
template <class R, class T>
-inline bool check_overflow(T /* val */, R* /* result */, const char* /* function */, const overflow_error<ignore_error>&){ return false; }
+inline BOOST_MATH_CONSTEXPR bool check_overflow(T /* val */, R* /* result */, const char* /* function */, const overflow_error<ignore_error>&) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T))
+{ return false; }
template <class R, class T>
-inline bool check_overflow(std::complex<T> /* val */, R* /* result */, const char* /* function */, const overflow_error<ignore_error>&){ return false; }
+inline BOOST_MATH_CONSTEXPR bool check_overflow(std::complex<T> /* val */, R* /* result */, const char* /* function */, const overflow_error<ignore_error>&) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T))
+{ return false; }
template <class R, class T>
-inline bool check_underflow(T /* val */, R* /* result */, const char* /* function */, const underflow_error<ignore_error>&){ return false; }
+inline BOOST_MATH_CONSTEXPR bool check_underflow(T /* val */, R* /* result */, const char* /* function */, const underflow_error<ignore_error>&) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T))
+{ return false; }
template <class R, class T>
-inline bool check_underflow(std::complex<T> /* val */, R* /* result */, const char* /* function */, const underflow_error<ignore_error>&){ return false; }
+inline BOOST_MATH_CONSTEXPR bool check_underflow(std::complex<T> /* val */, R* /* result */, const char* /* function */, const underflow_error<ignore_error>&) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T))
+{ return false; }
template <class R, class T>
-inline bool check_denorm(T /* val */, R* /* result*/, const char* /* function */, const denorm_error<ignore_error>&){ return false; }
+inline BOOST_MATH_CONSTEXPR bool check_denorm(T /* val */, R* /* result*/, const char* /* function */, const denorm_error<ignore_error>&) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T))
+{ return false; }
template <class R, class T>
-inline bool check_denorm(std::complex<T> /* val */, R* /* result*/, const char* /* function */, const denorm_error<ignore_error>&){ return false; }
+inline BOOST_MATH_CONSTEXPR bool check_denorm(std::complex<T> /* val */, R* /* result*/, const char* /* function */, const denorm_error<ignore_error>&) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T))
+{ return false; }
} // namespace detail
template <class R, class Policy, class T>
-inline R checked_narrowing_cast(T val, const char* function)
+inline R checked_narrowing_cast(T val, const char* function) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(R) && BOOST_MATH_IS_FLOAT(T) && is_noexcept_error_policy<Policy>::value)
{
typedef typename Policy::overflow_error_type overflow_type;
typedef typename Policy::underflow_error_type underflow_type;
@@ -762,7 +782,7 @@ inline R checked_narrowing_cast(T val, const char* function)
}
template <class T, class Policy>
-inline void check_series_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol)
+inline void check_series_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && is_noexcept_error_policy<Policy>::value)
{
if(max_iter >= policies::get_max_series_iterations<Policy>())
raise_evaluation_error<T>(
@@ -771,7 +791,7 @@ inline void check_series_iterations(const char* function, boost::uintmax_t max_i
}
template <class T, class Policy>
-inline void check_root_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol)
+inline void check_root_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && is_noexcept_error_policy<Policy>::value)
{
if(max_iter >= policies::get_max_root_iterations<Policy>())
raise_evaluation_error<T>(
@@ -788,7 +808,7 @@ namespace detail{
// that value usually comes from one of the error handlers above:
//
template <class T>
-std::pair<T, T> pair_from_single(const T& val)
+std::pair<T, T> pair_from_single(const T& val) BOOST_MATH_NOEXCEPT(T)
{
return std::make_pair(val, val);
}
diff --git a/boost/math/policies/policy.hpp b/boost/math/policies/policy.hpp
index 71309fa116..de813fb8aa 100644
--- a/boost/math/policies/policy.hpp
+++ b/boost/math/policies/policy.hpp
@@ -33,9 +33,9 @@ namespace boost{ namespace math{
namespace tools{
template <class T>
-int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T));
+BOOST_MATH_CONSTEXPR int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_NOEXCEPT;
template <class T>
-T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T));
+BOOST_MATH_CONSTEXPR T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T);
}
@@ -44,6 +44,28 @@ namespace policies{
//
// Define macros for our default policies, if they're not defined already:
//
+// Special cases for exceptions disabled first:
+//
+#ifdef BOOST_NO_EXCEPTIONS
+# ifndef BOOST_MATH_DOMAIN_ERROR_POLICY
+# define BOOST_MATH_DOMAIN_ERROR_POLICY errno_on_error
+# endif
+# ifndef BOOST_MATH_POLE_ERROR_POLICY
+# define BOOST_MATH_POLE_ERROR_POLICY errno_on_error
+# endif
+# ifndef BOOST_MATH_OVERFLOW_ERROR_POLICY
+# define BOOST_MATH_OVERFLOW_ERROR_POLICY errno_on_error
+# endif
+# ifndef BOOST_MATH_EVALUATION_ERROR_POLICY
+# define BOOST_MATH_EVALUATION_ERROR_POLICY errno_on_error
+# endif
+# ifndef BOOST_MATH_ROUNDING_ERROR_POLICY
+# define BOOST_MATH_ROUNDING_ERROR_POLICY errno_on_error
+# endif
+#endif
+//
+// Then the regular cases:
+//
#ifndef BOOST_MATH_DOMAIN_ERROR_POLICY
#define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error
#endif
@@ -622,81 +644,81 @@ struct normalise<policy<detail::forwarding_arg1, detail::forwarding_arg2>,
typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
};
-inline policy<> make_policy()
+inline BOOST_MATH_CONSTEXPR policy<> make_policy() BOOST_NOEXCEPT
{ return policy<>(); }
template <class A1>
-inline typename normalise<policy<>, A1>::type make_policy(const A1&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1>::type make_policy(const A1&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1>::type result_type;
return result_type();
}
template <class A1, class A2>
-inline typename normalise<policy<>, A1, A2>::type make_policy(const A1&, const A2&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2>::type make_policy(const A1&, const A2&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2>::type result_type;
return result_type();
}
template <class A1, class A2, class A3>
-inline typename normalise<policy<>, A1, A2, A3>::type make_policy(const A1&, const A2&, const A3&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3>::type make_policy(const A1&, const A2&, const A3&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4>
-inline typename normalise<policy<>, A1, A2, A3, A4>::type make_policy(const A1&, const A2&, const A3&, const A4&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4>::type make_policy(const A1&, const A2&, const A3&, const A4&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5, class A6>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type result_type;
return result_type();
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
-inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&, const A11&)
+inline BOOST_MATH_CONSTEXPR typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&, const A7&, const A8&, const A9&, const A10&, const A11&) BOOST_NOEXCEPT
{
typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type result_type;
return result_type();
@@ -825,7 +847,7 @@ struct precision<BOOST_MATH_FLOAT128_TYPE, Policy>
namespace detail{
template <class T, class Policy>
-inline int digits_imp(mpl::true_ const&)
+inline BOOST_MATH_CONSTEXPR int digits_imp(mpl::true_ const&) BOOST_NOEXCEPT
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
@@ -837,7 +859,7 @@ inline int digits_imp(mpl::true_ const&)
}
template <class T, class Policy>
-inline int digits_imp(mpl::false_ const&)
+inline BOOST_MATH_CONSTEXPR int digits_imp(mpl::false_ const&) BOOST_NOEXCEPT
{
return tools::digits<T>();
}
@@ -845,26 +867,26 @@ inline int digits_imp(mpl::false_ const&)
} // namespace detail
template <class T, class Policy>
-inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_NOEXCEPT
{
typedef mpl::bool_< std::numeric_limits<T>::is_specialized > tag_type;
return detail::digits_imp<T, Policy>(tag_type());
}
template <class T, class Policy>
-inline int digits_base10(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR int digits_base10(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_NOEXCEPT
{
return boost::math::policies::digits<T, Policy>() * 301 / 1000L;
}
template <class Policy>
-inline unsigned long get_max_series_iterations()
+inline BOOST_MATH_CONSTEXPR unsigned long get_max_series_iterations() BOOST_NOEXCEPT
{
typedef typename Policy::max_series_iterations_type iter_type;
return iter_type::value;
}
template <class Policy>
-inline unsigned long get_max_root_iterations()
+inline BOOST_MATH_CONSTEXPR unsigned long get_max_root_iterations() BOOST_NOEXCEPT
{
typedef typename Policy::max_root_iterations_type iter_type;
return iter_type::value;
@@ -875,7 +897,7 @@ namespace detail{
template <class T, class Digits, class Small, class Default>
struct series_factor_calc
{
- static T get()
+ static T get() BOOST_MATH_NOEXCEPT(T)
{
return ldexp(T(1.0), 1 - Digits::value);
}
@@ -884,7 +906,7 @@ struct series_factor_calc
template <class T, class Digits>
struct series_factor_calc<T, Digits, mpl::true_, mpl::true_>
{
- static T get()
+ static BOOST_MATH_CONSTEXPR T get() BOOST_MATH_NOEXCEPT(T)
{
return boost::math::tools::epsilon<T>();
}
@@ -892,23 +914,24 @@ struct series_factor_calc<T, Digits, mpl::true_, mpl::true_>
template <class T, class Digits>
struct series_factor_calc<T, Digits, mpl::true_, mpl::false_>
{
- static T get()
+ BOOST_STATIC_CONSTANT(boost::uintmax_t, v = static_cast<boost::uintmax_t>(1u) << (Digits::value - 1));
+
+ static BOOST_MATH_CONSTEXPR T get() BOOST_MATH_NOEXCEPT(T)
{
- static const boost::uintmax_t v = static_cast<boost::uintmax_t>(1u) << (Digits::value - 1);
return 1 / static_cast<T>(v);
}
};
template <class T, class Digits>
struct series_factor_calc<T, Digits, mpl::false_, mpl::true_>
{
- static T get()
+ static BOOST_MATH_CONSTEXPR T get() BOOST_MATH_NOEXCEPT(T)
{
return boost::math::tools::epsilon<T>();
}
};
template <class T, class Policy>
-inline T get_epsilon_imp(mpl::true_ const&)
+inline BOOST_MATH_CONSTEXPR T get_epsilon_imp(mpl::true_ const&) BOOST_MATH_NOEXCEPT(T)
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
@@ -924,7 +947,7 @@ inline T get_epsilon_imp(mpl::true_ const&)
}
template <class T, class Policy>
-inline T get_epsilon_imp(mpl::false_ const&)
+inline BOOST_MATH_CONSTEXPR T get_epsilon_imp(mpl::false_ const&) BOOST_MATH_NOEXCEPT(T)
{
return tools::epsilon<T>();
}
@@ -932,7 +955,7 @@ inline T get_epsilon_imp(mpl::false_ const&)
} // namespace detail
template <class T, class Policy>
-inline T get_epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T get_epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
typedef mpl::bool_< (std::numeric_limits<T>::is_specialized && (std::numeric_limits<T>::radix == 2)) > tag_type;
return detail::get_epsilon_imp<T, Policy>(tag_type());
@@ -973,7 +996,7 @@ struct constructor_error_check
{
typedef typename Policy::domain_error_type domain_error_type;
typedef typename mpl::if_c<
- (domain_error_type::value == throw_on_error) || (domain_error_type::value == user_error),
+ (domain_error_type::value == throw_on_error) || (domain_error_type::value == user_error) || (domain_error_type::value == errno_on_error),
mpl::true_,
mpl::false_>::type type;
};
@@ -987,10 +1010,33 @@ struct method_error_check
mpl::false_,
mpl::true_>::type type;
};
+//
+// Does the Policy ever throw on error?
+//
+template <class Policy>
+struct is_noexcept_error_policy
+{
+ typedef typename Policy::domain_error_type t1;
+ typedef typename Policy::pole_error_type t2;
+ typedef typename Policy::overflow_error_type t3;
+ typedef typename Policy::underflow_error_type t4;
+ typedef typename Policy::denorm_error_type t5;
+ typedef typename Policy::evaluation_error_type t6;
+ typedef typename Policy::rounding_error_type t7;
+ typedef typename Policy::indeterminate_result_error_type t8;
+
+ BOOST_STATIC_CONSTANT(bool, value =
+ ((t1::value != throw_on_error) && (t1::value != user_error)
+ && (t2::value != throw_on_error) && (t2::value != user_error)
+ && (t3::value != throw_on_error) && (t3::value != user_error)
+ && (t4::value != throw_on_error) && (t4::value != user_error)
+ && (t5::value != throw_on_error) && (t5::value != user_error)
+ && (t6::value != throw_on_error) && (t6::value != user_error)
+ && (t7::value != throw_on_error) && (t7::value != user_error)
+ && (t8::value != throw_on_error) && (t8::value != user_error)));
+};
}}} // namespaces
#endif // BOOST_MATH_POLICY_HPP
-
-
diff --git a/boost/math/special_functions.hpp b/boost/math/special_functions.hpp
index 52e412ed8b..367701c2a9 100644
--- a/boost/math/special_functions.hpp
+++ b/boost/math/special_functions.hpp
@@ -67,5 +67,7 @@
#include <boost/math/special_functions/next.hpp>
#include <boost/math/special_functions/owens_t.hpp>
#include <boost/math/special_functions/hankel.hpp>
+#include <boost/math/special_functions/ulp.hpp>
+#include <boost/math/special_functions/relative_difference.hpp>
#endif // BOOST_MATH_SPECIAL_FUNCTIONS_HPP
diff --git a/boost/math/special_functions/bernoulli.hpp b/boost/math/special_functions/bernoulli.hpp
index 5f2b7e1422..e5323fbd42 100644
--- a/boost/math/special_functions/bernoulli.hpp
+++ b/boost/math/special_functions/bernoulli.hpp
@@ -63,7 +63,7 @@ inline T bernoulli_b2n(const int i, const Policy &pol)
if(i < 0)
return policies::raise_domain_error<T>("boost::math::bernoulli_b2n<%1%>", "Index should be >= 0 but got %1%", T(i), pol);
- T result = 0; // The = 0 is just to silence compiler warings :-(
+ T result = static_cast<T>(0); // The = 0 is just to silence compiler warnings :-(
boost::math::detail::bernoulli_number_imp<T>(&result, static_cast<std::size_t>(i), 1u, pol, tag_type());
return result;
}
diff --git a/boost/math/special_functions/bessel.hpp b/boost/math/special_functions/bessel.hpp
index eab723d8ba..1b57e0a873 100644
--- a/boost/math/special_functions/bessel.hpp
+++ b/boost/math/special_functions/bessel.hpp
@@ -302,20 +302,9 @@ inline T cyl_neumann_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& po
if(floor(v) == v)
{
- if(asymptotic_bessel_large_x_limit(v, x))
- {
- T r = asymptotic_bessel_y_large_x_2(static_cast<T>(abs(v)), x);
- if((v < 0) && (itrunc(v, pol) & 1))
- r = -r;
- BOOST_MATH_INSTRUMENT_VARIABLE(r);
- return r;
- }
- else
- {
- T r = bessel_yn(itrunc(v, pol), x, pol);
- BOOST_MATH_INSTRUMENT_VARIABLE(r);
- return r;
- }
+ T r = bessel_yn(itrunc(v, pol), x, pol);
+ BOOST_MATH_INSTRUMENT_VARIABLE(r);
+ return r;
}
T r = cyl_neumann_imp<T>(v, x, bessel_no_int_tag(), pol);
BOOST_MATH_INSTRUMENT_VARIABLE(r);
@@ -325,20 +314,7 @@ inline T cyl_neumann_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& po
template <class T, class Policy>
inline T cyl_neumann_imp(int v, T x, const bessel_int_tag&, const Policy& pol)
{
- BOOST_MATH_STD_USING
-
- BOOST_MATH_INSTRUMENT_VARIABLE(v);
- BOOST_MATH_INSTRUMENT_VARIABLE(x);
-
- if(asymptotic_bessel_large_x_limit(T(v), x))
- {
- T r = asymptotic_bessel_y_large_x_2(static_cast<T>(abs(v)), x);
- if((v < 0) && (v & 1))
- r = -r;
- return r;
- }
- else
- return bessel_yn(v, x, pol);
+ return bessel_yn(v, x, pol);
}
template <class T, class Policy>
@@ -582,7 +558,7 @@ inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i(
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i<%1%>(%1%,%1%)");
+ return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_imp<value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i<%1%>(%1%,%1%)");
}
template <class T1, class T2>
diff --git a/boost/math/special_functions/bessel_prime.hpp b/boost/math/special_functions/bessel_prime.hpp
index c5f2d58c2b..2a09b2046b 100644
--- a/boost/math/special_functions/bessel_prime.hpp
+++ b/boost/math/special_functions/bessel_prime.hpp
@@ -237,7 +237,7 @@ inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_j_
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_j_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_j_prime<%1%,%1%>(%1%,%1%)");
+ return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_j_prime_imp<tag_type, value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_j_prime<%1%,%1%>(%1%,%1%)");
}
template <class T1, class T2>
@@ -279,7 +279,7 @@ inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_i_
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_prime_imp<value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i_prime<%1%>(%1%,%1%)");
+ return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_i_prime_imp<value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_i_prime<%1%>(%1%,%1%)");
}
template <class T1, class T2>
@@ -301,7 +301,7 @@ inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_bessel_k_
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_k_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_k_prime<%1%,%1%>(%1%,%1%)");
+ return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_bessel_k_prime_imp<tag_type, value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_bessel_k_prime<%1%,%1%>(%1%,%1%)");
}
template <class T1, class T2>
@@ -323,7 +323,7 @@ inline typename detail::bessel_traits<T1, T2, Policy>::result_type cyl_neumann_p
policies::promote_double<false>,
policies::discrete_quantile<>,
policies::assert_undefined<> >::type forwarding_policy;
- return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_neumann_prime_imp<tag_type, value_type>(v, static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_neumann_prime<%1%,%1%>(%1%,%1%)");
+ return policies::checked_narrowing_cast<result_type, Policy>(detail::cyl_neumann_prime_imp<tag_type, value_type>(static_cast<value_type>(v), static_cast<value_type>(x), forwarding_policy()), "boost::math::cyl_neumann_prime<%1%,%1%>(%1%,%1%)");
}
template <class T1, class T2>
diff --git a/boost/math/special_functions/beta.hpp b/boost/math/special_functions/beta.hpp
index 98d8f7fa80..35b114ef15 100644
--- a/boost/math/special_functions/beta.hpp
+++ b/boost/math/special_functions/beta.hpp
@@ -47,13 +47,19 @@ T beta_imp(T a, T b, const Lanczos&, const Policy& pol)
// Special cases:
if((c == a) && (b < tools::epsilon<T>()))
- return boost::math::tgamma(b, pol);
+ return 1 / b;
else if((c == b) && (a < tools::epsilon<T>()))
- return boost::math::tgamma(a, pol);
+ return 1 / a;
if(b == 1)
return 1/a;
else if(a == 1)
return 1/b;
+ else if(c < tools::epsilon<T>())
+ {
+ result = c / a;
+ result /= b;
+ return result;
+ }
/*
//
@@ -82,11 +88,11 @@ T beta_imp(T a, T b, const Lanczos&, const Policy& pol)
std::swap(a, b);
// Lanczos calculation:
- T agh = a + Lanczos::g() - T(0.5);
- T bgh = b + Lanczos::g() - T(0.5);
- T cgh = c + Lanczos::g() - T(0.5);
- result = Lanczos::lanczos_sum_expG_scaled(a) * Lanczos::lanczos_sum_expG_scaled(b) / Lanczos::lanczos_sum_expG_scaled(c);
- T ambh = a - T(0.5) - b;
+ T agh = static_cast<T>(a + Lanczos::g() - 0.5f);
+ T bgh = static_cast<T>(b + Lanczos::g() - 0.5f);
+ T cgh = static_cast<T>(c + Lanczos::g() - 0.5f);
+ result = Lanczos::lanczos_sum_expG_scaled(a) * (Lanczos::lanczos_sum_expG_scaled(b) / Lanczos::lanczos_sum_expG_scaled(c));
+ T ambh = a - 0.5f - b;
if((fabs(b * ambh) < (cgh * 100)) && (a > 100))
{
// Special case where the base of the power term is close to 1
@@ -199,7 +205,9 @@ T ibeta_power_terms(T a,
T y,
const Lanczos&,
bool normalised,
- const Policy& pol)
+ const Policy& pol,
+ T prefix = 1,
+ const char* function = "boost::math::ibeta<%1%>(%1%, %1%, %1%)")
{
BOOST_MATH_STD_USING
@@ -211,14 +219,17 @@ T ibeta_power_terms(T a,
T result;
- T prefix = 1;
T c = a + b;
// combine power terms with Lanczos approximation:
- T agh = a + Lanczos::g() - T(0.5);
- T bgh = b + Lanczos::g() - T(0.5);
- T cgh = c + Lanczos::g() - T(0.5);
+ T agh = static_cast<T>(a + Lanczos::g() - 0.5f);
+ T bgh = static_cast<T>(b + Lanczos::g() - 0.5f);
+ T cgh = static_cast<T>(c + Lanczos::g() - 0.5f);
result = Lanczos::lanczos_sum_expG_scaled(c) / (Lanczos::lanczos_sum_expG_scaled(a) * Lanczos::lanczos_sum_expG_scaled(b));
+ result *= prefix;
+ // combine with the leftover terms from the Lanczos approximation:
+ result *= sqrt(bgh / boost::math::constants::e<T>());
+ result *= sqrt(agh / cgh);
// l1 and l2 are the base of the exponents minus one:
T l1 = (x * b - y * agh) / agh;
@@ -308,7 +319,15 @@ T ibeta_power_terms(T a,
// First base near 1 only:
T l = a * boost::math::log1p(l1, pol)
+ b * log((y * cgh) / bgh);
- result *= exp(l);
+ if((l <= tools::log_min_value<T>()) || (l >= tools::log_max_value<T>()))
+ {
+ l += log(result);
+ if(l >= tools::log_max_value<T>())
+ return policies::raise_overflow_error<T>(function, 0, pol);
+ result = exp(l);
+ }
+ else
+ result *= exp(l);
BOOST_MATH_INSTRUMENT_VARIABLE(result);
}
else
@@ -316,7 +335,15 @@ T ibeta_power_terms(T a,
// Second base near 1 only:
T l = b * boost::math::log1p(l2, pol)
+ a * log((x * cgh) / agh);
- result *= exp(l);
+ if((l <= tools::log_min_value<T>()) || (l >= tools::log_max_value<T>()))
+ {
+ l += log(result);
+ if(l >= tools::log_max_value<T>())
+ return policies::raise_overflow_error<T>(function, 0, pol);
+ result = exp(l);
+ }
+ else
+ result *= exp(l);
BOOST_MATH_INSTRUMENT_VARIABLE(result);
}
}
@@ -337,11 +364,41 @@ T ibeta_power_terms(T a,
|| (l2 <= tools::log_min_value<T>())
)
{
- // Oops, overflow, sidestep:
+ // Oops, under/overflow, sidestep if we can:
if(a < b)
- result *= pow(pow(b2, b/a) * b1, a);
+ {
+ T p1 = pow(b2, b / a);
+ T l3 = a * (log(b1) + log(p1));
+ if((l3 < tools::log_max_value<T>())
+ && (l3 > tools::log_min_value<T>()))
+ {
+ result *= pow(p1 * b1, a);
+ }
+ else
+ {
+ l2 += l1 + log(result);
+ if(l2 >= tools::log_max_value<T>())
+ return policies::raise_overflow_error<T>(function, 0, pol);
+ result = exp(l2);
+ }
+ }
else
- result *= pow(pow(b1, a/b) * b2, b);
+ {
+ T p1 = pow(b1, a / b);
+ T l3 = (log(p1) + log(b2)) * b;
+ if((l3 < tools::log_max_value<T>())
+ && (l3 > tools::log_min_value<T>()))
+ {
+ result *= pow(p1 * b2, b);
+ }
+ else
+ {
+ l2 += l1 + log(result);
+ if(l2 >= tools::log_max_value<T>())
+ return policies::raise_overflow_error<T>(function, 0, pol);
+ result = exp(l2);
+ }
+ }
BOOST_MATH_INSTRUMENT_VARIABLE(result);
}
else
@@ -351,10 +408,6 @@ T ibeta_power_terms(T a,
BOOST_MATH_INSTRUMENT_VARIABLE(result);
}
}
- // combine with the leftover terms from the Lanczos approximation:
- result *= sqrt(bgh / boost::math::constants::e<T>());
- result *= sqrt(agh / cgh);
- result *= prefix;
BOOST_MATH_INSTRUMENT_VARIABLE(result);
@@ -380,7 +433,9 @@ T ibeta_power_terms(T a,
T y,
const boost::math::lanczos::undefined_lanczos&,
bool normalised,
- const Policy& pol)
+ const Policy& pol,
+ T prefix = 1,
+ const char* = "boost::math::ibeta<%1%>(%1%, %1%, %1%)")
{
BOOST_MATH_STD_USING
@@ -411,7 +466,7 @@ T ibeta_power_terms(T a,
T b1 = (x * lc) / la;
T b2 = (y * lc) / lb;
- T e1 = lc - la - lb;
+ T e1 = -5; // lc - la - lb;
T lb1 = a * log(b1);
T lb2 = b * log(b2);
@@ -423,21 +478,23 @@ T ibeta_power_terms(T a,
|| (e1 <= tools::log_min_value<T>())
)
{
- result = exp(lb1 + lb2 - e1);
+ result = exp(lb1 + lb2 - e1 + log(prefix));
}
else
{
T p1, p2;
- if((fabs(b1 - 1) * a < 10) && (a > 1))
- p1 = exp(a * boost::math::log1p((x * b - y * la) / la, pol));
+ p1 = (x * b - y * la) / la;
+ if(fabs(p1) < 0.5f)
+ p1 = exp(a * boost::math::log1p(p1, pol));
else
p1 = pow(b1, a);
- if((fabs(b2 - 1) * b < 10) && (b > 1))
- p2 = exp(b * boost::math::log1p((y * a - x * lb) / lb, pol));
+ p2 = (y * a - x * lb) / lb;
+ if(fabs(p2) < 0.5f)
+ p2 = exp(b * boost::math::log1p(p2, pol));
else
p2 = pow(b2, b);
T p3 = exp(e1);
- result = p1 * p2 / p3;
+ result = prefix * p1 * (p2 / p3);
}
// and combine with the remaining gamma function components:
result /= sa * sb / sc;
@@ -480,21 +537,43 @@ T ibeta_series(T a, T b, T x, T s0, const Lanczos&, bool normalised, T* p_deriva
T c = a + b;
// incomplete beta power term, combined with the Lanczos approximation:
- T agh = a + Lanczos::g() - T(0.5);
- T bgh = b + Lanczos::g() - T(0.5);
- T cgh = c + Lanczos::g() - T(0.5);
+ T agh = static_cast<T>(a + Lanczos::g() - 0.5f);
+ T bgh = static_cast<T>(b + Lanczos::g() - 0.5f);
+ T cgh = static_cast<T>(c + Lanczos::g() - 0.5f);
result = Lanczos::lanczos_sum_expG_scaled(c) / (Lanczos::lanczos_sum_expG_scaled(a) * Lanczos::lanczos_sum_expG_scaled(b));
- if(a * b < bgh * 10)
- result *= exp((b - 0.5f) * boost::math::log1p(a / bgh, pol));
- else
- result *= pow(cgh / bgh, b - 0.5f);
- result *= pow(x * cgh / agh, a);
- result *= sqrt(agh / boost::math::constants::e<T>());
- if(p_derivative)
+ T l1 = log(cgh / bgh) * (b - 0.5f);
+ T l2 = log(x * cgh / agh) * a;
+ //
+ // Check for over/underflow in the power terms:
+ //
+ if((l1 > tools::log_min_value<T>())
+ && (l1 < tools::log_max_value<T>())
+ && (l2 > tools::log_min_value<T>())
+ && (l2 < tools::log_max_value<T>()))
{
- *p_derivative = result * pow(y, b);
- BOOST_ASSERT(*p_derivative >= 0);
+ if(a * b < bgh * 10)
+ result *= exp((b - 0.5f) * boost::math::log1p(a / bgh, pol));
+ else
+ result *= pow(cgh / bgh, b - 0.5f);
+ result *= pow(x * cgh / agh, a);
+ result *= sqrt(agh / boost::math::constants::e<T>());
+
+ if(p_derivative)
+ {
+ *p_derivative = result * pow(y, b);
+ BOOST_ASSERT(*p_derivative >= 0);
+ }
+ }
+ else
+ {
+ //
+ // Oh dear, we need logs, and this *will* cancel:
+ //
+ result = log(result) + l1 + l2 + (log(agh) - 1) / 2;
+ if(p_derivative)
+ *p_derivative = exp(result + b * log(y));
+ result = exp(result);
}
}
else
@@ -606,7 +685,7 @@ struct ibeta_fraction2_t
T denom = (a + 2 * m - 1);
aN /= denom * denom;
- T bN = m;
+ T bN = static_cast<T>(m);
bN += (m * (b - m) * x) / (a + 2*m - 1);
bN += ((a + m) * (a * y - b * x + 1 + m *(2 - x))) / (a + 2*m + 1);
@@ -943,12 +1022,12 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
if(b == 0)
return policies::raise_domain_error<T>(function, "The arguments a and b to the incomplete beta function cannot both be zero, with x=%1%.", x, pol);
if(b > 0)
- return inv ? 0 : 1;
+ return static_cast<T>(inv ? 0 : 1);
}
else if(b == 0)
{
if(a > 0)
- return inv ? 1 : 0;
+ return static_cast<T>(inv ? 1 : 0);
}
}
else
@@ -1200,7 +1279,7 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
if(b < 40)
{
- if((floor(a) == a) && (floor(b) == b) && (a < (std::numeric_limits<int>::max)() - 100))
+ if((floor(a) == a) && (floor(b) == b) && (a < (std::numeric_limits<int>::max)() - 100) && (y != 1))
{
// relate to the binomial distribution and use a finite sum:
T k = a - 1;
@@ -1342,20 +1421,8 @@ T ibeta_derivative_imp(T a, T b, T x, const Policy& pol)
// Now the regular cases:
//
typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
- T f1 = ibeta_power_terms<T>(a, b, x, 1 - x, lanczos_type(), true, pol);
T y = (1 - x) * x;
-
- if(f1 == 0)
- return 0;
-
- if((tools::max_value<T>() * y < f1))
- {
- // overflow:
- return policies::raise_overflow_error<T>(function, 0, pol);
- }
-
- f1 /= y;
-
+ T f1 = ibeta_power_terms<T>(a, b, x, 1 - x, lanczos_type(), true, pol, 1 / y, function);
return f1;
}
//
diff --git a/boost/math/special_functions/detail/bernoulli_details.hpp b/boost/math/special_functions/detail/bernoulli_details.hpp
index 525c1fccf4..c12a172b60 100644
--- a/boost/math/special_functions/detail/bernoulli_details.hpp
+++ b/boost/math/special_functions/detail/bernoulli_details.hpp
@@ -202,9 +202,13 @@ struct bernoulli_initializer
// initialize our dymanic table:
//
boost::math::bernoulli_b2n<T>(2, Policy());
+#ifndef BOOST_NO_EXCEPTIONS
try{
+#endif
boost::math::bernoulli_b2n<T>(max_bernoulli_b2n<T>::value + 1, Policy());
+#ifndef BOOST_NO_EXCEPTIONS
} catch(const std::overflow_error&){}
+#endif
boost::math::tangent_t2n<T>(2, Policy());
}
void force_instantiate()const{}
@@ -254,7 +258,9 @@ struct fixed_vector : private std::allocator<T>
void resize(unsigned n, const T& val)
{
if(n > m_capacity)
- throw std::runtime_error("Exhausted storage for Bernoulli numbers.");
+ {
+ BOOST_THROW_EXCEPTION(std::runtime_error("Exhausted storage for Bernoulli numbers."));
+ }
for(unsigned i = m_used; i < n; ++i)
new (m_data + i) T(val);
m_used = n;
@@ -432,11 +438,11 @@ public:
//
if(start + n >= bn.size())
{
- std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+ std::size_t new_size = (std::min)((std::max)((std::max)(std::size_t(start + n), std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
tangent_numbers_series(new_size);
}
- for(std::size_t i = (std::max)(max_bernoulli_b2n<T>::value + 1, start); i < start + n; ++i)
+ for(std::size_t i = (std::max)(std::size_t(max_bernoulli_b2n<T>::value + 1), start); i < start + n; ++i)
{
*out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[i];
++out;
@@ -448,11 +454,11 @@ public:
boost::detail::lightweight_mutex::scoped_lock l(m_mutex);
if(start + n >= bn.size())
{
- std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+ std::size_t new_size = (std::min)((std::max)((std::max)(std::size_t(start + n), std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
tangent_numbers_series(new_size);
}
- for(std::size_t i = (std::max)(max_bernoulli_b2n<T>::value + 1, start); i < start + n; ++i)
+ for(std::size_t i = (std::max)(std::size_t(max_bernoulli_b2n<T>::value + 1), start); i < start + n; ++i)
{
*out = (i >= m_overflow_limit) ? policies::raise_overflow_error<T>("boost::math::bernoulli_b2n<%1%>(std::size_t)", 0, T(i), pol) : bn[i];
++out;
@@ -473,7 +479,7 @@ public:
{
if(start + n >= bn.size())
{
- std::size_t new_size = (std::min)((std::max)((std::max)(start + n, std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
+ std::size_t new_size = (std::min)((std::max)((std::max)(std::size_t(start + n), std::size_t(bn.size() + 20)), std::size_t(50)), std::size_t(bn.capacity()));
tangent_numbers_series(new_size);
}
m_counter.store(static_cast<atomic_integer_type>(bn.size()), BOOST_MATH_ATOMIC_NS::memory_order_release);
diff --git a/boost/math/special_functions/detail/bessel_derivatives_linear.hpp b/boost/math/special_functions/detail/bessel_derivatives_linear.hpp
index 2ee86a03ee..72fddc61c6 100644
--- a/boost/math/special_functions/detail/bessel_derivatives_linear.hpp
+++ b/boost/math/special_functions/detail/bessel_derivatives_linear.hpp
@@ -37,13 +37,25 @@ inline T sph_bessel_j_derivative_linear(unsigned v, T x, Policy pol)
template <class T, class Policy>
inline T bessel_i_derivative_linear(T v, T x, Policy pol)
{
- return (boost::math::detail::cyl_bessel_i_imp<T>(v-1, x, pol) + boost::math::detail::cyl_bessel_i_imp<T>(v+1, x, pol)) / 2;
+ T result = boost::math::detail::cyl_bessel_i_imp<T>(v - 1, x, pol);
+ if(result >= tools::max_value<T>())
+ return result; // result is infinite
+ T result2 = boost::math::detail::cyl_bessel_i_imp<T>(v + 1, x, pol);
+ if(result2 >= tools::max_value<T>() - result)
+ return result2; // result is infinite
+ return (result + result2) / 2;
}
template <class T, class Tag, class Policy>
inline T bessel_k_derivative_linear(T v, T x, Tag tag, Policy pol)
{
- return (boost::math::detail::cyl_bessel_k_imp<T>(v-1, x, tag, pol) + boost::math::detail::cyl_bessel_k_imp<T>(v+1, x, tag, pol)) / -2;
+ T result = boost::math::detail::cyl_bessel_k_imp<T>(v - 1, x, tag, pol);
+ if(result >= tools::max_value<T>())
+ return -result; // result is infinite
+ T result2 = boost::math::detail::cyl_bessel_k_imp<T>(v + 1, x, tag, pol);
+ if(result2 >= tools::max_value<T>() - result)
+ return -result2; // result is infinite
+ return (result + result2) / -2;
}
template <class T, class Policy>
diff --git a/boost/math/special_functions/detail/bessel_ik.hpp b/boost/math/special_functions/detail/bessel_ik.hpp
index 10118d9715..aac1781e10 100644
--- a/boost/math/special_functions/detail/bessel_ik.hpp
+++ b/boost/math/special_functions/detail/bessel_ik.hpp
@@ -374,6 +374,7 @@ int bessel_ik(T v, T x, T* I, T* K, int kind, const Policy& pol)
prev = Ku;
current = Ku1;
T scale = 1;
+ T scale_sign = 1;
for (k = 1; k <= n; k++) // forward recurrence for K
{
T fact = 2 * (u + k) / x;
@@ -381,6 +382,7 @@ int bessel_ik(T v, T x, T* I, T* K, int kind, const Policy& pol)
{
prev /= current;
scale /= current;
+ scale_sign *= boost::math::sign(current);
current = 1;
}
next = fact * current + prev;
@@ -426,7 +428,7 @@ int bessel_ik(T v, T x, T* I, T* K, int kind, const Policy& pol)
if(fact == 0)
*I = Iv;
else if(tools::max_value<T>() * scale < fact)
- *I = (org_kind & need_i) ? T(sign(fact) * sign(scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+ *I = (org_kind & need_i) ? T(sign(fact) * scale_sign * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
else
*I = Iv + fact / scale; // reflection formula
}
@@ -435,7 +437,7 @@ int bessel_ik(T v, T x, T* I, T* K, int kind, const Policy& pol)
*I = Iv;
}
if(tools::max_value<T>() * scale < Kv)
- *K = (org_kind & need_k) ? T(sign(Kv) * sign(scale) * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
+ *K = (org_kind & need_k) ? T(sign(Kv) * scale_sign * policies::raise_overflow_error<T>(function, 0, pol)) : T(0);
else
*K = Kv / scale;
BOOST_MATH_INSTRUMENT_VARIABLE(*I);
diff --git a/boost/math/special_functions/detail/bessel_jn.hpp b/boost/math/special_functions/detail/bessel_jn.hpp
index 3f15f9cd87..2413630637 100644
--- a/boost/math/special_functions/detail/bessel_jn.hpp
+++ b/boost/math/special_functions/detail/bessel_jn.hpp
@@ -35,7 +35,7 @@ T bessel_jn(int n, T x, const Policy& pol)
//
if (n < 0)
{
- factor = (n & 0x1) ? -1 : 1; // J_{-n}(z) = (-1)^n J_n(z)
+ factor = static_cast<T>((n & 0x1) ? -1 : 1); // J_{-n}(z) = (-1)^n J_n(z)
n = -n;
}
else
@@ -50,6 +50,8 @@ T bessel_jn(int n, T x, const Policy& pol)
//
// Special cases:
//
+ if(asymptotic_bessel_large_x_limit(T(n), x))
+ return factor * asymptotic_bessel_j_large_x_2<T>(T(n), x);
if (n == 0)
{
return factor * bessel_j0(x);
@@ -64,9 +66,6 @@ T bessel_jn(int n, T x, const Policy& pol)
return static_cast<T>(0);
}
- if(asymptotic_bessel_large_x_limit(T(n), x))
- return factor * asymptotic_bessel_j_large_x_2<T>(n, x);
-
BOOST_ASSERT(n > 1);
T scale = 1;
if (n < abs(x)) // forward recurrence
diff --git a/boost/math/special_functions/detail/bessel_jy_asym.hpp b/boost/math/special_functions/detail/bessel_jy_asym.hpp
index 81f6238e58..4d7ac485ad 100644
--- a/boost/math/special_functions/detail/bessel_jy_asym.hpp
+++ b/boost/math/special_functions/detail/bessel_jy_asym.hpp
@@ -120,6 +120,24 @@ inline T asymptotic_bessel_j_large_x_2(T v, T x)
}
template <class T>
+inline bool asymptotic_bessel_large_x_limit(int v, const T& x)
+{
+ BOOST_MATH_STD_USING
+ //
+ // Determines if x is large enough compared to v to take the asymptotic
+ // forms above. From A&S 9.2.28 we require:
+ // v < x * eps^1/8
+ // and from A&S 9.2.29 we require:
+ // v^12/10 < 1.5 * x * eps^1/10
+ // using the former seems to work OK in practice with broadly similar
+ // error rates either side of the divide for v < 10000.
+ // At double precision eps^1/8 ~= 0.01.
+ //
+ BOOST_ASSERT(v >= 0);
+ return (v ? v : 1) < x * 0.004f;
+}
+
+template <class T>
inline bool asymptotic_bessel_large_x_limit(const T& v, const T& x)
{
BOOST_MATH_STD_USING
diff --git a/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp b/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp
index 0dc68fc73c..5425caf689 100644
--- a/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp
+++ b/boost/math/special_functions/detail/bessel_jy_derivatives_series.hpp
@@ -157,7 +157,8 @@ inline T bessel_y_derivative_small_z_series(T v, T x, const Policy& pol)
gam = 1;
if (boost::math::tools::max_value<T>() * p < gam)
{
- return -boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+ // This term will overflow to -INF, when combined with the series below it becomes +INF:
+ return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
}
}
prefix = -gam / (boost::math::constants::pi<T>() * p);
@@ -173,7 +174,7 @@ inline T bessel_y_derivative_small_z_series(T v, T x, const Policy& pol)
scale /= (boost::math::tools::max_value<T>() / 4);
if (boost::math::tools::log_max_value<T>() < prefix)
{
- return -boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+ return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
}
}
prefix = -exp(prefix);
diff --git a/boost/math/special_functions/detail/bessel_yn.hpp b/boost/math/special_functions/detail/bessel_yn.hpp
index 0509062bbd..62d7377e4f 100644
--- a/boost/math/special_functions/detail/bessel_yn.hpp
+++ b/boost/math/special_functions/detail/bessel_yn.hpp
@@ -45,14 +45,13 @@ T bessel_yn(int n, T x, const Policy& pol)
//
if (n < 0)
{
- factor = (n & 0x1) ? -1 : 1; // Y_{-n}(z) = (-1)^n Y_n(z)
+ factor = static_cast<T>((n & 0x1) ? -1 : 1); // Y_{-n}(z) = (-1)^n Y_n(z)
n = -n;
}
else
{
factor = 1;
}
-
if(x < policies::get_epsilon<T, Policy>())
{
T scale = 1;
@@ -61,6 +60,10 @@ T bessel_yn(int n, T x, const Policy& pol)
return boost::math::sign(scale) * boost::math::sign(value) * policies::raise_overflow_error<T>(function, 0, pol);
value /= scale;
}
+ else if(asymptotic_bessel_large_x_limit(n, x))
+ {
+ value = factor * asymptotic_bessel_y_large_x_2(static_cast<T>(abs(n)), x);
+ }
else if (n == 0)
{
value = bessel_y0(x, pol);
@@ -76,23 +79,28 @@ T bessel_yn(int n, T x, const Policy& pol)
int k = 1;
BOOST_ASSERT(k < n);
policies::check_series_iterations<T>("boost::math::bessel_y_n<%1%>(%1%,%1%)", n, pol);
- do
+ T mult = 2 * k / x;
+ value = mult * current - prev;
+ prev = current;
+ current = value;
+ ++k;
+ if((mult > 1) && (fabs(current) > 1))
+ {
+ prev /= current;
+ factor /= current;
+ value /= current;
+ current = 1;
+ }
+ while(k < n)
{
- T fact = 2 * k / x;
- if((fact > 1) && ((tools::max_value<T>() - fabs(prev)) / fact < fabs(current)))
- {
- prev /= current;
- factor /= current;
- current = 1;
- }
- value = fact * current - prev;
+ mult = 2 * k / x;
+ value = mult * current - prev;
prev = current;
current = value;
++k;
}
- while(k < n);
if(fabs(tools::max_value<T>() * factor) < fabs(value))
- return sign(value) * sign(value) * policies::raise_overflow_error<T>(function, 0, pol);
+ return sign(value) * sign(factor) * policies::raise_overflow_error<T>(function, 0, pol);
value /= factor;
}
return value;
diff --git a/boost/math/special_functions/detail/lanczos_sse2.hpp b/boost/math/special_functions/detail/lanczos_sse2.hpp
index edef3a0412..b2dd7ea292 100644
--- a/boost/math/special_functions/detail/lanczos_sse2.hpp
+++ b/boost/math/special_functions/detail/lanczos_sse2.hpp
@@ -12,7 +12,7 @@
#include <emmintrin.h>
-#if defined(__GNUC__) || defined(__PGI)
+#if defined(__GNUC__) || defined(__PGI) || defined(__SUNPRO_CC)
#define ALIGN16 __attribute__((__aligned__(16)))
#else
#define ALIGN16 __declspec(align(16))
diff --git a/boost/math/special_functions/detail/polygamma.hpp b/boost/math/special_functions/detail/polygamma.hpp
index 4ef503bf7c..0267bd3ac8 100644
--- a/boost/math/special_functions/detail/polygamma.hpp
+++ b/boost/math/special_functions/detail/polygamma.hpp
@@ -44,7 +44,7 @@
// x is crazy large, just concentrate on the first part of the expression and use logs:
if(n == 1) return 1 / x;
T nlx = n * log(x);
- if((nlx < tools::log_max_value<T>()) && (n < max_factorial<T>::value))
+ if((nlx < tools::log_max_value<T>()) && (n < (int)max_factorial<T>::value))
return ((n & 1) ? 1 : -1) * boost::math::factorial<T>(n - 1) * pow(x, -n);
else
return ((n & 1) ? 1 : -1) * exp(boost::math::lgamma(T(n), pol) - n * log(x));
@@ -71,13 +71,13 @@
// or the power term underflows, this just gets set to 0 and then we
// know that we have to use logs for the initial terms:
//
- part_term = ((n > boost::math::max_factorial<T>::value) && (T(n) * n > tools::log_max_value<T>()))
+ part_term = ((n > (int)boost::math::max_factorial<T>::value) && (T(n) * n > tools::log_max_value<T>()))
? T(0) : static_cast<T>(boost::math::factorial<T>(n - 1, pol) * pow(x, -n - 1));
if(part_term == 0)
{
// Either n is very large, or the power term underflows,
// set the initial values of part_term, term and sum via logs:
- part_term = boost::math::lgamma(n, pol) - (n + 1) * log(x);
+ part_term = static_cast<T>(boost::math::lgamma(n, pol) - (n + 1) * log(x));
sum = exp(part_term + log(n + 2 * x) - boost::math::constants::ln_two<T>());
part_term += log(T(n) * (n + 1)) - boost::math::constants::ln_two<T>() - log(x);
part_term = exp(part_term);
@@ -505,7 +505,7 @@
// would mean setting the limit to ~ 1 / n,
// but we can tolerate a small amount of divergence:
//
- T small_x_limit = std::min(T(T(5) / n), T(0.25f));
+ T small_x_limit = (std::min)(T(T(5) / n), T(0.25f));
if(x < small_x_limit)
{
return polygamma_nearzero(n, x, pol, function);
diff --git a/boost/math/special_functions/detail/t_distribution_inv.hpp b/boost/math/special_functions/detail/t_distribution_inv.hpp
index 72f6f0c646..e8bd0db28f 100644
--- a/boost/math/special_functions/detail/t_distribution_inv.hpp
+++ b/boost/math/special_functions/detail/t_distribution_inv.hpp
@@ -56,9 +56,9 @@ T inverse_students_t_hill(T ndf, T u, const Policy& pol)
}
else
{
- y = ((1 / (((ndf + 6) / (ndf * y) - 0.089f * d - 0.822f)
+ y = static_cast<T>(((1 / (((ndf + 6) / (ndf * y) - 0.089f * d - 0.822f)
* (ndf + 2) * 3) + 0.5 / (ndf + 4)) * y - 1)
- * (ndf + 1) / (ndf + 2) + 1 / y;
+ * (ndf + 1) / (ndf + 2) + 1 / y);
}
q = sqrt(ndf * y);
@@ -144,41 +144,41 @@ T inverse_students_t_body_series(T df, T u, const Policy& pol)
// only on the degrees of freedom (Eq 57 of Shaw):
//
T in = 1 / df;
- c[2] = 0.16666666666666666667 + 0.16666666666666666667 * in;
- c[3] = (0.0083333333333333333333 * in
+ c[2] = static_cast<T>(0.16666666666666666667 + 0.16666666666666666667 * in);
+ c[3] = static_cast<T>((0.0083333333333333333333 * in
+ 0.066666666666666666667) * in
- + 0.058333333333333333333;
- c[4] = ((0.00019841269841269841270 * in
+ + 0.058333333333333333333);
+ c[4] = static_cast<T>(((0.00019841269841269841270 * in
+ 0.0017857142857142857143) * in
+ 0.026785714285714285714) * in
- + 0.025198412698412698413;
- c[5] = (((2.7557319223985890653e-6 * in
+ + 0.025198412698412698413);
+ c[5] = static_cast<T>((((2.7557319223985890653e-6 * in
+ 0.00037477954144620811287) * in
- 0.0011078042328042328042) * in
+ 0.010559964726631393298) * in
- + 0.012039792768959435626;
- c[6] = ((((2.5052108385441718775e-8 * in
+ + 0.012039792768959435626);
+ c[6] = static_cast<T>(((((2.5052108385441718775e-8 * in
- 0.000062705427288760622094) * in
+ 0.00059458674042007375341) * in
- 0.0016095979637646304313) * in
+ 0.0061039211560044893378) * in
- + 0.0038370059724226390893;
- c[7] = (((((1.6059043836821614599e-10 * in
+ + 0.0038370059724226390893);
+ c[7] = static_cast<T>((((((1.6059043836821614599e-10 * in
+ 0.000015401265401265401265) * in
- 0.00016376804137220803887) * in
+ 0.00069084207973096861986) * in
- 0.0012579159844784844785) * in
+ 0.0010898206731540064873) * in
- + 0.0032177478835464946576;
- c[8] = ((((((7.6471637318198164759e-13 * in
+ + 0.0032177478835464946576);
+ c[8] = static_cast<T>(((((((7.6471637318198164759e-13 * in
- 3.9851014346715404916e-6) * in
+ 0.000049255746366361445727) * in
- 0.00024947258047043099953) * in
+ 0.00064513046951456342991) * in
- 0.00076245135440323932387) * in
+ 0.000033530976880017885309) * in
- + 0.0017438262298340009980;
- c[9] = (((((((2.8114572543455207632e-15 * in
+ + 0.0017438262298340009980);
+ c[9] = static_cast<T>((((((((2.8114572543455207632e-15 * in
+ 1.0914179173496789432e-6) * in
- 0.000015303004486655377567) * in
+ 0.000090867107935219902229) * in
@@ -186,8 +186,8 @@ T inverse_students_t_body_series(T df, T u, const Policy& pol)
+ 0.00051406605788341121363) * in
- 0.00036307660358786885787) * in
- 0.00031101086326318780412) * in
- + 0.00096472747321388644237;
- c[10] = ((((((((8.2206352466243297170e-18 * in
+ + 0.00096472747321388644237);
+ c[10] = static_cast<T>(((((((((8.2206352466243297170e-18 * in
- 3.1239569599829868045e-7) * in
+ 4.8903045291975346210e-6) * in
- 0.000033202652391372058698) * in
@@ -196,7 +196,7 @@ T inverse_students_t_body_series(T df, T u, const Policy& pol)
+ 0.00035764655430568632777) * in
- 0.00010230378073700412687) * in
- 0.00036942667800009661203) * in
- + 0.00054229262813129686486;
+ + 0.00054229262813129686486);
//
// The result is then a polynomial in v (see Eq 56 of Shaw):
//
@@ -285,7 +285,7 @@ T inverse_students_t(T df, T u, T v, const Policy& pol, bool* pexact = 0)
//
T a = 4 * (u - u * u);//1 - 4 * (u - 0.5f) * (u - 0.5f);
T b = boost::math::cbrt(a);
- static const T c = 0.85498797333834849467655443627193;
+ static const T c = static_cast<T>(0.85498797333834849467655443627193L);
T p = 6 * (1 + c * (1 / b - 1));
T p0;
do{
diff --git a/boost/math/special_functions/ellint_2.hpp b/boost/math/special_functions/ellint_2.hpp
index f4f65cc11d..0d160ecdf1 100644
--- a/boost/math/special_functions/ellint_2.hpp
+++ b/boost/math/special_functions/ellint_2.hpp
@@ -103,17 +103,10 @@ T ellint_e_imp(T phi, T k, const Policy& pol)
{
return policies::raise_domain_error<T>("boost::math::ellint_2<%1%>(%1%, %1%)", "The parameter k is out of range, got k = %1%", k, pol);
}
- else if(rphi == 0)
+ else if(rphi < tools::root_epsilon<T>())
{
- result = 0;
- }
- else if(sinp * sinp < tools::min_value<T>())
- {
- T x = cosp * cosp;
- T t = k * k * sinp * sinp;
- T y = 1 - t;
- T z = 1;
- result = s * sinp * (ellint_rf_imp(x, y, z, pol) - t * ellint_rd_imp(x, y, z, pol) / 3);
+ // See http://functions.wolfram.com/EllipticIntegrals/EllipticE2/06/01/03/0001/
+ result = s * rphi;
}
else
{
diff --git a/boost/math/special_functions/ellint_d.hpp b/boost/math/special_functions/ellint_d.hpp
index 5bd065d6e3..bc5a4b2a56 100644
--- a/boost/math/special_functions/ellint_d.hpp
+++ b/boost/math/special_functions/ellint_d.hpp
@@ -60,7 +60,7 @@ T ellint_d_imp(T phi, T k, const Policy& pol)
if(phi >= tools::max_value<T>())
{
// Need to handle infinity as a special case:
- result = policies::raise_overflow_error<T>("boost::math::ellint_e<%1%>(%1%,%1%)", 0, pol);
+ result = policies::raise_overflow_error<T>("boost::math::ellint_d<%1%>(%1%,%1%)", 0, pol);
}
else if(phi > 1 / tools::epsilon<T>())
{
@@ -113,15 +113,11 @@ T ellint_d_imp(T k, const Policy& pol)
BOOST_MATH_STD_USING
using namespace boost::math::tools;
- if (abs(k) > 1)
+ if (abs(k) >= 1)
{
- return policies::raise_domain_error<T>("boost::math::ellint_e<%1%>(%1%)",
+ return policies::raise_domain_error<T>("boost::math::ellint_d<%1%>(%1%)",
"Got k = %1%, function requires |k| <= 1", k, pol);
}
- if (abs(k) == 1)
- {
- return static_cast<T>(1);
- }
if(fabs(k) <= tools::root_epsilon<T>())
return constants::pi<T>() / 4;
diff --git a/boost/math/special_functions/fpclassify.hpp b/boost/math/special_functions/fpclassify.hpp
index 8e75fae0f2..0a4e1ac7aa 100644
--- a/boost/math/special_functions/fpclassify.hpp
+++ b/boost/math/special_functions/fpclassify.hpp
@@ -80,6 +80,9 @@ is used.
#if defined(_MSC_VER) || defined(__BORLANDC__)
#include <float.h>
#endif
+#ifdef BOOST_MATH_USE_FLOAT128
+#include "quadmath.h"
+#endif
#ifdef BOOST_NO_STDC_NAMESPACE
namespace std{ using ::abs; using ::fabs; }
@@ -121,7 +124,10 @@ inline bool is_nan_helper(T, const boost::false_type&)
{
return false;
}
-
+#ifdef BOOST_MATH_USE_FLOAT128
+inline bool is_nan_helper(__float128 f, const boost::true_type&) { return ::isnanq(f); }
+inline bool is_nan_helper(__float128 f, const boost::false_type&) { return ::isnanq(f); }
+#endif
}
namespace math{
@@ -513,6 +519,13 @@ inline bool (isinf)(long double x)
return detail::isinf_impl(static_cast<value_type>(x), method());
}
#endif
+#ifdef BOOST_MATH_USE_FLOAT128
+template<>
+inline bool (isinf)(__float128 x)
+{
+ return ::isinfq(x);
+}
+#endif
//------------------------------------------------------------------------------
@@ -598,6 +611,13 @@ inline bool (isnan)(long double x)
return detail::isnan_impl(x, method());
}
#endif
+#ifdef BOOST_MATH_USE_FLOAT128
+template<>
+inline bool (isnan)(__float128 x)
+{
+ return ::isnanq(x);
+}
+#endif
} // namespace math
} // namespace boost
diff --git a/boost/math/special_functions/gamma.hpp b/boost/math/special_functions/gamma.hpp
index 1db1e4c2d3..3a3191a807 100644
--- a/boost/math/special_functions/gamma.hpp
+++ b/boost/math/special_functions/gamma.hpp
@@ -162,7 +162,7 @@ T gamma_imp(T z, const Policy& pol, const Lanczos& l)
{
if (z < 1 / tools::max_value<T>())
result = policies::raise_overflow_error<T>(function, 0, pol);
- result *= 1 / z - constants::euler<T>();
+ result *= 1 / z - constants::euler<T>();
}
else
{
@@ -238,13 +238,13 @@ T lgamma_imp(T z, const Policy& pol, const Lanczos& l, int* sign = 0)
}
else if (z < tools::root_epsilon<T>())
{
- if (0 == z)
- return policies::raise_pole_error<T>(function, "Evaluation of lgamma at %1%.", z, pol);
+ if (0 == z)
+ return policies::raise_pole_error<T>(function, "Evaluation of lgamma at %1%.", z, pol);
if (fabs(z) < 1 / tools::max_value<T>())
result = -log(fabs(z));
else
- result = log(fabs(1 / z - constants::euler<T>()));
- if (z < 0)
+ result = log(fabs(1 / z - constants::euler<T>()));
+ if (z < 0)
sresult = -1;
}
else if(z < 15)
@@ -526,9 +526,9 @@ T lgamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos&, int* sig
if (zz < min_arg_for_recursion)
{
- // Here we simply take the logarithm of tgamma(). This is somewhat
- // inefficient, but simple. The rationale is that the argument here
- // is relatively small and overflow is not expected to be likely.
+ // Here we simply take the logarithm of tgamma(). This is somewhat
+ // inefficient, but simple. The rationale is that the argument here
+ // is relatively small and overflow is not expected to be likely.
if (z > -tools::root_epsilon<T>())
{
// Reflection formula may fail if z is very close to zero, let the series
@@ -540,7 +540,7 @@ T lgamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos&, int* sig
}
return log_gamma_value;
}
- else
+ else
{
// No issue with spurious overflow in reflection formula,
// just fall through to regular code:
@@ -1394,7 +1394,7 @@ T tgamma_delta_ratio_imp_lanczos(T z, T delta, const Policy& pol, const Lanczos&
return 1 / (z * boost::math::tgamma(z + delta, pol));
}
}
- T zgh = z + Lanczos::g() - constants::half<T>();
+ T zgh = static_cast<T>(z + Lanczos::g() - constants::half<T>());
T result;
if(fabs(delta) < 10)
{
diff --git a/boost/math/special_functions/math_fwd.hpp b/boost/math/special_functions/math_fwd.hpp
index 96f60726a6..ca8e58144e 100644
--- a/boost/math/special_functions/math_fwd.hpp
+++ b/boost/math/special_functions/math_fwd.hpp
@@ -181,19 +181,19 @@ namespace boost
template <class T>
typename tools::promote_args<T>::type
legendre_p(int l, T x);
-
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
template <class T, class Policy>
typename boost::enable_if_c<policies::is_policy<Policy>::value, typename tools::promote_args<T>::type>::type
legendre_p(int l, T x, const Policy& pol);
-
+#endif
template <class T>
typename tools::promote_args<T>::type
legendre_q(unsigned l, T x);
-
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1310)
template <class T, class Policy>
typename boost::enable_if_c<policies::is_policy<Policy>::value, typename tools::promote_args<T>::type>::type
legendre_q(unsigned l, T x, const Policy& pol);
-
+#endif
template <class T1, class T2, class T3>
typename tools::promote_args<T1, T2, T3>::type
legendre_next(unsigned l, unsigned m, T1 x, T2 Pl, T3 Plm1);
@@ -607,8 +607,10 @@ namespace boost
template <class T1, class T2, class Policy>
struct bessel_traits
{
- typedef typename tools::promote_args<
- T1, T2
+ typedef typename mpl::if_<
+ is_integral<T1>,
+ typename tools::promote_args<T2>::type,
+ typename tools::promote_args<T1, T2>::type
>::type result_type;
typedef typename policies::precision<result_type, Policy>::type precision_type;
@@ -994,6 +996,16 @@ namespace boost
template <class T>
typename tools::promote_args<T>::type float_advance(const T& val, int distance);
+ template <class T, class Policy>
+ typename tools::promote_args<T>::type ulp(const T& val, const Policy& pol);
+ template <class T>
+ typename tools::promote_args<T>::type ulp(const T& val);
+
+ template <class T, class U>
+ typename tools::promote_args<T, U>::type relative_difference(const T&, const U&);
+ template <class T, class U>
+ typename tools::promote_args<T, U>::type epsilon_difference(const T&, const U&);
+
template<class T>
T unchecked_bernoulli_b2n(const std::size_t n);
template <class T, class Policy>
@@ -1447,6 +1459,7 @@ template <class OutputIterator, class T>\
template <class T> T float_next(const T& a){ return boost::math::float_next(a, Policy()); }\
template <class T> T float_prior(const T& a){ return boost::math::float_prior(a, Policy()); }\
template <class T> T float_distance(const T& a, const T& b){ return boost::math::float_distance(a, b, Policy()); }\
+ template <class T> T ulp(const T& a){ return boost::math::ulp(a, Policy()); }\
\
template <class RT1, class RT2>\
inline typename boost::math::tools::promote_args<RT1, RT2>::type owens_t(RT1 a, RT2 z){ return boost::math::owens_t(a, z, Policy()); }\
diff --git a/boost/math/special_functions/nonfinite_num_facets.hpp b/boost/math/special_functions/nonfinite_num_facets.hpp
index 84d3f1070a..cd1eba9320 100644
--- a/boost/math/special_functions/nonfinite_num_facets.hpp
+++ b/boost/math/special_functions/nonfinite_num_facets.hpp
@@ -24,6 +24,7 @@
#include <locale>
#include <boost/version.hpp>
+#include <boost/throw_exception.hpp>
#include <boost/math/special_functions/fpclassify.hpp>
#include <boost/math/special_functions/sign.hpp>
@@ -103,7 +104,7 @@ namespace boost {
case FP_INFINITE:
if(flags_ & trap_infinity)
{
- throw std::ios_base::failure("Infinity");
+ BOOST_THROW_EXCEPTION(std::ios_base::failure("Infinity"));
}
else if((boost::math::signbit)(val))
{ // negative infinity.
@@ -122,7 +123,7 @@ namespace boost {
case FP_NAN:
if(flags_ & trap_nan)
{
- throw std::ios_base::failure("NaN");
+ BOOST_THROW_EXCEPTION(std::ios_base::failure("NaN"));
}
else if((boost::math::signbit)(val))
{ // negative so "-nan".
diff --git a/boost/math/special_functions/owens_t.hpp b/boost/math/special_functions/owens_t.hpp
index 6de93a4887..7fbd8918c0 100644
--- a/boost/math/special_functions/owens_t.hpp
+++ b/boost/math/special_functions/owens_t.hpp
@@ -61,9 +61,9 @@ namespace boost
inline unsigned short owens_t_compute_code(const RealType h, const RealType a)
{
static const RealType hrange[] =
- {0.02, 0.06, 0.09, 0.125, 0.26, 0.4, 0.6, 1.6, 1.7, 2.33, 2.4, 3.36, 3.4, 4.8};
+ { 0.02f, 0.06f, 0.09f, 0.125f, 0.26f, 0.4f, 0.6f, 1.6f, 1.7f, 2.33f, 2.4f, 3.36f, 3.4f, 4.8f };
- static const RealType arange[] = {0.025, 0.09, 0.15, 0.36, 0.5, 0.9, 0.99999};
+ static const RealType arange[] = { 0.025f, 0.09f, 0.15f, 0.36f, 0.5f, 0.9f, 0.99999f };
/*
original select array from paper:
1, 1, 2,13,13,13,13,13,13,13,13,16,16,16, 9
@@ -229,17 +229,17 @@ namespace boost
static const RealType c2[] =
{
- 0.99999999999999987510,
- -0.99999999999988796462, 0.99999999998290743652,
- -0.99999999896282500134, 0.99999996660459362918,
- -0.99999933986272476760, 0.99999125611136965852,
- -0.99991777624463387686, 0.99942835555870132569,
- -0.99697311720723000295, 0.98751448037275303682,
- -0.95915857980572882813, 0.89246305511006708555,
- -0.76893425990463999675, 0.58893528468484693250,
- -0.38380345160440256652, 0.20317601701045299653,
- -0.82813631607004984866E-01, 0.24167984735759576523E-01,
- -0.44676566663971825242E-02, 0.39141169402373836468E-03
+ static_cast<RealType>(0.99999999999999987510),
+ static_cast<RealType>(-0.99999999999988796462), static_cast<RealType>(0.99999999998290743652),
+ static_cast<RealType>(-0.99999999896282500134), static_cast<RealType>(0.99999996660459362918),
+ static_cast<RealType>(-0.99999933986272476760), static_cast<RealType>(0.99999125611136965852),
+ static_cast<RealType>(-0.99991777624463387686), static_cast<RealType>(0.99942835555870132569),
+ static_cast<RealType>(-0.99697311720723000295), static_cast<RealType>(0.98751448037275303682),
+ static_cast<RealType>(-0.95915857980572882813), static_cast<RealType>(0.89246305511006708555),
+ static_cast<RealType>(-0.76893425990463999675), static_cast<RealType>(0.58893528468484693250),
+ static_cast<RealType>(-0.38380345160440256652), static_cast<RealType>(0.20317601701045299653),
+ static_cast<RealType>(-0.82813631607004984866E-01), static_cast<RealType>(0.24167984735759576523E-01),
+ static_cast<RealType>(-0.44676566663971825242E-02), static_cast<RealType>(0.39141169402373836468E-03)
};
const RealType as = a*a;
@@ -402,20 +402,22 @@ namespace boost
*/
const unsigned short m = 13;
- static const RealType pts[] = {0.35082039676451715489E-02,
- 0.31279042338030753740E-01, 0.85266826283219451090E-01,
- 0.16245071730812277011, 0.25851196049125434828,
- 0.36807553840697533536, 0.48501092905604697475,
- 0.60277514152618576821, 0.71477884217753226516,
- 0.81475510988760098605, 0.89711029755948965867,
- 0.95723808085944261843, 0.99178832974629703586};
- static const RealType wts[] = { 0.18831438115323502887E-01,
- 0.18567086243977649478E-01, 0.18042093461223385584E-01,
- 0.17263829606398753364E-01, 0.16243219975989856730E-01,
- 0.14994592034116704829E-01, 0.13535474469662088392E-01,
- 0.11886351605820165233E-01, 0.10070377242777431897E-01,
- 0.81130545742299586629E-02, 0.60419009528470238773E-02,
- 0.38862217010742057883E-02, 0.16793031084546090448E-02};
+ static const RealType pts[] = {
+ static_cast<RealType>(0.35082039676451715489E-02),
+ static_cast<RealType>(0.31279042338030753740E-01), static_cast<RealType>(0.85266826283219451090E-01),
+ static_cast<RealType>(0.16245071730812277011), static_cast<RealType>(0.25851196049125434828),
+ static_cast<RealType>(0.36807553840697533536), static_cast<RealType>(0.48501092905604697475),
+ static_cast<RealType>(0.60277514152618576821), static_cast<RealType>(0.71477884217753226516),
+ static_cast<RealType>(0.81475510988760098605), static_cast<RealType>(0.89711029755948965867),
+ static_cast<RealType>(0.95723808085944261843), static_cast<RealType>(0.99178832974629703586) };
+ static const RealType wts[] = {
+ static_cast<RealType>(0.18831438115323502887E-01),
+ static_cast<RealType>(0.18567086243977649478E-01), static_cast<RealType>(0.18042093461223385584E-01),
+ static_cast<RealType>(0.17263829606398753364E-01), static_cast<RealType>(0.16243219975989856730E-01),
+ static_cast<RealType>(0.14994592034116704829E-01), static_cast<RealType>(0.13535474469662088392E-01),
+ static_cast<RealType>(0.11886351605820165233E-01), static_cast<RealType>(0.10070377242777431897E-01),
+ static_cast<RealType>(0.81130545742299586629E-02), static_cast<RealType>(0.60419009528470238773E-02),
+ static_cast<RealType>(0.38862217010742057883E-02), static_cast<RealType>(0.16793031084546090448E-02) };
const RealType as = a*a;
const RealType hs = -h*h*boost::math::constants::half<RealType>();
@@ -575,14 +577,18 @@ namespace boost
// when the last accelerated term was small enough...
//
int n;
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
n = itrunc(T(tools::log_max_value<T>() / 6));
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(...)
{
n = (std::numeric_limits<int>::max)();
}
+#endif
n = (std::min)(n, 1500);
T d = pow(3 + sqrt(T(8)), n);
d = (d + 1 / d) / 2;
@@ -689,14 +695,18 @@ namespace boost
// when the last accelerated term was small enough...
//
int n;
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
n = itrunc(RealType(tools::log_max_value<RealType>() / 6));
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(...)
{
n = (std::numeric_limits<int>::max)();
}
+#endif
n = (std::min)(n, 1500);
RealType d = pow(3 + sqrt(RealType(8)), n);
d = (d + 1 / d) / 2;
@@ -858,25 +868,33 @@ namespace boost
bool have_t1(false), have_t2(false);
if(ah < 3)
{
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
have_t1 = true;
p1 = owens_t_T1_accelerated(h, a, forwarding_policy());
if(p1.second < target_precision)
return p1.first;
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const boost::math::evaluation_error&){} // T1 may fail and throw, that's OK
+#endif
}
if(ah > 1)
{
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
have_t2 = true;
p2 = owens_t_T2_accelerated(h, a, ah, forwarding_policy());
if(p2.second < target_precision)
return p2.first;
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const boost::math::evaluation_error&){} // T2 may fail and throw, that's OK
+#endif
}
//
// If we haven't tried T1 yet, do it now - sometimes it succeeds and the number of iterations
@@ -884,14 +902,18 @@ namespace boost
//
if(!have_t1)
{
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
have_t1 = true;
p1 = owens_t_T1_accelerated(h, a, forwarding_policy());
if(p1.second < target_precision)
return p1.first;
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const boost::math::evaluation_error&){} // T1 may fail and throw, that's OK
+#endif
}
//
// If we haven't tried T2 yet, do it now - sometimes it succeeds and the number of iterations
@@ -899,24 +921,32 @@ namespace boost
//
if(!have_t2)
{
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
have_t2 = true;
p2 = owens_t_T2_accelerated(h, a, ah, forwarding_policy());
if(p2.second < target_precision)
return p2.first;
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const boost::math::evaluation_error&){} // T2 may fail and throw, that's OK
+#endif
}
//
// OK, nothing left to do but try the most expensive option which is T4,
// this is often slow to converge, but when it does converge it tends to
// be accurate:
+#ifndef BOOST_NO_EXCEPTIONS
try
{
+#endif
return T4_mp(h, a, pol);
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const boost::math::evaluation_error&){} // T4 may fail and throw, that's OK
+#endif
//
// Now look back at the results from T1 and T2 and see if either gave better
// results than we could get from the 64-bit precision versions.
diff --git a/boost/math/special_functions/powm1.hpp b/boost/math/special_functions/powm1.hpp
index f3af3d6e59..fe2fce35d8 100644
--- a/boost/math/special_functions/powm1.hpp
+++ b/boost/math/special_functions/powm1.hpp
@@ -13,23 +13,40 @@
#include <boost/math/special_functions/math_fwd.hpp>
#include <boost/math/special_functions/log1p.hpp>
#include <boost/math/special_functions/expm1.hpp>
+#include <boost/math/special_functions/trunc.hpp>
#include <boost/assert.hpp>
namespace boost{ namespace math{ namespace detail{
template <class T, class Policy>
-inline T powm1_imp(const T a, const T z, const Policy& pol)
+inline T powm1_imp(const T x, const T y, const Policy& pol)
{
BOOST_MATH_STD_USING
+ static const char* function = "boost::math::powm1<%1%>(%1%, %1%)";
- if((fabs(a) < 1) || (fabs(z) < 1))
+ if (x > 0)
{
- T p = log(a) * z;
- if(fabs(p) < 2)
- return boost::math::expm1(p, pol);
- // otherwise fall though:
+ if ((fabs(y * (x - 1)) < 0.5) || (fabs(y) < 0.2))
+ {
+ // We don't have any good/quick approximation for log(x) * y
+ // so just try it and see:
+ T l = y * log(x);
+ if (l < 0.5)
+ return boost::math::expm1(l);
+ if (l > boost::math::tools::log_max_value<T>())
+ return boost::math::policies::raise_overflow_error<T>(function, 0, pol);
+ // fall through....
+ }
}
- return pow(a, z) - 1;
+ else
+ {
+ // y had better be an integer:
+ if (boost::math::trunc(y) != y)
+ return boost::math::policies::raise_domain_error<T>(function, "For non-integral exponent, expected base > 0 but got %1%", x, pol);
+ if (boost::math::trunc(y / 2) == y / 2)
+ return powm1_imp(T(-x), y, pol);
+ }
+ return pow(x, y) - 1;
}
} // detail
diff --git a/boost/math/special_functions/relative_difference.hpp b/boost/math/special_functions/relative_difference.hpp
new file mode 100644
index 0000000000..544feda61b
--- /dev/null
+++ b/boost/math/special_functions/relative_difference.hpp
@@ -0,0 +1,134 @@
+// (C) Copyright John Maddock 2006, 2015
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_RELATIVE_ERROR
+#define BOOST_MATH_RELATIVE_ERROR
+
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/tools/promotion.hpp>
+#include <boost/math/tools/precision.hpp>
+
+namespace boost{
+ namespace math{
+
+ template <class T, class U>
+ typename boost::math::tools::promote_args<T,U>::type relative_difference(const T& arg_a, const U& arg_b)
+ {
+ typedef typename boost::math::tools::promote_args<T, U>::type result_type;
+ result_type a = arg_a;
+ result_type b = arg_b;
+ BOOST_MATH_STD_USING
+#ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+ //
+ // If math.h has no long double support we can't rely
+ // on the math functions generating exponents outside
+ // the range of a double:
+ //
+ result_type min_val = (std::max)(
+ tools::min_value<result_type>(),
+ static_cast<result_type>((std::numeric_limits<double>::min)()));
+ result_type max_val = (std::min)(
+ tools::max_value<result_type>(),
+ static_cast<result_type>((std::numeric_limits<double>::max)()));
+#else
+ result_type min_val = tools::min_value<result_type>();
+ result_type max_val = tools::max_value<result_type>();
+#endif
+ // Screen out NaN's first, if either value is a NaN then the distance is "infinite":
+ if((boost::math::isnan)(a) || (boost::math::isnan)(b))
+ return max_val;
+ // Screen out infinites:
+ if(fabs(b) > max_val)
+ {
+ if(fabs(a) > max_val)
+ return (a < 0) == (b < 0) ? 0 : max_val; // one infinity is as good as another!
+ else
+ return max_val; // one infinity and one finite value implies infinite difference
+ }
+ else if(fabs(a) > max_val)
+ return max_val; // one infinity and one finite value implies infinite difference
+
+ //
+ // If the values have different signs, treat as infinite difference:
+ //
+ if(((a < 0) != (b < 0)) && (a != 0) && (b != 0))
+ return max_val;
+ a = fabs(a);
+ b = fabs(b);
+ //
+ // Now deal with zero's, if one value is zero (or denorm) then treat it the same as
+ // min_val for the purposes of the calculation that follows:
+ //
+ if(a < min_val)
+ a = min_val;
+ if(b < min_val)
+ b = min_val;
+
+ return (std::max)(fabs((a - b) / a), fabs((a - b) / b));
+ }
+
+#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
+ template <>
+ inline boost::math::tools::promote_args<double, double>::type relative_difference(const double& arg_a, const double& arg_b)
+ {
+ BOOST_MATH_STD_USING
+ double a = arg_a;
+ double b = arg_b;
+ //
+ // On Mac OS X we evaluate "double" functions at "long double" precision,
+ // but "long double" actually has a very slightly narrower range than "double"!
+ // Therefore use the range of "long double" as our limits since results outside
+ // that range may have been truncated to 0 or INF:
+ //
+ double min_val = (std::max)((double)tools::min_value<long double>(), tools::min_value<double>());
+ double max_val = (std::min)((double)tools::max_value<long double>(), tools::max_value<double>());
+
+ // Screen out NaN's first, if either value is a NaN then the distance is "infinite":
+ if((boost::math::isnan)(a) || (boost::math::isnan)(b))
+ return max_val;
+ // Screen out infinites:
+ if(fabs(b) > max_val)
+ {
+ if(fabs(a) > max_val)
+ return 0; // one infinity is as good as another!
+ else
+ return max_val; // one infinity and one finite value implies infinite difference
+ }
+ else if(fabs(a) > max_val)
+ return max_val; // one infinity and one finite value implies infinite difference
+
+ //
+ // If the values have different signs, treat as infinite difference:
+ //
+ if(((a < 0) != (b < 0)) && (a != 0) && (b != 0))
+ return max_val;
+ a = fabs(a);
+ b = fabs(b);
+ //
+ // Now deal with zero's, if one value is zero (or denorm) then treat it the same as
+ // min_val for the purposes of the calculation that follows:
+ //
+ if(a < min_val)
+ a = min_val;
+ if(b < min_val)
+ b = min_val;
+
+ return (std::max)(fabs((a - b) / a), fabs((a - b) / b));
+ }
+#endif
+
+ template <class T, class U>
+ inline typename boost::math::tools::promote_args<T, U>::type epsilon_difference(const T& arg_a, const U& arg_b)
+ {
+ typedef typename boost::math::tools::promote_args<T, U>::type result_type;
+ result_type r = relative_difference(arg_a, arg_b);
+ if(tools::max_value<result_type>() * boost::math::tools::epsilon<result_type>() < r)
+ return tools::max_value<result_type>();
+ return r / boost::math::tools::epsilon<result_type>();
+ }
+} // namespace math
+} // namespace boost
+
+#endif
diff --git a/boost/math/special_functions/trigamma.hpp b/boost/math/special_functions/trigamma.hpp
index 6fccb36a3a..17c9174c78 100644
--- a/boost/math/special_functions/trigamma.hpp
+++ b/boost/math/special_functions/trigamma.hpp
@@ -69,22 +69,22 @@ T trigamma_prec(T x, const mpl::int_<53>*, const Policy&)
// Expected Error Term : -6.895e-018
// Maximum Relative Change in Control Points : 8.497e-004
static const T P_4_inf[] = {
- 0.68947581948701249e-17L,
- 0.49999999999998975L,
- 1.0177274392923795L,
- 2.498208511343429L,
- 2.1921221359427595L,
- 1.5897035272532764L,
- 0.40154388356961734L,
+ static_cast<T>(0.68947581948701249e-17L),
+ static_cast<T>(0.49999999999998975L),
+ static_cast<T>(1.0177274392923795L),
+ static_cast<T>(2.498208511343429L),
+ static_cast<T>(2.1921221359427595L),
+ static_cast<T>(1.5897035272532764L),
+ static_cast<T>(0.40154388356961734L),
};
static const T Q_4_inf[] = {
- 1.0L,
- 1.7021215452463932L,
- 4.4290431747556469L,
- 2.9745631894384922L,
- 2.3013614809773616L,
- 0.28360399799075752L,
- 0.022892987908906897L,
+ static_cast<T>(1.0L),
+ static_cast<T>(1.7021215452463932L),
+ static_cast<T>(4.4290431747556469L),
+ static_cast<T>(2.9745631894384922L),
+ static_cast<T>(2.3013614809773616L),
+ static_cast<T>(0.28360399799075752L),
+ static_cast<T>(0.022892987908906897L),
};
if(x <= 2)
diff --git a/boost/math/special_functions/ulp.hpp b/boost/math/special_functions/ulp.hpp
new file mode 100644
index 0000000000..3d78a1c7c2
--- /dev/null
+++ b/boost/math/special_functions/ulp.hpp
@@ -0,0 +1,71 @@
+// (C) Copyright John Maddock 2015.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_MATH_SPECIAL_ULP_HPP
+#define BOOST_MATH_SPECIAL_ULP_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/next.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Policy>
+T ulp_imp(const T& val, const Policy& pol)
+{
+ BOOST_MATH_STD_USING
+ int expon;
+ static const char* function = "ulp<%1%>(%1%)";
+
+ int fpclass = (boost::math::fpclassify)(val);
+
+ if(fpclass == (int)FP_NAN)
+ {
+ return policies::raise_domain_error<T>(
+ function,
+ "Argument must be finite, but got %1%", val, pol);
+ }
+ else if((fpclass == (int)FP_INFINITE) || (fabs(val) >= tools::max_value<T>()))
+ {
+ return (val < 0 ? -1 : 1) * policies::raise_overflow_error<T>(function, 0, pol);
+ }
+ else if(fpclass == FP_ZERO)
+ return detail::get_smallest_value<T>();
+ //
+ // This code is almost the same as that for float_next, except for negative integers,
+ // where we preserve the relation ulp(x) == ulp(-x) as does Java:
+ //
+ frexp(fabs(val), &expon);
+ T diff = ldexp(T(1), expon - tools::digits<T>());
+ if(diff == 0)
+ diff = detail::get_smallest_value<T>();
+ return diff;
+}
+
+}
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type ulp(const T& val, const Policy& pol)
+{
+ typedef typename tools::promote_args<T>::type result_type;
+ return detail::ulp_imp(static_cast<result_type>(val), pol);
+}
+
+template <class T>
+inline typename tools::promote_args<T>::type ulp(const T& val)
+{
+ return ulp(val, policies::policy<>());
+}
+
+
+}} // namespaces
+
+#endif // BOOST_MATH_SPECIAL_ULP_HPP
+
diff --git a/boost/math/special_functions/zeta.hpp b/boost/math/special_functions/zeta.hpp
index 1ba282f4d1..616bb0cccc 100644
--- a/boost/math/special_functions/zeta.hpp
+++ b/boost/math/special_functions/zeta.hpp
@@ -200,20 +200,20 @@ inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
// Expected Error Term: -2.020e-18
// Max error found at double precision: 3.994987e-17
static const T P[6] = {
- 0.24339294433593750202L,
- -0.49092470516353571651L,
- 0.0557616214776046784287L,
- -0.00320912498879085894856L,
- 0.000451534528645796438704L,
- -0.933241270357061460782e-5L,
+ static_cast<T>(0.24339294433593750202L),
+ static_cast<T>(-0.49092470516353571651L),
+ static_cast<T>(0.0557616214776046784287L),
+ static_cast<T>(-0.00320912498879085894856L),
+ static_cast<T>(0.000451534528645796438704L),
+ static_cast<T>(-0.933241270357061460782e-5L),
};
static const T Q[6] = {
- 1L,
- -0.279960334310344432495L,
- 0.0419676223309986037706L,
- -0.00413421406552171059003L,
- 0.00024978985622317935355L,
- -0.101855788418564031874e-4L,
+ static_cast<T>(1L),
+ static_cast<T>(-0.279960334310344432495L),
+ static_cast<T>(0.0419676223309986037706L),
+ static_cast<T>(-0.00413421406552171059003L),
+ static_cast<T>(0.00024978985622317935355L),
+ static_cast<T>(-0.101855788418564031874e-4L),
};
result = tools::evaluate_polynomial(P, sc) / tools::evaluate_polynomial(Q, sc);
result -= 1.2433929443359375F;
@@ -225,20 +225,20 @@ inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
// Maximum Deviation Found: 9.007e-20
// Expected Error Term: 9.007e-20
static const T P[6] = {
- 0.577215664901532860516,
- 0.243210646940107164097,
- 0.0417364673988216497593,
- 0.00390252087072843288378,
- 0.000249606367151877175456,
- 0.110108440976732897969e-4,
+ static_cast<T>(0.577215664901532860516L),
+ static_cast<T>(0.243210646940107164097L),
+ static_cast<T>(0.0417364673988216497593L),
+ static_cast<T>(0.00390252087072843288378L),
+ static_cast<T>(0.000249606367151877175456L),
+ static_cast<T>(0.110108440976732897969e-4L),
};
static const T Q[6] = {
- 1,
- 0.295201277126631761737,
- 0.043460910607305495864,
- 0.00434930582085826330659,
- 0.000255784226140488490982,
- 0.10991819782396112081e-4,
+ static_cast<T>(1.0),
+ static_cast<T>(0.295201277126631761737L),
+ static_cast<T>(0.043460910607305495864L),
+ static_cast<T>(0.00434930582085826330659L),
+ static_cast<T>(0.000255784226140488490982L),
+ static_cast<T>(0.10991819782396112081e-4L),
};
result = tools::evaluate_polynomial(P, T(-sc)) / tools::evaluate_polynomial(Q, T(-sc));
result += 1 / (-sc);
@@ -249,21 +249,21 @@ inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
// Expected Error Term: -5.946e-22
static const float Y = 0.6986598968505859375;
static const T P[6] = {
- -0.0537258300023595030676,
- 0.0445163473292365591906,
- 0.0128677673534519952905,
- 0.00097541770457391752726,
- 0.769875101573654070925e-4,
- 0.328032510000383084155e-5,
+ static_cast<T>(-0.0537258300023595030676L),
+ static_cast<T>(0.0445163473292365591906L),
+ static_cast<T>(0.0128677673534519952905L),
+ static_cast<T>(0.00097541770457391752726L),
+ static_cast<T>(0.769875101573654070925e-4L),
+ static_cast<T>(0.328032510000383084155e-5L),
};
static const T Q[7] = {
- 1,
- 0.33383194553034051422,
- 0.0487798431291407621462,
- 0.00479039708573558490716,
- 0.000270776703956336357707,
- 0.106951867532057341359e-4,
- 0.236276623974978646399e-7,
+ 1.0f,
+ static_cast<T>(0.33383194553034051422L),
+ static_cast<T>(0.0487798431291407621462L),
+ static_cast<T>(0.00479039708573558490716L),
+ static_cast<T>(0.000270776703956336357707L),
+ static_cast<T>(0.106951867532057341359e-4L),
+ static_cast<T>(0.236276623974978646399e-7L),
};
result = tools::evaluate_polynomial(P, T(s - 2)) / tools::evaluate_polynomial(Q, T(s - 2));
result += Y + 1 / (-sc);
@@ -275,23 +275,23 @@ inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
// Max error found at double precision: 2.009135e-16
static const T P[6] = {
- -2.49710190602259410021,
- -2.60013301809475665334,
- -0.939260435377109939261,
- -0.138448617995741530935,
- -0.00701721240549802377623,
- -0.229257310594893932383e-4,
+ static_cast<T>(-2.49710190602259410021L),
+ static_cast<T>(-2.60013301809475665334L),
+ static_cast<T>(-0.939260435377109939261L),
+ static_cast<T>(-0.138448617995741530935L),
+ static_cast<T>(-0.00701721240549802377623L),
+ static_cast<T>(-0.229257310594893932383e-4L),
};
static const T Q[9] = {
- 1,
- 0.706039025937745133628,
- 0.15739599649558626358,
- 0.0106117950976845084417,
- -0.36910273311764618902e-4,
- 0.493409563927590008943e-5,
- -0.234055487025287216506e-6,
- 0.718833729365459760664e-8,
- -0.1129200113474947419e-9,
+ 1.0f,
+ static_cast<T>(0.706039025937745133628L),
+ static_cast<T>(0.15739599649558626358L),
+ static_cast<T>(0.0106117950976845084417L),
+ static_cast<T>(-0.36910273311764618902e-4L),
+ static_cast<T>(0.493409563927590008943e-5L),
+ static_cast<T>(-0.234055487025287216506e-6L),
+ static_cast<T>(0.718833729365459760664e-8L),
+ static_cast<T>(-0.1129200113474947419e-9L),
};
result = tools::evaluate_polynomial(P, T(s - 4)) / tools::evaluate_polynomial(Q, T(s - 4));
result = 1 + exp(result);
@@ -302,24 +302,24 @@ inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
// Expected Error Term: 7.117e-16
// Max error found at double precision: 9.387771e-16
static const T P[7] = {
- -4.78558028495135619286,
- -1.89197364881972536382,
- -0.211407134874412820099,
- -0.000189204758260076688518,
- 0.00115140923889178742086,
- 0.639949204213164496988e-4,
- 0.139348932445324888343e-5,
+ static_cast<T>(-4.78558028495135619286L),
+ static_cast<T>(-1.89197364881972536382L),
+ static_cast<T>(-0.211407134874412820099L),
+ static_cast<T>(-0.000189204758260076688518L),
+ static_cast<T>(0.00115140923889178742086L),
+ static_cast<T>(0.639949204213164496988e-4L),
+ static_cast<T>(0.139348932445324888343e-5L),
};
static const T Q[9] = {
- 1,
- 0.244345337378188557777,
- 0.00873370754492288653669,
- -0.00117592765334434471562,
- -0.743743682899933180415e-4,
- -0.21750464515767984778e-5,
- 0.471001264003076486547e-8,
- -0.833378440625385520576e-10,
- 0.699841545204845636531e-12,
+ 1.0f,
+ static_cast<T>(0.244345337378188557777L),
+ static_cast<T>(0.00873370754492288653669L),
+ static_cast<T>(-0.00117592765334434471562L),
+ static_cast<T>(-0.743743682899933180415e-4L),
+ static_cast<T>(-0.21750464515767984778e-5L),
+ static_cast<T>(0.471001264003076486547e-8L),
+ static_cast<T>(-0.833378440625385520576e-10L),
+ static_cast<T>(0.699841545204845636531e-12L),
};
result = tools::evaluate_polynomial(P, T(s - 7)) / tools::evaluate_polynomial(Q, T(s - 7));
result = 1 + exp(result);
@@ -329,24 +329,24 @@ inline T zeta_imp_prec(T s, T sc, const Policy&, const mpl::int_<53>&)
// Max error in interpolated form: 1.668e-17
// Max error found at long double precision: 1.669714e-17
static const T P[8] = {
- -10.3948950573308896825,
- -2.85827219671106697179,
- -0.347728266539245787271,
- -0.0251156064655346341766,
- -0.00119459173416968685689,
- -0.382529323507967522614e-4,
- -0.785523633796723466968e-6,
- -0.821465709095465524192e-8,
+ static_cast<T>(-10.3948950573308896825L),
+ static_cast<T>(-2.85827219671106697179L),
+ static_cast<T>(-0.347728266539245787271L),
+ static_cast<T>(-0.0251156064655346341766L),
+ static_cast<T>(-0.00119459173416968685689L),
+ static_cast<T>(-0.382529323507967522614e-4L),
+ static_cast<T>(-0.785523633796723466968e-6L),
+ static_cast<T>(-0.821465709095465524192e-8L),
};
static const T Q[10] = {
- 1,
- 0.208196333572671890965,
- 0.0195687657317205033485,
- 0.00111079638102485921877,
- 0.408507746266039256231e-4,
- 0.955561123065693483991e-6,
- 0.118507153474022900583e-7,
- 0.222609483627352615142e-14,
+ 1.0f,
+ static_cast<T>(0.208196333572671890965L),
+ static_cast<T>(0.0195687657317205033485L),
+ static_cast<T>(0.00111079638102485921877L),
+ static_cast<T>(0.408507746266039256231e-4L),
+ static_cast<T>(0.955561123065693483991e-6L),
+ static_cast<T>(0.118507153474022900583e-7L),
+ static_cast<T>(0.222609483627352615142e-14L),
};
result = tools::evaluate_polynomial(P, T(s - 15)) / tools::evaluate_polynomial(Q, T(s - 15));
result = 1 + exp(result);
@@ -883,14 +883,14 @@ T zeta_imp_odd_integer(int s, const T& sc, const Policy& pol, const mpl::false_&
if(!is_init)
{
is_init = true;
- for(int k = 0; k < sizeof(results) / sizeof(results[0]); ++k)
+ for(unsigned k = 0; k < sizeof(results) / sizeof(results[0]); ++k)
{
T arg = k * 2 + 3;
T c_arg = 1 - arg;
results[k] = zeta_polynomial_series(arg, c_arg, pol);
}
}
- int index = (s - 3) / 2;
+ unsigned index = (s - 3) / 2;
return index >= sizeof(results) / sizeof(results[0]) ? zeta_polynomial_series(T(s), sc, pol): results[index];
}
@@ -915,8 +915,12 @@ T zeta_imp(T s, T sc, const Policy& pol, const Tag& tag)
//
if(floor(s) == s)
{
+#ifndef BOOST_NO_EXCEPTIONS
+ // Without exceptions we expect itrunc to return INT_MAX on overflow
+ // and we fall through anyway.
try
{
+#endif
int v = itrunc(s);
if(v == s)
{
@@ -925,12 +929,12 @@ T zeta_imp(T s, T sc, const Policy& pol, const Tag& tag)
if(((-v) & 1) == 0)
return 0;
int n = (-v + 1) / 2;
- if(n <= boost::math::max_bernoulli_b2n<T>::value)
+ if(n <= (int)boost::math::max_bernoulli_b2n<T>::value)
return T((-v & 1) ? -1 : 1) * boost::math::unchecked_bernoulli_b2n<T>(n) / (1 - v);
}
else if((v & 1) == 0)
{
- if(((v / 2) <= boost::math::max_bernoulli_b2n<T>::value) && (v <= boost::math::max_factorial<T>::value))
+ if(((v / 2) <= (int)boost::math::max_bernoulli_b2n<T>::value) && (v <= (int)boost::math::max_factorial<T>::value))
return T(((v / 2 - 1) & 1) ? -1 : 1) * ldexp(T(1), v - 1) * pow(constants::pi<T, Policy>(), v) *
boost::math::unchecked_bernoulli_b2n<T>(v / 2) / boost::math::unchecked_factorial<T>(v);
return T(((v / 2 - 1) & 1) ? -1 : 1) * ldexp(T(1), v - 1) * pow(constants::pi<T, Policy>(), v) *
@@ -939,9 +943,11 @@ T zeta_imp(T s, T sc, const Policy& pol, const Tag& tag)
else
return zeta_imp_odd_integer(v, sc, pol, mpl::bool_<(Tag::value <= 113) && Tag::value>());
}
+#ifndef BOOST_NO_EXCEPTIONS
}
catch(const boost::math::rounding_error&){} // Just fall through, s is too large to round
catch(const std::overflow_error&){}
+#endif
}
if(fabs(s) < tools::root_epsilon<T>())
diff --git a/boost/math/tools/big_constant.hpp b/boost/math/tools/big_constant.hpp
index ff136337e1..4386609989 100644
--- a/boost/math/tools/big_constant.hpp
+++ b/boost/math/tools/big_constant.hpp
@@ -37,12 +37,12 @@ typedef long double largest_float;
#endif
template <class T>
-inline BOOST_CONSTEXPR_OR_CONST T make_big_value(largest_float v, const char*, mpl::true_ const&, mpl::false_ const&)
+inline BOOST_CONSTEXPR_OR_CONST T make_big_value(largest_float v, const char*, mpl::true_ const&, mpl::false_ const&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(v);
}
template <class T>
-inline BOOST_CONSTEXPR_OR_CONST T make_big_value(largest_float v, const char*, mpl::true_ const&, mpl::true_ const&)
+inline BOOST_CONSTEXPR_OR_CONST T make_big_value(largest_float v, const char*, mpl::true_ const&, mpl::true_ const&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(v);
}
@@ -54,7 +54,7 @@ inline T make_big_value(largest_float, const char* s, mpl::false_ const&, mpl::f
}
#endif
template <class T>
-inline BOOST_CONSTEXPR const char* make_big_value(largest_float, const char* s, mpl::false_ const&, mpl::true_ const&)
+inline BOOST_MATH_CONSTEXPR const char* make_big_value(largest_float, const char* s, mpl::false_ const&, mpl::true_ const&) BOOST_MATH_NOEXCEPT(T)
{
return s;
}
diff --git a/boost/math/tools/config.hpp b/boost/math/tools/config.hpp
index e88f578db7..ffd0ab43a6 100644
--- a/boost/math/tools/config.hpp
+++ b/boost/math/tools/config.hpp
@@ -11,6 +11,7 @@
#endif
#include <boost/config.hpp>
+#include <boost/predef.h>
#include <boost/cstdint.hpp> // for boost::uintmax_t
#include <boost/detail/workaround.hpp>
#include <boost/type_traits/is_integral.hpp>
@@ -183,14 +184,20 @@
//
#ifdef BOOST_MSVC
# define BOOST_MATH_POLY_METHOD 2
+# define BOOST_MATH_RATIONAL_METHOD 1
#elif defined(BOOST_INTEL)
# define BOOST_MATH_POLY_METHOD 2
-# define BOOST_MATH_RATIONAL_METHOD 2
+# define BOOST_MATH_RATIONAL_METHOD 1
#elif defined(__GNUC__)
+#if __GNUC__ < 4
# define BOOST_MATH_POLY_METHOD 3
# define BOOST_MATH_RATIONAL_METHOD 3
# define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
# define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##.0L
+#else
+# define BOOST_MATH_POLY_METHOD 3
+# define BOOST_MATH_RATIONAL_METHOD 1
+#endif
#endif
#if defined(BOOST_NO_LONG_LONG) && !defined(BOOST_MATH_INT_TABLE_TYPE)
@@ -199,20 +206,54 @@
#endif
//
+// constexpr support, early GCC implementations can't cope so disable
+// constexpr for them:
+//
+#if !defined(__clang) && defined(__GNUC__)
+#if (__GNUC__ * 100 + __GNUC_MINOR__) < 490
+# define BOOST_MATH_DISABLE_CONSTEXPR
+#endif
+#endif
+
+#ifdef BOOST_MATH_DISABLE_CONSTEXPR
+# define BOOST_MATH_CONSTEXPR
+#else
+# define BOOST_MATH_CONSTEXPR BOOST_CONSTEXPR
+#endif
+
+//
+// noexcept support:
+//
+#ifndef BOOST_NO_CXX11_NOEXCEPT
+#ifndef BOOST_NO_CXX11_HDR_TYPE_TRAITS
+#include <type_traits>
+# define BOOST_MATH_NOEXCEPT(T) noexcept(std::is_floating_point<T>::value)
+# define BOOST_MATH_IS_FLOAT(T) (std::is_floating_point<T>::value)
+#else
+#include <boost/type_traits/is_floating_point.hpp>
+# define BOOST_MATH_NOEXCEPT(T) noexcept(boost::is_floating_point<T>::value)
+# define BOOST_MATH_IS_FLOAT(T) (boost::is_floating_point<T>::value)
+#endif
+#else
+# define BOOST_MATH_NOEXCEPT(T)
+# define BOOST_MATH_IS_FLOAT(T) false
+#endif
+
+//
// The maximum order of polynomial that will be evaluated
// via an unrolled specialisation:
//
#ifndef BOOST_MATH_MAX_POLY_ORDER
-# define BOOST_MATH_MAX_POLY_ORDER 17
+# define BOOST_MATH_MAX_POLY_ORDER 20
#endif
//
// Set the method used to evaluate polynomials and rationals:
//
#ifndef BOOST_MATH_POLY_METHOD
-# define BOOST_MATH_POLY_METHOD 1
+# define BOOST_MATH_POLY_METHOD 2
#endif
#ifndef BOOST_MATH_RATIONAL_METHOD
-# define BOOST_MATH_RATIONAL_METHOD 0
+# define BOOST_MATH_RATIONAL_METHOD 1
#endif
//
// decide whether to store constants as integers or reals:
@@ -224,7 +265,19 @@
# define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##SUF
#endif
//
-// Test whether to support __float128:
+// Test whether to support __float128, if we don't have quadmath.h then this can't currently work:
+//
+#ifndef BOOST_MATH_USE_FLOAT128
+#ifdef __has_include
+#if ! __has_include("quadmath.h")
+#define BOOST_MATH_DISABLE_FLOAT128
+#endif
+#elif !defined(BOOST_ARCH_X86)
+#define BOOST_MATH_DISABLE_FLOAT128
+#endif
+#endif
+//
+// And then the actual configuration:
//
#if defined(_GLIBCXX_USE_FLOAT128) && defined(BOOST_GCC) && !defined(__STRICT_ANSI__) \
&& !defined(BOOST_MATH_DISABLE_FLOAT128) || defined(BOOST_MATH_USE_FLOAT128)
@@ -296,13 +349,13 @@ namespace tools
{
template <class T>
-inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c)
+inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c) BOOST_MATH_NOEXCEPT(T)
{
return (std::max)((std::max)(a, b), c);
}
template <class T>
-inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c, T d)
+inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c, T d) BOOST_MATH_NOEXCEPT(T)
{
return (std::max)((std::max)(a, b), (std::max)(c, d));
}
@@ -310,7 +363,7 @@ inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c, T d)
} // namespace tools
template <class T>
-void suppress_unused_variable_warning(const T&)
+void suppress_unused_variable_warning(const T&) BOOST_MATH_NOEXCEPT(T)
{
}
diff --git a/boost/math/tools/detail/polynomial_horner1_10.hpp b/boost/math/tools/detail/polynomial_horner1_10.hpp
index b13d6a3887..48cf9e39b3 100644
--- a/boost/math/tools/detail/polynomial_horner1_10.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_10.hpp
@@ -12,67 +12,67 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_11.hpp b/boost/math/tools/detail/polynomial_horner1_11.hpp
index f0cf67e959..e52595429e 100644
--- a/boost/math/tools/detail/polynomial_horner1_11.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_11.hpp
@@ -12,73 +12,73 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_12.hpp b/boost/math/tools/detail/polynomial_horner1_12.hpp
index 03b974ceca..10cd178975 100644
--- a/boost/math/tools/detail/polynomial_horner1_12.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_12.hpp
@@ -12,79 +12,79 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_13.hpp b/boost/math/tools/detail/polynomial_horner1_13.hpp
index b947f542c3..90fa9ec43d 100644
--- a/boost/math/tools/detail/polynomial_horner1_13.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_13.hpp
@@ -12,85 +12,85 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_14.hpp b/boost/math/tools/detail/polynomial_horner1_14.hpp
index 8374e38904..389c8063b0 100644
--- a/boost/math/tools/detail/polynomial_horner1_14.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_14.hpp
@@ -12,91 +12,91 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_15.hpp b/boost/math/tools/detail/polynomial_horner1_15.hpp
index ebfa463601..d196a41603 100644
--- a/boost/math/tools/detail/polynomial_horner1_15.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_15.hpp
@@ -12,97 +12,97 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_16.hpp b/boost/math/tools/detail/polynomial_horner1_16.hpp
index 60eb4dc675..fa48c6614c 100644
--- a/boost/math/tools/detail/polynomial_horner1_16.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_16.hpp
@@ -12,103 +12,103 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_17.hpp b/boost/math/tools/detail/polynomial_horner1_17.hpp
index 6233f1b07b..4575aeac7b 100644
--- a/boost/math/tools/detail/polynomial_horner1_17.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_17.hpp
@@ -12,109 +12,109 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_18.hpp b/boost/math/tools/detail/polynomial_horner1_18.hpp
index 2a06def44b..95dd400416 100644
--- a/boost/math/tools/detail/polynomial_horner1_18.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_18.hpp
@@ -12,115 +12,115 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_19.hpp b/boost/math/tools/detail/polynomial_horner1_19.hpp
index 8f0da8b219..6d73eb8ffc 100644
--- a/boost/math/tools/detail/polynomial_horner1_19.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_19.hpp
@@ -12,121 +12,121 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_2.hpp b/boost/math/tools/detail/polynomial_horner1_2.hpp
index a0b10d5ee5..85640edf67 100644
--- a/boost/math/tools/detail/polynomial_horner1_2.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_2.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_20.hpp b/boost/math/tools/detail/polynomial_horner1_20.hpp
index d1a886dd76..f8b7f34384 100644
--- a/boost/math/tools/detail/polynomial_horner1_20.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_20.hpp
@@ -12,127 +12,127 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((((((((((((((a[19] * x + a[18]) * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_3.hpp b/boost/math/tools/detail/polynomial_horner1_3.hpp
index 715a69aee0..c0ad4660e9 100644
--- a/boost/math/tools/detail/polynomial_horner1_3.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_3.hpp
@@ -12,25 +12,25 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_4.hpp b/boost/math/tools/detail/polynomial_horner1_4.hpp
index d74b7a6386..27ad74eb95 100644
--- a/boost/math/tools/detail/polynomial_horner1_4.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_4.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_5.hpp b/boost/math/tools/detail/polynomial_horner1_5.hpp
index bb66e6c41d..5cfafb4052 100644
--- a/boost/math/tools/detail/polynomial_horner1_5.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_5.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_6.hpp b/boost/math/tools/detail/polynomial_horner1_6.hpp
index a29c2710e8..f7f4bee480 100644
--- a/boost/math/tools/detail/polynomial_horner1_6.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_6.hpp
@@ -12,43 +12,43 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_7.hpp b/boost/math/tools/detail/polynomial_horner1_7.hpp
index 093ab89b02..c612822fc0 100644
--- a/boost/math/tools/detail/polynomial_horner1_7.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_7.hpp
@@ -12,49 +12,49 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_8.hpp b/boost/math/tools/detail/polynomial_horner1_8.hpp
index a3d329a37b..5d9b453b9d 100644
--- a/boost/math/tools/detail/polynomial_horner1_8.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_8.hpp
@@ -12,55 +12,55 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner1_9.hpp b/boost/math/tools/detail/polynomial_horner1_9.hpp
index e90f578d04..84977fd13b 100644
--- a/boost/math/tools/detail/polynomial_horner1_9.hpp
+++ b/boost/math/tools/detail/polynomial_horner1_9.hpp
@@ -12,61 +12,61 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner2_10.hpp b/boost/math/tools/detail/polynomial_horner2_10.hpp
index 7c4101f465..f10c5d0492 100644
--- a/boost/math/tools/detail/polynomial_horner2_10.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_10.hpp
@@ -12,72 +12,72 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_11.hpp b/boost/math/tools/detail/polynomial_horner2_11.hpp
index bebd1e6483..757357addf 100644
--- a/boost/math/tools/detail/polynomial_horner2_11.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_11.hpp
@@ -12,79 +12,79 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_12.hpp b/boost/math/tools/detail/polynomial_horner2_12.hpp
index c4da24ac88..e0fc8a9df7 100644
--- a/boost/math/tools/detail/polynomial_horner2_12.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_12.hpp
@@ -12,86 +12,86 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_13.hpp b/boost/math/tools/detail/polynomial_horner2_13.hpp
index 5d7dddc5b5..c13a0a7cc2 100644
--- a/boost/math/tools/detail/polynomial_horner2_13.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_13.hpp
@@ -12,93 +12,93 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_14.hpp b/boost/math/tools/detail/polynomial_horner2_14.hpp
index 21a5a37903..ccc6e7d8da 100644
--- a/boost/math/tools/detail/polynomial_horner2_14.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_14.hpp
@@ -12,100 +12,100 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_15.hpp b/boost/math/tools/detail/polynomial_horner2_15.hpp
index 7b41214466..a409ba7fdb 100644
--- a/boost/math/tools/detail/polynomial_horner2_15.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_15.hpp
@@ -12,107 +12,107 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_16.hpp b/boost/math/tools/detail/polynomial_horner2_16.hpp
index aa3763ad65..a69c1a3619 100644
--- a/boost/math/tools/detail/polynomial_horner2_16.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_16.hpp
@@ -12,114 +12,114 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_17.hpp b/boost/math/tools/detail/polynomial_horner2_17.hpp
index 6ed5566d49..9e7c05d007 100644
--- a/boost/math/tools/detail/polynomial_horner2_17.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_17.hpp
@@ -12,121 +12,121 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_18.hpp b/boost/math/tools/detail/polynomial_horner2_18.hpp
index 02c72b8227..1ea0e052c0 100644
--- a/boost/math/tools/detail/polynomial_horner2_18.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_18.hpp
@@ -12,128 +12,128 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_19.hpp b/boost/math/tools/detail/polynomial_horner2_19.hpp
index 6e36ace904..45c125c871 100644
--- a/boost/math/tools/detail/polynomial_horner2_19.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_19.hpp
@@ -12,135 +12,135 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_2.hpp b/boost/math/tools/detail/polynomial_horner2_2.hpp
index e2a4e7faef..20da483c33 100644
--- a/boost/math/tools/detail/polynomial_horner2_2.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_2.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner2_20.hpp b/boost/math/tools/detail/polynomial_horner2_20.hpp
index e394b6b325..956c6dba4f 100644
--- a/boost/math/tools/detail/polynomial_horner2_20.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_20.hpp
@@ -12,142 +12,142 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((a[9] * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((a[10] * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((a[11] * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((a[12] * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((a[13] * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((a[14] * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((((((a[15] * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + (((((((a[16] * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((((((((a[17] * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((((((((a[19] * x2 + a[17]) * x2 + a[15]) * x2 + a[13]) * x2 + a[11]) * x2 + a[9]) * x2 + a[7]) * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((((((((a[18] * x2 + a[16]) * x2 + a[14]) * x2 + a[12]) * x2 + a[10]) * x2 + a[8]) * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_3.hpp b/boost/math/tools/detail/polynomial_horner2_3.hpp
index 187b86c1ce..58b290c7c9 100644
--- a/boost/math/tools/detail/polynomial_horner2_3.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_3.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner2_4.hpp b/boost/math/tools/detail/polynomial_horner2_4.hpp
index 84badc365a..74f969b749 100644
--- a/boost/math/tools/detail/polynomial_horner2_4.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_4.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner2_5.hpp b/boost/math/tools/detail/polynomial_horner2_5.hpp
index 287b4be08e..134cbc8ef9 100644
--- a/boost/math/tools/detail/polynomial_horner2_5.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_5.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_6.hpp b/boost/math/tools/detail/polynomial_horner2_6.hpp
index 3662d44f93..7cb75d75c8 100644
--- a/boost/math/tools/detail/polynomial_horner2_6.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_6.hpp
@@ -12,44 +12,44 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_7.hpp b/boost/math/tools/detail/polynomial_horner2_7.hpp
index 78ed0df54d..327639deb6 100644
--- a/boost/math/tools/detail/polynomial_horner2_7.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_7.hpp
@@ -12,51 +12,51 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner2_8.hpp b/boost/math/tools/detail/polynomial_horner2_8.hpp
index ac8e941180..2145ad6dcd 100644
--- a/boost/math/tools/detail/polynomial_horner2_8.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_8.hpp
@@ -12,58 +12,58 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
diff --git a/boost/math/tools/detail/polynomial_horner2_9.hpp b/boost/math/tools/detail/polynomial_horner2_9.hpp
index e1a3d17eca..08f6336e49 100644
--- a/boost/math/tools/detail/polynomial_horner2_9.hpp
+++ b/boost/math/tools/detail/polynomial_horner2_9.hpp
@@ -12,65 +12,65 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((a[4] * x2 + a[2]) * x2 + a[0] + (a[3] * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[5] * x2 + a[3]) * x2 + a[1]) * x + (a[4] * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>(((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + ((a[5] * x2 + a[3]) * x2 + a[1]) * x);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x + ((a[6] * x2 + a[4]) * x2 + a[2]) * x2 + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
return static_cast<V>((((a[8] * x2 + a[6]) * x2 + a[4]) * x2 + a[2]) * x2 + a[0] + (((a[7] * x2 + a[5]) * x2 + a[3]) * x2 + a[1]) * x);
diff --git a/boost/math/tools/detail/polynomial_horner3_10.hpp b/boost/math/tools/detail/polynomial_horner3_10.hpp
index 69736d7118..05ad20cc30 100644
--- a/boost/math/tools/detail/polynomial_horner3_10.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_10.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_11.hpp b/boost/math/tools/detail/polynomial_horner3_11.hpp
index 273ed535cc..9f8628e750 100644
--- a/boost/math/tools/detail/polynomial_horner3_11.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_11.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_12.hpp b/boost/math/tools/detail/polynomial_horner3_12.hpp
index 340567400b..ccb3ec4d10 100644
--- a/boost/math/tools/detail/polynomial_horner3_12.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_12.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_13.hpp b/boost/math/tools/detail/polynomial_horner3_13.hpp
index 849c93e54a..a8cdf2c508 100644
--- a/boost/math/tools/detail/polynomial_horner3_13.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_13.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_14.hpp b/boost/math/tools/detail/polynomial_horner3_14.hpp
index f5ac1df9d1..5eb4ef1f28 100644
--- a/boost/math/tools/detail/polynomial_horner3_14.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_14.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_15.hpp b/boost/math/tools/detail/polynomial_horner3_15.hpp
index b57af7e3dc..7e8edcd8aa 100644
--- a/boost/math/tools/detail/polynomial_horner3_15.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_15.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -262,7 +262,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_16.hpp b/boost/math/tools/detail/polynomial_horner3_16.hpp
index 1fc8560a21..58bea1581f 100644
--- a/boost/math/tools/detail/polynomial_horner3_16.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_16.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -262,7 +262,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -295,7 +295,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_17.hpp b/boost/math/tools/detail/polynomial_horner3_17.hpp
index 4a0d0aa472..007b8a4918 100644
--- a/boost/math/tools/detail/polynomial_horner3_17.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_17.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -262,7 +262,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -295,7 +295,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -330,7 +330,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_18.hpp b/boost/math/tools/detail/polynomial_horner3_18.hpp
index 899117d2f9..68935adba1 100644
--- a/boost/math/tools/detail/polynomial_horner3_18.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_18.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -262,7 +262,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -295,7 +295,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -330,7 +330,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -367,7 +367,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_19.hpp b/boost/math/tools/detail/polynomial_horner3_19.hpp
index 7c4f728419..acffba6b47 100644
--- a/boost/math/tools/detail/polynomial_horner3_19.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_19.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -262,7 +262,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -295,7 +295,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -330,7 +330,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -367,7 +367,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -406,7 +406,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_2.hpp b/boost/math/tools/detail/polynomial_horner3_2.hpp
index 372630cfd9..6b8d9a71f8 100644
--- a/boost/math/tools/detail/polynomial_horner3_2.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_2.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner3_20.hpp b/boost/math/tools/detail/polynomial_horner3_20.hpp
index b20e0d5fe1..b3a170c095 100644
--- a/boost/math/tools/detail/polynomial_horner3_20.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_20.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -127,7 +127,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -150,7 +150,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<10>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -175,7 +175,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<11>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -202,7 +202,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<12>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -231,7 +231,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<13>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -262,7 +262,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<14>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -295,7 +295,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<15>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -330,7 +330,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<16>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -367,7 +367,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<17>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -406,7 +406,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<18>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -447,7 +447,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<19>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<20>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_3.hpp b/boost/math/tools/detail/polynomial_horner3_3.hpp
index cc6b1a9351..05fe88fccc 100644
--- a/boost/math/tools/detail/polynomial_horner3_3.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_3.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner3_4.hpp b/boost/math/tools/detail/polynomial_horner3_4.hpp
index 74192f0c90..b98d6f678d 100644
--- a/boost/math/tools/detail/polynomial_horner3_4.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_4.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
diff --git a/boost/math/tools/detail/polynomial_horner3_5.hpp b/boost/math/tools/detail/polynomial_horner3_5.hpp
index 73d1900998..12e639cef3 100644
--- a/boost/math/tools/detail/polynomial_horner3_5.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_5.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_6.hpp b/boost/math/tools/detail/polynomial_horner3_6.hpp
index da02574866..b645cb5bbc 100644
--- a/boost/math/tools/detail/polynomial_horner3_6.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_6.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_7.hpp b/boost/math/tools/detail/polynomial_horner3_7.hpp
index d45a622278..3df4b5b4ef 100644
--- a/boost/math/tools/detail/polynomial_horner3_7.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_7.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_8.hpp b/boost/math/tools/detail/polynomial_horner3_8.hpp
index d0198bf345..9a49d2555e 100644
--- a/boost/math/tools/detail/polynomial_horner3_8.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_8.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/polynomial_horner3_9.hpp b/boost/math/tools/detail/polynomial_horner3_9.hpp
index b3e0b19970..3507d37604 100644
--- a/boost/math/tools/detail/polynomial_horner3_9.hpp
+++ b/boost/math/tools/detail/polynomial_horner3_9.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*)
+inline V evaluate_polynomial_c_imp(const T*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[1] * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[2] * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[3] * x + a[2]) * x + a[1]) * x + a[0]);
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -55,7 +55,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<5>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -70,7 +70,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<6>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -87,7 +87,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<7>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
@@ -106,7 +106,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<8>*)
}
template <class T, class V>
-inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
V x2 = x * x;
V t[2];
diff --git a/boost/math/tools/detail/rational_horner1_10.hpp b/boost/math/tools/detail/rational_horner1_10.hpp
index 919ba6d09f..e670853869 100644
--- a/boost/math/tools/detail/rational_horner1_10.hpp
+++ b/boost/math/tools/detail/rational_horner1_10.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_11.hpp b/boost/math/tools/detail/rational_horner1_11.hpp
index e17bfbc723..65e17598ff 100644
--- a/boost/math/tools/detail/rational_horner1_11.hpp
+++ b/boost/math/tools/detail/rational_horner1_11.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_12.hpp b/boost/math/tools/detail/rational_horner1_12.hpp
index 67b430a990..de33af0e07 100644
--- a/boost/math/tools/detail/rational_horner1_12.hpp
+++ b/boost/math/tools/detail/rational_horner1_12.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_13.hpp b/boost/math/tools/detail/rational_horner1_13.hpp
index 33ae67523c..ed4ac1af8b 100644
--- a/boost/math/tools/detail/rational_horner1_13.hpp
+++ b/boost/math/tools/detail/rational_horner1_13.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_14.hpp b/boost/math/tools/detail/rational_horner1_14.hpp
index 0c5f1884c6..a3222f8212 100644
--- a/boost/math/tools/detail/rational_horner1_14.hpp
+++ b/boost/math/tools/detail/rational_horner1_14.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_15.hpp b/boost/math/tools/detail/rational_horner1_15.hpp
index 848190761f..c8cd691573 100644
--- a/boost/math/tools/detail/rational_horner1_15.hpp
+++ b/boost/math/tools/detail/rational_horner1_15.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_16.hpp b/boost/math/tools/detail/rational_horner1_16.hpp
index e0661f8b3e..8003c82db7 100644
--- a/boost/math/tools/detail/rational_horner1_16.hpp
+++ b/boost/math/tools/detail/rational_horner1_16.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -192,7 +192,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_17.hpp b/boost/math/tools/detail/rational_horner1_17.hpp
index f123da4c95..294c3f175d 100644
--- a/boost/math/tools/detail/rational_horner1_17.hpp
+++ b/boost/math/tools/detail/rational_horner1_17.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -192,7 +192,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -204,7 +204,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_18.hpp b/boost/math/tools/detail/rational_horner1_18.hpp
index 718ace87fc..1a48bba097 100644
--- a/boost/math/tools/detail/rational_horner1_18.hpp
+++ b/boost/math/tools/detail/rational_horner1_18.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -192,7 +192,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -204,7 +204,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -216,7 +216,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((b[17] * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_19.hpp b/boost/math/tools/detail/rational_horner1_19.hpp
index c849ba8c06..12fd75cf1b 100644
--- a/boost/math/tools/detail/rational_horner1_19.hpp
+++ b/boost/math/tools/detail/rational_horner1_19.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -192,7 +192,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -204,7 +204,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -216,7 +216,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((b[17] * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -228,7 +228,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((((b[18] * x + b[17]) * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_2.hpp b/boost/math/tools/detail/rational_horner1_2.hpp
index 87e41ab3f9..c838f2a2cd 100644
--- a/boost/math/tools/detail/rational_horner1_2.hpp
+++ b/boost/math/tools/detail/rational_horner1_2.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_20.hpp b/boost/math/tools/detail/rational_horner1_20.hpp
index e05eaaa89b..3ee3e966e6 100644
--- a/boost/math/tools/detail/rational_horner1_20.hpp
+++ b/boost/math/tools/detail/rational_horner1_20.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -120,7 +120,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((a[9] * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((b[9] * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -132,7 +132,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((a[10] * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((b[10] * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -144,7 +144,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((a[11] * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((b[11] * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -156,7 +156,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((a[12] * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((b[12] * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -168,7 +168,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((a[13] * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((b[13] * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((a[14] * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((b[14] * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -192,7 +192,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((a[15] * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((b[15] * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -204,7 +204,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((((a[16] * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((b[16] * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -216,7 +216,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((((a[17] * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((b[17] * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -228,7 +228,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((((((((((((a[18] * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((((((((((((b[18] * x + b[17]) * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -240,7 +240,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((((((((((((((a[19] * x + a[18]) * x + a[17]) * x + a[16]) * x + a[15]) * x + a[14]) * x + a[13]) * x + a[12]) * x + a[11]) * x + a[10]) * x + a[9]) * x + a[8]) * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((((((((((((((b[19] * x + b[18]) * x + b[17]) * x + b[16]) * x + b[15]) * x + b[14]) * x + b[13]) * x + b[12]) * x + b[11]) * x + b[10]) * x + b[9]) * x + b[8]) * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_3.hpp b/boost/math/tools/detail/rational_horner1_3.hpp
index ac1b785e93..034ead3f66 100644
--- a/boost/math/tools/detail/rational_horner1_3.hpp
+++ b/boost/math/tools/detail/rational_horner1_3.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_4.hpp b/boost/math/tools/detail/rational_horner1_4.hpp
index eeced600f4..de2972f4c4 100644
--- a/boost/math/tools/detail/rational_horner1_4.hpp
+++ b/boost/math/tools/detail/rational_horner1_4.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_5.hpp b/boost/math/tools/detail/rational_horner1_5.hpp
index 0479f66376..a59ff114d1 100644
--- a/boost/math/tools/detail/rational_horner1_5.hpp
+++ b/boost/math/tools/detail/rational_horner1_5.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_6.hpp b/boost/math/tools/detail/rational_horner1_6.hpp
index db259968ee..c5000c5db4 100644
--- a/boost/math/tools/detail/rational_horner1_6.hpp
+++ b/boost/math/tools/detail/rational_horner1_6.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_7.hpp b/boost/math/tools/detail/rational_horner1_7.hpp
index b431fe91ef..bc860f3bf7 100644
--- a/boost/math/tools/detail/rational_horner1_7.hpp
+++ b/boost/math/tools/detail/rational_horner1_7.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_8.hpp b/boost/math/tools/detail/rational_horner1_8.hpp
index 5a04a7a343..69368978b6 100644
--- a/boost/math/tools/detail/rational_horner1_8.hpp
+++ b/boost/math/tools/detail/rational_horner1_8.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner1_9.hpp b/boost/math/tools/detail/rational_horner1_9.hpp
index 4b5465fc4a..0aafea15fd 100644
--- a/boost/math/tools/detail/rational_horner1_9.hpp
+++ b/boost/math/tools/detail/rational_horner1_9.hpp
@@ -12,19 +12,19 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
@@ -36,7 +36,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
@@ -48,7 +48,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
@@ -60,7 +60,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((a[4] * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((b[4] * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -72,7 +72,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((a[5] * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((b[5] * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -84,7 +84,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((a[6] * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((b[6] * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -96,7 +96,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>((((((((a[7] * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / (((((((b[7] * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
@@ -108,7 +108,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
return static_cast<V>(((((((((a[8] * x + a[7]) * x + a[6]) * x + a[5]) * x + a[4]) * x + a[3]) * x + a[2]) * x + a[1]) * x + a[0]) / ((((((((b[8] * x + b[7]) * x + b[6]) * x + b[5]) * x + b[4]) * x + b[3]) * x + b[2]) * x + b[1]) * x + b[0]));
diff --git a/boost/math/tools/detail/rational_horner2_10.hpp b/boost/math/tools/detail/rational_horner2_10.hpp
index e26d2d934f..127777bc2a 100644
--- a/boost/math/tools/detail/rational_horner2_10.hpp
+++ b/boost/math/tools/detail/rational_horner2_10.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_11.hpp b/boost/math/tools/detail/rational_horner2_11.hpp
index c05e697197..53983ed4ad 100644
--- a/boost/math/tools/detail/rational_horner2_11.hpp
+++ b/boost/math/tools/detail/rational_horner2_11.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_12.hpp b/boost/math/tools/detail/rational_horner2_12.hpp
index 4ee3734001..4ad0856b06 100644
--- a/boost/math/tools/detail/rational_horner2_12.hpp
+++ b/boost/math/tools/detail/rational_horner2_12.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_13.hpp b/boost/math/tools/detail/rational_horner2_13.hpp
index 37977a111d..5f9303d0c3 100644
--- a/boost/math/tools/detail/rational_horner2_13.hpp
+++ b/boost/math/tools/detail/rational_horner2_13.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_14.hpp b/boost/math/tools/detail/rational_horner2_14.hpp
index 78edfbbe1b..dc512f393f 100644
--- a/boost/math/tools/detail/rational_horner2_14.hpp
+++ b/boost/math/tools/detail/rational_horner2_14.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_15.hpp b/boost/math/tools/detail/rational_horner2_15.hpp
index 3cf4ef56a0..cf084e8be0 100644
--- a/boost/math/tools/detail/rational_horner2_15.hpp
+++ b/boost/math/tools/detail/rational_horner2_15.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -202,7 +202,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_16.hpp b/boost/math/tools/detail/rational_horner2_16.hpp
index 3936a1ba4b..3d13db2553 100644
--- a/boost/math/tools/detail/rational_horner2_16.hpp
+++ b/boost/math/tools/detail/rational_horner2_16.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -202,7 +202,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -218,7 +218,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_17.hpp b/boost/math/tools/detail/rational_horner2_17.hpp
index 4d253b9593..3adf4053bd 100644
--- a/boost/math/tools/detail/rational_horner2_17.hpp
+++ b/boost/math/tools/detail/rational_horner2_17.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -202,7 +202,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -218,7 +218,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -234,7 +234,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_18.hpp b/boost/math/tools/detail/rational_horner2_18.hpp
index 6c213ecfb0..607609fd8e 100644
--- a/boost/math/tools/detail/rational_horner2_18.hpp
+++ b/boost/math/tools/detail/rational_horner2_18.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -202,7 +202,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -218,7 +218,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -234,7 +234,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -250,7 +250,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_19.hpp b/boost/math/tools/detail/rational_horner2_19.hpp
index 88e0b9ff01..bc324c3be3 100644
--- a/boost/math/tools/detail/rational_horner2_19.hpp
+++ b/boost/math/tools/detail/rational_horner2_19.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -202,7 +202,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -218,7 +218,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -234,7 +234,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -250,7 +250,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -266,7 +266,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_2.hpp b/boost/math/tools/detail/rational_horner2_2.hpp
index 35b5abb354..95ec0251d5 100644
--- a/boost/math/tools/detail/rational_horner2_2.hpp
+++ b/boost/math/tools/detail/rational_horner2_2.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
diff --git a/boost/math/tools/detail/rational_horner2_20.hpp b/boost/math/tools/detail/rational_horner2_20.hpp
index dc73fdd58e..cf1211b61f 100644
--- a/boost/math/tools/detail/rational_horner2_20.hpp
+++ b/boost/math/tools/detail/rational_horner2_20.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -122,7 +122,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -138,7 +138,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -154,7 +154,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -170,7 +170,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -186,7 +186,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -202,7 +202,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -218,7 +218,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -234,7 +234,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -250,7 +250,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -266,7 +266,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -282,7 +282,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_3.hpp b/boost/math/tools/detail/rational_horner2_3.hpp
index 8838ac13e6..9ce437b41f 100644
--- a/boost/math/tools/detail/rational_horner2_3.hpp
+++ b/boost/math/tools/detail/rational_horner2_3.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
diff --git a/boost/math/tools/detail/rational_horner2_4.hpp b/boost/math/tools/detail/rational_horner2_4.hpp
index 5fe5ada83b..00543ede85 100644
--- a/boost/math/tools/detail/rational_horner2_4.hpp
+++ b/boost/math/tools/detail/rational_horner2_4.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
diff --git a/boost/math/tools/detail/rational_horner2_5.hpp b/boost/math/tools/detail/rational_horner2_5.hpp
index 48b8498bc7..d117b66633 100644
--- a/boost/math/tools/detail/rational_horner2_5.hpp
+++ b/boost/math/tools/detail/rational_horner2_5.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_6.hpp b/boost/math/tools/detail/rational_horner2_6.hpp
index 83631eaf51..c431d16344 100644
--- a/boost/math/tools/detail/rational_horner2_6.hpp
+++ b/boost/math/tools/detail/rational_horner2_6.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_7.hpp b/boost/math/tools/detail/rational_horner2_7.hpp
index 3ed86eafcd..2104302472 100644
--- a/boost/math/tools/detail/rational_horner2_7.hpp
+++ b/boost/math/tools/detail/rational_horner2_7.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_8.hpp b/boost/math/tools/detail/rational_horner2_8.hpp
index f8b36ece4a..fd98289b99 100644
--- a/boost/math/tools/detail/rational_horner2_8.hpp
+++ b/boost/math/tools/detail/rational_horner2_8.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner2_9.hpp b/boost/math/tools/detail/rational_horner2_9.hpp
index 88cc4e5fcf..1081ab2f8b 100644
--- a/boost/math/tools/detail/rational_horner2_9.hpp
+++ b/boost/math/tools/detail/rational_horner2_9.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -58,7 +58,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -74,7 +74,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -90,7 +90,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -106,7 +106,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_10.hpp b/boost/math/tools/detail/rational_horner3_10.hpp
index 019ffdacc3..7da05875f3 100644
--- a/boost/math/tools/detail/rational_horner3_10.hpp
+++ b/boost/math/tools/detail/rational_horner3_10.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_11.hpp b/boost/math/tools/detail/rational_horner3_11.hpp
index 13ce3134ae..df971197a3 100644
--- a/boost/math/tools/detail/rational_horner3_11.hpp
+++ b/boost/math/tools/detail/rational_horner3_11.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_12.hpp b/boost/math/tools/detail/rational_horner3_12.hpp
index 634140bd0d..668f76684f 100644
--- a/boost/math/tools/detail/rational_horner3_12.hpp
+++ b/boost/math/tools/detail/rational_horner3_12.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_13.hpp b/boost/math/tools/detail/rational_horner3_13.hpp
index 0b4974a501..b0b4c2ac58 100644
--- a/boost/math/tools/detail/rational_horner3_13.hpp
+++ b/boost/math/tools/detail/rational_horner3_13.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_14.hpp b/boost/math/tools/detail/rational_horner3_14.hpp
index 63f4e95963..92035ef806 100644
--- a/boost/math/tools/detail/rational_horner3_14.hpp
+++ b/boost/math/tools/detail/rational_horner3_14.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_15.hpp b/boost/math/tools/detail/rational_horner3_15.hpp
index c13500f130..9536ecd844 100644
--- a/boost/math/tools/detail/rational_horner3_15.hpp
+++ b/boost/math/tools/detail/rational_horner3_15.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -782,7 +782,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_16.hpp b/boost/math/tools/detail/rational_horner3_16.hpp
index b1c89774f8..7ccf8f6e7a 100644
--- a/boost/math/tools/detail/rational_horner3_16.hpp
+++ b/boost/math/tools/detail/rational_horner3_16.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -782,7 +782,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -900,7 +900,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_17.hpp b/boost/math/tools/detail/rational_horner3_17.hpp
index 9c3498ec24..1a35c47397 100644
--- a/boost/math/tools/detail/rational_horner3_17.hpp
+++ b/boost/math/tools/detail/rational_horner3_17.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -782,7 +782,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -900,7 +900,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1026,7 +1026,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_18.hpp b/boost/math/tools/detail/rational_horner3_18.hpp
index 5401e9f3a2..8a1c16eb2f 100644
--- a/boost/math/tools/detail/rational_horner3_18.hpp
+++ b/boost/math/tools/detail/rational_horner3_18.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -782,7 +782,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -900,7 +900,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1026,7 +1026,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1160,7 +1160,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_19.hpp b/boost/math/tools/detail/rational_horner3_19.hpp
index c111b68f1e..15d16bafc3 100644
--- a/boost/math/tools/detail/rational_horner3_19.hpp
+++ b/boost/math/tools/detail/rational_horner3_19.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -782,7 +782,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -900,7 +900,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1026,7 +1026,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1160,7 +1160,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1302,7 +1302,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_2.hpp b/boost/math/tools/detail/rational_horner3_2.hpp
index 35b5abb354..95ec0251d5 100644
--- a/boost/math/tools/detail/rational_horner3_2.hpp
+++ b/boost/math/tools/detail/rational_horner3_2.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
diff --git a/boost/math/tools/detail/rational_horner3_20.hpp b/boost/math/tools/detail/rational_horner3_20.hpp
index 7bee9b110a..78233214d8 100644
--- a/boost/math/tools/detail/rational_horner3_20.hpp
+++ b/boost/math/tools/detail/rational_horner3_20.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -312,7 +312,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<10>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -390,7 +390,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<11>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -476,7 +476,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<12>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -570,7 +570,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<13>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -672,7 +672,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<14>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -782,7 +782,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<15>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -900,7 +900,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<16>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1026,7 +1026,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<17>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1160,7 +1160,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<18>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1302,7 +1302,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<19>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -1452,7 +1452,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<20>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_3.hpp b/boost/math/tools/detail/rational_horner3_3.hpp
index 8838ac13e6..9ce437b41f 100644
--- a/boost/math/tools/detail/rational_horner3_3.hpp
+++ b/boost/math/tools/detail/rational_horner3_3.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
diff --git a/boost/math/tools/detail/rational_horner3_4.hpp b/boost/math/tools/detail/rational_horner3_4.hpp
index 5fe5ada83b..00543ede85 100644
--- a/boost/math/tools/detail/rational_horner3_4.hpp
+++ b/boost/math/tools/detail/rational_horner3_4.hpp
@@ -12,31 +12,31 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
diff --git a/boost/math/tools/detail/rational_horner3_5.hpp b/boost/math/tools/detail/rational_horner3_5.hpp
index 23a606855b..35dce45a80 100644
--- a/boost/math/tools/detail/rational_horner3_5.hpp
+++ b/boost/math/tools/detail/rational_horner3_5.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_6.hpp b/boost/math/tools/detail/rational_horner3_6.hpp
index 186167d614..b9361ba07a 100644
--- a/boost/math/tools/detail/rational_horner3_6.hpp
+++ b/boost/math/tools/detail/rational_horner3_6.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_7.hpp b/boost/math/tools/detail/rational_horner3_7.hpp
index e08dce62d7..92b00b3a15 100644
--- a/boost/math/tools/detail/rational_horner3_7.hpp
+++ b/boost/math/tools/detail/rational_horner3_7.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_8.hpp b/boost/math/tools/detail/rational_horner3_8.hpp
index 3ceb717439..197b6c0550 100644
--- a/boost/math/tools/detail/rational_horner3_8.hpp
+++ b/boost/math/tools/detail/rational_horner3_8.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/detail/rational_horner3_9.hpp b/boost/math/tools/detail/rational_horner3_9.hpp
index 94dab4c0db..5aad957c37 100644
--- a/boost/math/tools/detail/rational_horner3_9.hpp
+++ b/boost/math/tools/detail/rational_horner3_9.hpp
@@ -12,37 +12,37 @@
namespace boost{ namespace math{ namespace tools{ namespace detail{
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*)
+inline V evaluate_rational_c_imp(const T*, const U*, const V&, const mpl::int_<0>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(0);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V&, const mpl::int_<1>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(a[0]) / static_cast<V>(b[0]);
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<2>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((a[1] * x + a[0]) / (b[1] * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<3>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>(((a[2] * x + a[1]) * x + a[0]) / ((b[2] * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<4>*) BOOST_MATH_NOEXCEPT(V)
{
return static_cast<V>((((a[3] * x + a[2]) * x + a[1]) * x + a[0]) / (((b[3] * x + b[2]) * x + b[1]) * x + b[0]));
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<5>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -80,7 +80,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<6>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -126,7 +126,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<7>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -180,7 +180,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<8>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
@@ -242,7 +242,7 @@ inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::
}
template <class T, class U, class V>
-inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*)
+inline V evaluate_rational_c_imp(const T* a, const U* b, const V& x, const mpl::int_<9>*) BOOST_MATH_NOEXCEPT(V)
{
if(x <= 1)
{
diff --git a/boost/math/tools/fraction.hpp b/boost/math/tools/fraction.hpp
index b245ddd2a3..a787c603f3 100644
--- a/boost/math/tools/fraction.hpp
+++ b/boost/math/tools/fraction.hpp
@@ -33,11 +33,11 @@ namespace detail
typedef typename Gen::result_type result_type;
typedef typename Gen::result_type value_type;
- static result_type a(const value_type&)
+ static result_type a(const value_type&) BOOST_MATH_NOEXCEPT(value_type)
{
return 1;
}
- static result_type b(const value_type& v)
+ static result_type b(const value_type& v) BOOST_MATH_NOEXCEPT(value_type)
{
return v;
}
@@ -49,11 +49,11 @@ namespace detail
typedef typename Gen::result_type value_type;
typedef typename value_type::first_type result_type;
- static result_type a(const value_type& v)
+ static result_type a(const value_type& v) BOOST_MATH_NOEXCEPT(value_type)
{
return v.first;
}
- static result_type b(const value_type& v)
+ static result_type b(const value_type& v) BOOST_MATH_NOEXCEPT(value_type)
{
return v.second;
}
@@ -85,7 +85,8 @@ namespace detail
// Note that the first a0 returned by generator Gen is disarded.
//
template <class Gen, class U>
-inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor, boost::uintmax_t& max_terms)
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor, boost::uintmax_t& max_terms)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
BOOST_MATH_STD_USING // ADL of std names
@@ -126,6 +127,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(G
template <class Gen, class U>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
boost::uintmax_t max_terms = (std::numeric_limits<boost::uintmax_t>::max)();
return continued_fraction_b(g, factor, max_terms);
@@ -133,6 +135,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(G
template <class Gen>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
BOOST_MATH_STD_USING // ADL of std names
@@ -146,6 +149,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(G
template <class Gen>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits, boost::uintmax_t& max_terms)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
BOOST_MATH_STD_USING // ADL of std names
@@ -172,6 +176,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(G
//
template <class Gen, class U>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, const U& factor, boost::uintmax_t& max_terms)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
BOOST_MATH_STD_USING // ADL of std names
@@ -213,6 +218,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(G
template <class Gen, class U>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, const U& factor)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
boost::uintmax_t max_iter = (std::numeric_limits<boost::uintmax_t>::max)();
return continued_fraction_a(g, factor, max_iter);
@@ -220,6 +226,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(G
template <class Gen>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
BOOST_MATH_STD_USING // ADL of std names
@@ -234,6 +241,7 @@ inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(G
template <class Gen>
inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits, boost::uintmax_t& max_terms)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename detail::fraction_traits<Gen>::result_type) && noexcept(std::declval<Gen>()()))
{
BOOST_MATH_STD_USING // ADL of std names
diff --git a/boost/math/tools/minima.hpp b/boost/math/tools/minima.hpp
index 3dc5356f3e..b76dabe3f6 100644
--- a/boost/math/tools/minima.hpp
+++ b/boost/math/tools/minima.hpp
@@ -21,6 +21,7 @@ namespace boost{ namespace math{ namespace tools{
template <class F, class T>
std::pair<T, T> brent_find_minima(F f, T min, T max, int bits, boost::uintmax_t& max_iter)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
BOOST_MATH_STD_USING
bits = (std::min)(policies::digits<T, policies::policy<> >() / 2, bits);
@@ -138,6 +139,7 @@ std::pair<T, T> brent_find_minima(F f, T min, T max, int bits, boost::uintmax_t&
template <class F, class T>
inline std::pair<T, T> brent_find_minima(F f, T min, T max, int digits)
+ BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
return brent_find_minima(f, min, max, digits, m);
diff --git a/boost/math/tools/precision.hpp b/boost/math/tools/precision.hpp
index ed146c458f..9631fc2eb6 100644
--- a/boost/math/tools/precision.hpp
+++ b/boost/math/tools/precision.hpp
@@ -39,7 +39,7 @@ namespace tools
// See Conceptual Requirements for Real Number Types.
template <class T>
-inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+inline BOOST_MATH_CONSTEXPR int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T)) BOOST_NOEXCEPT
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
@@ -54,7 +54,7 @@ inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
}
template <class T>
-inline T max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
@@ -66,7 +66,7 @@ inline T max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
// -max_value<double> = -1.79769e+308, max_value<double> = 1.79769e+308.
template <class T>
-inline T min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
@@ -86,13 +86,13 @@ namespace detail{
// For type float first:
//
template <class T>
-inline T log_max_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_max_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return 88.0f;
}
template <class T>
-inline T log_min_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_min_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return -87.0f;
}
@@ -100,13 +100,13 @@ inline T log_min_value(const mpl::int_<128>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE
// Now double:
//
template <class T>
-inline T log_max_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_max_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return 709.0;
}
template <class T>
-inline T log_min_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_min_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return -708.0;
}
@@ -114,13 +114,13 @@ inline T log_min_value(const mpl::int_<1024>& BOOST_MATH_APPEND_EXPLICIT_TEMPLAT
// 80 and 128-bit long doubles:
//
template <class T>
-inline T log_max_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_max_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return 11356.0L;
}
template <class T>
-inline T log_min_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_min_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return -11355.0L;
}
@@ -128,17 +128,12 @@ inline T log_min_value(const mpl::int_<16384>& BOOST_MATH_APPEND_EXPLICIT_TEMPLA
template <class T>
inline T log_max_value(const mpl::int_<0>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
{
-#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
- BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
-#else
- BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
-#endif
BOOST_MATH_STD_USING
#ifdef __SUNPRO_CC
- static const T m = (std::numeric_limits<T>::max)();
+ static const T m = boost::math::tools::max_value<T>();
static const T val = log(m);
#else
- static const T val = log((std::numeric_limits<T>::max)());
+ static const T val = log(boost::math::tools::max_value<T>());
#endif
return val;
}
@@ -146,30 +141,25 @@ inline T log_max_value(const mpl::int_<0>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_T
template <class T>
inline T log_min_value(const mpl::int_<0>& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
{
-#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
- BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
-#else
- BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
-#endif
BOOST_MATH_STD_USING
#ifdef __SUNPRO_CC
- static const T m = (std::numeric_limits<T>::min)();
+ static const T m = boost::math::tools::min_value<T>();
static const T val = log(m);
#else
- static const T val = log((std::numeric_limits<T>::min)());
+ static const T val = log(boost::math::tools::min_value<T>());
#endif
return val;
}
template <class T>
-inline T epsilon(const mpl::true_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T epsilon(const mpl::true_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_MATH_NOEXCEPT(T)
{
return std::numeric_limits<T>::epsilon();
}
#if defined(__GNUC__) && ((LDBL_MANT_DIG == 106) || (__LDBL_MANT_DIG__ == 106))
template <>
-inline long double epsilon<long double>(const mpl::true_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(long double))
+inline BOOST_MATH_CONSTEXPR long double epsilon<long double>(const mpl::true_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(long double)) BOOST_MATH_NOEXCEPT(long double)
{
// numeric_limits on Darwin (and elsewhere) tells lies here:
// the issue is that long double on a few platforms is
@@ -195,6 +185,27 @@ inline T epsilon(const mpl::false_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
return eps;
}
+template <class T>
+struct log_limit_traits
+{
+ typedef typename mpl::if_c<
+ (std::numeric_limits<T>::radix == 2) &&
+ (std::numeric_limits<T>::max_exponent == 128
+ || std::numeric_limits<T>::max_exponent == 1024
+ || std::numeric_limits<T>::max_exponent == 16384),
+ mpl::int_<(std::numeric_limits<T>::max_exponent > INT_MAX ? INT_MAX : static_cast<int>(std::numeric_limits<T>::max_exponent))>,
+ mpl::int_<0>
+ >::type tag_type;
+ BOOST_STATIC_CONSTANT(bool, value = tag_type::value ? true : false);
+ BOOST_STATIC_ASSERT(::std::numeric_limits<T>::is_specialized || (value == 0));
+};
+
+template <class T, bool b> struct log_limit_noexcept_traits_imp : public log_limit_traits<T> {};
+template <class T> struct log_limit_noexcept_traits_imp<T, false> : public boost::integral_constant<bool, false> {};
+
+template <class T>
+struct log_limit_noexcept_traits : public log_limit_noexcept_traits_imp<T, BOOST_MATH_IS_FLOAT(T)> {};
+
} // namespace detail
#ifdef BOOST_MSVC
@@ -203,19 +214,10 @@ inline T epsilon(const mpl::false_& BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE(T))
#endif
template <class T>
-inline T log_max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_NOEXCEPT_IF(detail::log_limit_noexcept_traits<T>::value)
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
- typedef typename mpl::if_c<
- (std::numeric_limits<T>::radix == 2) &&
- (std::numeric_limits<T>::max_exponent == 128
- || std::numeric_limits<T>::max_exponent == 1024
- || std::numeric_limits<T>::max_exponent == 16384),
- mpl::int_<(std::numeric_limits<T>::max_exponent > INT_MAX ? INT_MAX : static_cast<int>(std::numeric_limits<T>::max_exponent))>,
- mpl::int_<0>
- >::type tag_type;
- BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
- return detail::log_max_value<T>(tag_type());
+ return detail::log_max_value<T>(typename detail::log_limit_traits<T>::tag_type());
#else
BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
BOOST_MATH_STD_USING
@@ -225,20 +227,10 @@ inline T log_max_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
}
template <class T>
-inline T log_min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline BOOST_MATH_CONSTEXPR T log_min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T)) BOOST_NOEXCEPT_IF(detail::log_limit_noexcept_traits<T>::value)
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
- typedef typename mpl::if_c<
- (std::numeric_limits<T>::radix == 2) &&
- (std::numeric_limits<T>::max_exponent == 128
- || std::numeric_limits<T>::max_exponent == 1024
- || std::numeric_limits<T>::max_exponent == 16384),
- mpl::int_<(std::numeric_limits<T>::max_exponent > INT_MAX ? INT_MAX : static_cast<int>(std::numeric_limits<T>::max_exponent))>,
- mpl::int_<0>
- >::type tag_type;
-
- BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
- return detail::log_min_value<T>(tag_type());
+ return detail::log_min_value<T>(typename detail::log_limit_traits<T>::tag_type());
#else
BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
BOOST_MATH_STD_USING
@@ -252,7 +244,7 @@ inline T log_min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
#endif
template <class T>
-inline T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
+inline BOOST_MATH_CONSTEXPR T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T)) BOOST_MATH_NOEXCEPT(T)
{
#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
return detail::epsilon<T>(mpl::bool_< ::std::numeric_limits<T>::is_specialized>());
@@ -266,25 +258,25 @@ inline T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
namespace detail{
template <class T>
-inline T root_epsilon_imp(const mpl::int_<24>&)
+inline BOOST_MATH_CONSTEXPR T root_epsilon_imp(const mpl::int_<24>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.00034526698300124390839884978618400831996329879769945L);
}
template <class T>
-inline T root_epsilon_imp(const T*, const mpl::int_<53>&)
+inline BOOST_MATH_CONSTEXPR T root_epsilon_imp(const T*, const mpl::int_<53>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.1490116119384765625e-7L);
}
template <class T>
-inline T root_epsilon_imp(const T*, const mpl::int_<64>&)
+inline BOOST_MATH_CONSTEXPR T root_epsilon_imp(const T*, const mpl::int_<64>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.32927225399135962333569506281281311031656150598474e-9L);
}
template <class T>
-inline T root_epsilon_imp(const T*, const mpl::int_<113>&)
+inline BOOST_MATH_CONSTEXPR T root_epsilon_imp(const T*, const mpl::int_<113>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.1387778780781445675529539585113525390625e-16L);
}
@@ -298,25 +290,25 @@ inline T root_epsilon_imp(const T*, const Tag&)
}
template <class T>
-inline T cbrt_epsilon_imp(const mpl::int_<24>&)
+inline BOOST_MATH_CONSTEXPR T cbrt_epsilon_imp(const mpl::int_<24>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.0049215666011518482998719164346805794944150447839903L);
}
template <class T>
-inline T cbrt_epsilon_imp(const T*, const mpl::int_<53>&)
+inline BOOST_MATH_CONSTEXPR T cbrt_epsilon_imp(const T*, const mpl::int_<53>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(6.05545445239333906078989272793696693569753008995e-6L);
}
template <class T>
-inline T cbrt_epsilon_imp(const T*, const mpl::int_<64>&)
+inline BOOST_MATH_CONSTEXPR T cbrt_epsilon_imp(const T*, const mpl::int_<64>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(4.76837158203125e-7L);
}
template <class T>
-inline T cbrt_epsilon_imp(const T*, const mpl::int_<113>&)
+inline BOOST_MATH_CONSTEXPR T cbrt_epsilon_imp(const T*, const mpl::int_<113>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(5.7749313854154005630396773604745549542403508090496e-12L);
}
@@ -330,25 +322,25 @@ inline T cbrt_epsilon_imp(const T*, const Tag&)
}
template <class T>
-inline T forth_root_epsilon_imp(const T*, const mpl::int_<24>&)
+inline BOOST_MATH_CONSTEXPR T forth_root_epsilon_imp(const T*, const mpl::int_<24>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.018581361171917516667460937040007436176452688944747L);
}
template <class T>
-inline T forth_root_epsilon_imp(const T*, const mpl::int_<53>&)
+inline BOOST_MATH_CONSTEXPR T forth_root_epsilon_imp(const T*, const mpl::int_<53>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.0001220703125L);
}
template <class T>
-inline T forth_root_epsilon_imp(const T*, const mpl::int_<64>&)
+inline BOOST_MATH_CONSTEXPR T forth_root_epsilon_imp(const T*, const mpl::int_<64>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.18145860519450699870567321328132261891067079047605e-4L);
}
template <class T>
-inline T forth_root_epsilon_imp(const T*, const mpl::int_<113>&)
+inline BOOST_MATH_CONSTEXPR T forth_root_epsilon_imp(const T*, const mpl::int_<113>&) BOOST_MATH_NOEXCEPT(T)
{
return static_cast<T>(0.37252902984619140625e-8L);
}
@@ -361,27 +353,31 @@ inline T forth_root_epsilon_imp(const T*, const Tag&)
return r_eps;
}
+template <class T>
+struct root_epsilon_traits
+{
+ typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
+ BOOST_STATIC_CONSTANT(bool, has_noexcept = (tag_type::value == 113) || (tag_type::value == 64) || (tag_type::value == 53) || (tag_type::value == 24));
+};
+
}
template <class T>
-inline T root_epsilon()
+inline BOOST_MATH_CONSTEXPR T root_epsilon() BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && detail::root_epsilon_traits<T>::has_noexcept)
{
- typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
- return detail::root_epsilon_imp(static_cast<T const*>(0), tag_type());
+ return detail::root_epsilon_imp(static_cast<T const*>(0), typename detail::root_epsilon_traits<T>::tag_type());
}
template <class T>
-inline T cbrt_epsilon()
+inline BOOST_MATH_CONSTEXPR T cbrt_epsilon() BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && detail::root_epsilon_traits<T>::has_noexcept)
{
- typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
- return detail::cbrt_epsilon_imp(static_cast<T const*>(0), tag_type());
+ return detail::cbrt_epsilon_imp(static_cast<T const*>(0), typename detail::root_epsilon_traits<T>::tag_type());
}
template <class T>
-inline T forth_root_epsilon()
+inline BOOST_MATH_CONSTEXPR T forth_root_epsilon() BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && detail::root_epsilon_traits<T>::has_noexcept)
{
- typedef mpl::int_< (::std::numeric_limits<T>::radix == 2) ? std::numeric_limits<T>::digits : 0> tag_type;
- return detail::forth_root_epsilon_imp(static_cast<T const*>(0), tag_type());
+ return detail::forth_root_epsilon_imp(static_cast<T const*>(0), typename detail::root_epsilon_traits<T>::tag_type());
}
} // namespace tools
diff --git a/boost/math/tools/promotion.hpp b/boost/math/tools/promotion.hpp
index b3ad204077..494d7f99e2 100644
--- a/boost/math/tools/promotion.hpp
+++ b/boost/math/tools/promotion.hpp
@@ -86,13 +86,20 @@ namespace boost
typedef typename mpl::if_<
typename mpl::and_<is_floating_point<T1P>, is_floating_point<T2P> >::type, // both T1P and T2P are floating-point?
- typename mpl::if_< typename mpl::or_<is_same<long double, T1P>, is_same<long double, T2P> >::type, // either long double?
- long double, // then result type is long double.
- typename mpl::if_< typename mpl::or_<is_same<double, T1P>, is_same<double, T2P> >::type, // either double?
- double, // result type is double.
- float // else result type is float.
- >::type
- >::type,
+#ifdef BOOST_MATH_USE_FLOAT128
+ typename mpl::if_< typename mpl::or_<is_same<__float128, T1P>, is_same<__float128, T2P> >::type, // either long double?
+ __float128,
+#endif
+ typename mpl::if_< typename mpl::or_<is_same<long double, T1P>, is_same<long double, T2P> >::type, // either long double?
+ long double, // then result type is long double.
+ typename mpl::if_< typename mpl::or_<is_same<double, T1P>, is_same<double, T2P> >::type, // either double?
+ double, // result type is double.
+ float // else result type is float.
+ >::type
+#ifdef BOOST_MATH_USE_FLOAT128
+ >::type
+#endif
+ >::type,
// else one or the other is a user-defined type:
typename mpl::if_< typename mpl::and_<mpl::not_<is_floating_point<T2P> >, ::boost::is_convertible<T1P, T2P> >, T2P, T1P>::type>::type type;
}; // promote_arg2
diff --git a/boost/math/tools/rational.hpp b/boost/math/tools/rational.hpp
index accffeaf26..d8bd4a73aa 100644
--- a/boost/math/tools/rational.hpp
+++ b/boost/math/tools/rational.hpp
@@ -168,12 +168,12 @@ namespace boost{ namespace math{ namespace tools{
// Forward declaration to keep two phase lookup happy:
//
template <class T, class U>
-U evaluate_polynomial(const T* poly, U const& z, std::size_t count);
+U evaluate_polynomial(const T* poly, U const& z, std::size_t count) BOOST_MATH_NOEXCEPT(U);
namespace detail{
template <class T, class V, class Tag>
-inline V evaluate_polynomial_c_imp(const T* a, const V& val, const Tag*)
+inline V evaluate_polynomial_c_imp(const T* a, const V& val, const Tag*) BOOST_MATH_NOEXCEPT(V)
{
return evaluate_polynomial(a, val, Tag::value);
}
@@ -186,7 +186,7 @@ inline V evaluate_polynomial_c_imp(const T* a, const V& val, const Tag*)
// the loop expanded versions above:
//
template <class T, class U>
-inline U evaluate_polynomial(const T* poly, U const& z, std::size_t count)
+inline U evaluate_polynomial(const T* poly, U const& z, std::size_t count) BOOST_MATH_NOEXCEPT(U)
{
BOOST_ASSERT(count > 0);
U sum = static_cast<U>(poly[count - 1]);
@@ -202,14 +202,14 @@ inline U evaluate_polynomial(const T* poly, U const& z, std::size_t count)
// implementations above:
//
template <std::size_t N, class T, class V>
-inline V evaluate_polynomial(const T(&a)[N], const V& val)
+inline V evaluate_polynomial(const T(&a)[N], const V& val) BOOST_MATH_NOEXCEPT(V)
{
typedef mpl::int_<N> tag_type;
return detail::evaluate_polynomial_c_imp(static_cast<const T*>(a), val, static_cast<tag_type const*>(0));
}
template <std::size_t N, class T, class V>
-inline V evaluate_polynomial(const boost::array<T,N>& a, const V& val)
+inline V evaluate_polynomial(const boost::array<T,N>& a, const V& val) BOOST_MATH_NOEXCEPT(V)
{
typedef mpl::int_<N> tag_type;
return detail::evaluate_polynomial_c_imp(static_cast<const T*>(a.data()), val, static_cast<tag_type const*>(0));
@@ -218,19 +218,19 @@ inline V evaluate_polynomial(const boost::array<T,N>& a, const V& val)
// Even polynomials are trivial: just square the argument!
//
template <class T, class U>
-inline U evaluate_even_polynomial(const T* poly, U z, std::size_t count)
+inline U evaluate_even_polynomial(const T* poly, U z, std::size_t count) BOOST_MATH_NOEXCEPT(U)
{
return evaluate_polynomial(poly, U(z*z), count);
}
template <std::size_t N, class T, class V>
-inline V evaluate_even_polynomial(const T(&a)[N], const V& z)
+inline V evaluate_even_polynomial(const T(&a)[N], const V& z) BOOST_MATH_NOEXCEPT(V)
{
return evaluate_polynomial(a, V(z*z));
}
template <std::size_t N, class T, class V>
-inline V evaluate_even_polynomial(const boost::array<T,N>& a, const V& z)
+inline V evaluate_even_polynomial(const boost::array<T,N>& a, const V& z) BOOST_MATH_NOEXCEPT(V)
{
return evaluate_polynomial(a, V(z*z));
}
@@ -238,32 +238,32 @@ inline V evaluate_even_polynomial(const boost::array<T,N>& a, const V& z)
// Odd polynomials come next:
//
template <class T, class U>
-inline U evaluate_odd_polynomial(const T* poly, U z, std::size_t count)
+inline U evaluate_odd_polynomial(const T* poly, U z, std::size_t count) BOOST_MATH_NOEXCEPT(U)
{
return poly[0] + z * evaluate_polynomial(poly+1, U(z*z), count-1);
}
template <std::size_t N, class T, class V>
-inline V evaluate_odd_polynomial(const T(&a)[N], const V& z)
+inline V evaluate_odd_polynomial(const T(&a)[N], const V& z) BOOST_MATH_NOEXCEPT(V)
{
typedef mpl::int_<N-1> tag_type;
return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a) + 1, V(z*z), static_cast<tag_type const*>(0));
}
template <std::size_t N, class T, class V>
-inline V evaluate_odd_polynomial(const boost::array<T,N>& a, const V& z)
+inline V evaluate_odd_polynomial(const boost::array<T,N>& a, const V& z) BOOST_MATH_NOEXCEPT(V)
{
typedef mpl::int_<N-1> tag_type;
return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a.data()) + 1, V(z*z), static_cast<tag_type const*>(0));
}
template <class T, class U, class V>
-V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count);
+V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count) BOOST_MATH_NOEXCEPT(V);
namespace detail{
template <class T, class U, class V, class Tag>
-inline V evaluate_rational_c_imp(const T* num, const U* denom, const V& z, const Tag*)
+inline V evaluate_rational_c_imp(const T* num, const U* denom, const V& z, const Tag*) BOOST_MATH_NOEXCEPT(V)
{
return boost::math::tools::evaluate_rational(num, denom, z, Tag::value);
}
@@ -278,7 +278,7 @@ inline V evaluate_rational_c_imp(const T* num, const U* denom, const V& z, const
// in our Lanczos code for example.
//
template <class T, class U, class V>
-V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count)
+V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count) BOOST_MATH_NOEXCEPT(V)
{
V z(z_);
V s1, s2;
@@ -311,13 +311,13 @@ V evaluate_rational(const T* num, const U* denom, const V& z_, std::size_t count
}
template <std::size_t N, class T, class U, class V>
-inline V evaluate_rational(const T(&a)[N], const U(&b)[N], const V& z)
+inline V evaluate_rational(const T(&a)[N], const U(&b)[N], const V& z) BOOST_MATH_NOEXCEPT(V)
{
return detail::evaluate_rational_c_imp(a, b, z, static_cast<const mpl::int_<N>*>(0));
}
template <std::size_t N, class T, class U, class V>
-inline V evaluate_rational(const boost::array<T,N>& a, const boost::array<U,N>& b, const V& z)
+inline V evaluate_rational(const boost::array<T,N>& a, const boost::array<U,N>& b, const V& z) BOOST_MATH_NOEXCEPT(V)
{
return detail::evaluate_rational_c_imp(a.data(), b.data(), z, static_cast<mpl::int_<N>*>(0));
}
diff --git a/boost/math/tools/real_cast.hpp b/boost/math/tools/real_cast.hpp
index 9b854e3014..873e60259b 100644
--- a/boost/math/tools/real_cast.hpp
+++ b/boost/math/tools/real_cast.hpp
@@ -6,6 +6,8 @@
#ifndef BOOST_MATH_TOOLS_REAL_CAST_HPP
#define BOOST_MATH_TOOLS_REAL_CAST_HPP
+#include <boost/math/tools/config.hpp>
+
#ifdef _MSC_VER
#pragma once
#endif
@@ -15,7 +17,7 @@ namespace boost{ namespace math
namespace tools
{
template <class To, class T>
- inline To real_cast(T t)
+ inline BOOST_MATH_CONSTEXPR To real_cast(T t) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && BOOST_MATH_IS_FLOAT(To))
{
return static_cast<To>(t);
}
diff --git a/boost/math/tools/roots.hpp b/boost/math/tools/roots.hpp
index 2442f5c2d1..25300fee38 100644
--- a/boost/math/tools/roots.hpp
+++ b/boost/math/tools/roots.hpp
@@ -36,9 +36,49 @@ namespace boost{ namespace math{ namespace tools{
namespace detail{
+namespace dummy{
+
+ template<int n, class T>
+ typename T::value_type get(const T&) BOOST_MATH_NOEXCEPT(T);
+}
+
+template <class Tuple, class T>
+void unpack_tuple(const Tuple& t, T& a, T& b) BOOST_MATH_NOEXCEPT(T)
+{
+ using dummy::get;
+ // Use ADL to find the right overload for get:
+ a = get<0>(t);
+ b = get<1>(t);
+}
template <class Tuple, class T>
-inline void unpack_0(const Tuple& t, T& val)
-{ val = boost::math::get<0>(t); }
+void unpack_tuple(const Tuple& t, T& a, T& b, T& c) BOOST_MATH_NOEXCEPT(T)
+{
+ using dummy::get;
+ // Use ADL to find the right overload for get:
+ a = get<0>(t);
+ b = get<1>(t);
+ c = get<2>(t);
+}
+
+template <class Tuple, class T>
+inline void unpack_0(const Tuple& t, T& val) BOOST_MATH_NOEXCEPT(T)
+{
+ using dummy::get;
+ // Rely on ADL to find the correct overload of get:
+ val = get<0>(t);
+}
+
+template <class T, class U, class V>
+inline void unpack_tuple(const std::pair<T, U>& p, V& a, V& b) BOOST_MATH_NOEXCEPT(T)
+{
+ a = p.first;
+ b = p.second;
+}
+template <class T, class U, class V>
+inline void unpack_0(const std::pair<T, U>& p, V& a) BOOST_MATH_NOEXCEPT(T)
+{
+ a = p.first;
+}
template <class F, class T>
void handle_zero_derivative(F f,
@@ -48,7 +88,7 @@ void handle_zero_derivative(F f,
T& result,
T& guess,
const T& min,
- const T& max)
+ const T& max) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
if(last_f0 == 0)
{
@@ -94,14 +134,20 @@ void handle_zero_derivative(F f,
} // namespace
template <class F, class T, class Tol, class Policy>
-std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter, const Policy& pol)
+std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter, const Policy& pol) BOOST_NOEXCEPT_IF(policies::is_noexcept_error_policy<Policy>::value && BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
T fmin = f(min);
T fmax = f(max);
if(fmin == 0)
+ {
+ max_iter = 2;
return std::make_pair(min, min);
+ }
if(fmax == 0)
+ {
+ max_iter = 2;
return std::make_pair(max, max);
+ }
//
// Error checking:
@@ -168,20 +214,21 @@ std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter, c
}
template <class F, class T, class Tol>
-inline std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter)
+inline std::pair<T, T> bisect(F f, T min, T max, Tol tol, boost::uintmax_t& max_iter) BOOST_NOEXCEPT_IF(policies::is_noexcept_error_policy<policies::policy<> >::value && BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
return bisect(f, min, max, tol, max_iter, policies::policy<>());
}
template <class F, class T, class Tol>
-inline std::pair<T, T> bisect(F f, T min, T max, Tol tol)
+inline std::pair<T, T> bisect(F f, T min, T max, Tol tol) BOOST_NOEXCEPT_IF(policies::is_noexcept_error_policy<policies::policy<> >::value && BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
return bisect(f, min, max, tol, m, policies::policy<>());
}
+
template <class F, class T>
-T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter)
+T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
BOOST_MATH_STD_USING
@@ -189,7 +236,7 @@ T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_
T result = guess;
T factor = static_cast<T>(ldexp(1.0, 1 - digits));
- T delta = 1;
+ T delta = tools::max_value<T>();
T delta1 = tools::max_value<T>();
T delta2 = tools::max_value<T>();
@@ -199,7 +246,8 @@ T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_
last_f0 = f0;
delta2 = delta1;
delta1 = delta;
- boost::math::tie(f0, f1) = f(result);
+ detail::unpack_tuple(f(result), f0, f1);
+ --count;
if(0 == f0)
break;
if(f1 == 0)
@@ -243,7 +291,7 @@ T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_
max = guess;
else
min = guess;
- }while(--count && (fabs(result * factor) < fabs(delta)));
+ }while(count && (fabs(result * factor) < fabs(delta)));
max_iter -= count;
@@ -262,213 +310,208 @@ T newton_raphson_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_
}
template <class F, class T>
-inline T newton_raphson_iterate(F f, T guess, T min, T max, int digits)
+inline T newton_raphson_iterate(F f, T guess, T min, T max, int digits) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
return newton_raphson_iterate(f, guess, min, max, digits, m);
}
-template <class F, class T>
-T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter)
-{
- BOOST_MATH_STD_USING
+namespace detail{
- T f0(0), f1, f2;
- T result = guess;
+ struct halley_step
+ {
+ template <class T>
+ static T step(const T& /*x*/, const T& f0, const T& f1, const T& f2) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T))
+ {
+ using std::fabs;
+ T denom = 2 * f0;
+ T num = 2 * f1 - f0 * (f2 / f1);
+ T delta;
- T factor = static_cast<T>(ldexp(1.0, 1 - digits));
- T delta = (std::max)(T(10000000 * guess), T(10000000)); // arbitarily large delta
- T last_f0 = 0;
- T delta1 = delta;
- T delta2 = delta;
+ BOOST_MATH_INSTRUMENT_VARIABLE(denom);
+ BOOST_MATH_INSTRUMENT_VARIABLE(num);
- bool out_of_bounds_sentry = false;
+ if((fabs(num) < 1) && (fabs(denom) >= fabs(num) * tools::max_value<T>()))
+ {
+ // possible overflow, use Newton step:
+ delta = f0 / f1;
+ }
+ else
+ delta = denom / num;
+ return delta;
+ }
+ };
+
+ template <class Stepper, class F, class T>
+ T second_order_root_finder(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
+ {
+ BOOST_MATH_STD_USING
+
+ T f0(0), f1, f2;
+ T result = guess;
+
+ T factor = static_cast<T>(ldexp(1.0, 1 - digits));
+ T delta = (std::max)(T(10000000 * guess), T(10000000)); // arbitarily large delta
+ T last_f0 = 0;
+ T delta1 = delta;
+ T delta2 = delta;
+
+ bool out_of_bounds_sentry = false;
#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Halley iteration, limit = " << factor << std::endl;
+ std::cout << "Second order root iteration, limit = " << factor << std::endl;
#endif
- boost::uintmax_t count(max_iter);
+ boost::uintmax_t count(max_iter);
- do{
- last_f0 = f0;
- delta2 = delta1;
- delta1 = delta;
- boost::math::tie(f0, f1, f2) = f(result);
+ do{
+ last_f0 = f0;
+ delta2 = delta1;
+ delta1 = delta;
+ detail::unpack_tuple(f(result), f0, f1, f2);
+ --count;
- BOOST_MATH_INSTRUMENT_VARIABLE(f0);
- BOOST_MATH_INSTRUMENT_VARIABLE(f1);
- BOOST_MATH_INSTRUMENT_VARIABLE(f2);
-
- if(0 == f0)
- break;
- if(f1 == 0)
- {
- // Oops zero derivative!!!
+ BOOST_MATH_INSTRUMENT_VARIABLE(f0);
+ BOOST_MATH_INSTRUMENT_VARIABLE(f1);
+ BOOST_MATH_INSTRUMENT_VARIABLE(f2);
+
+ if(0 == f0)
+ break;
+ if(f1 == 0)
+ {
+ // Oops zero derivative!!!
#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Halley iteration, zero derivative found" << std::endl;
+ std::cout << "Second order root iteration, zero derivative found" << std::endl;
#endif
- detail::handle_zero_derivative(f, last_f0, f0, delta, result, guess, min, max);
- }
- else
- {
- if(f2 != 0)
+ detail::handle_zero_derivative(f, last_f0, f0, delta, result, guess, min, max);
+ }
+ else
{
- T denom = 2 * f0;
- T num = 2 * f1 - f0 * (f2 / f1);
-
- BOOST_MATH_INSTRUMENT_VARIABLE(denom);
- BOOST_MATH_INSTRUMENT_VARIABLE(num);
-
- if((fabs(num) < 1) && (fabs(denom) >= fabs(num) * tools::max_value<T>()))
+ if(f2 != 0)
{
- // possible overflow, use Newton step:
- delta = f0 / f1;
+ delta = Stepper::step(result, f0, f1, f2);
+ if(delta * f1 / f0 < 0)
+ {
+ // Oh dear, we have a problem as Newton and Halley steps
+ // disagree about which way we should move. Probably
+ // there is cancelation error in the calculation of the
+ // Halley step, or else the derivatives are so small
+ // that their values are basically trash. We will move
+ // in the direction indicated by a Newton step, but
+ // by no more than twice the current guess value, otherwise
+ // we can jump way out of bounds if we're not careful.
+ // See https://svn.boost.org/trac/boost/ticket/8314.
+ delta = f0 / f1;
+ if(fabs(delta) > 2 * fabs(guess))
+ delta = (delta < 0 ? -1 : 1) * 2 * fabs(guess);
+ }
}
else
- delta = denom / num;
- if(delta * f1 / f0 < 0)
- {
- // Oh dear, we have a problem as Newton and Halley steps
- // disagree about which way we should move. Probably
- // there is cancelation error in the calculation of the
- // Halley step, or else the derivatives are so small
- // that their values are basically trash. We will move
- // in the direction indicated by a Newton step, but
- // by no more than twice the current guess value, otherwise
- // we can jump way out of bounds if we're not careful.
- // See https://svn.boost.org/trac/boost/ticket/8314.
delta = f0 / f1;
- if(fabs(delta) > 2 * fabs(guess))
- delta = (delta < 0 ? -1 : 1) * 2 * fabs(guess);
- }
}
- else
- delta = f0 / f1;
- }
#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Halley iteration, delta = " << delta << std::endl;
+ std::cout << "Second order root iteration, delta = " << delta << std::endl;
#endif
- T convergence = fabs(delta / delta2);
- if((convergence > 0.8) && (convergence < 2))
- {
- // last two steps haven't converged, try bisection:
- delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
- if(fabs(delta) > result)
- delta = sign(delta) * result; // protect against huge jumps!
- // reset delta2 so that this branch will *not* be taken on the
- // next iteration:
- delta2 = delta * 3;
- BOOST_MATH_INSTRUMENT_VARIABLE(delta);
- }
- guess = result;
- result -= delta;
- BOOST_MATH_INSTRUMENT_VARIABLE(result);
-
- // check for out of bounds step:
- if(result < min)
- {
- T diff = ((fabs(min) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(min))) ? T(1000) : T(result / min);
- if(fabs(diff) < 1)
- diff = 1 / diff;
- if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
+ T convergence = fabs(delta / delta2);
+ if((convergence > 0.8) && (convergence < 2))
{
- // Only a small out of bounds step, lets assume that the result
- // is probably approximately at min:
- delta = 0.99f * (guess - min);
- result = guess - delta;
- out_of_bounds_sentry = true; // only take this branch once!
+ // last two steps haven't converged, try bisection:
+ delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
+ if(fabs(delta) > result)
+ delta = sign(delta) * result; // protect against huge jumps!
+ // reset delta2 so that this branch will *not* be taken on the
+ // next iteration:
+ delta2 = delta * 3;
+ BOOST_MATH_INSTRUMENT_VARIABLE(delta);
}
- else
+ guess = result;
+ result -= delta;
+ BOOST_MATH_INSTRUMENT_VARIABLE(result);
+
+ // check for out of bounds step:
+ if(result < min)
{
- delta = (guess - min) / 2;
- result = guess - delta;
- if((result == min) || (result == max))
- break;
+ T diff = ((fabs(min) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(min))) ? T(1000) : T(result / min);
+ if(fabs(diff) < 1)
+ diff = 1 / diff;
+ if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
+ {
+ // Only a small out of bounds step, lets assume that the result
+ // is probably approximately at min:
+ delta = 0.99f * (guess - min);
+ result = guess - delta;
+ out_of_bounds_sentry = true; // only take this branch once!
+ }
+ else
+ {
+ delta = (guess - min) / 2;
+ result = guess - delta;
+ if((result == min) || (result == max))
+ break;
+ }
}
- }
- else if(result > max)
- {
- T diff = ((fabs(max) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(max))) ? T(1000) : T(result / max);
- if(fabs(diff) < 1)
- diff = 1 / diff;
- if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
+ else if(result > max)
{
- // Only a small out of bounds step, lets assume that the result
- // is probably approximately at min:
- delta = 0.99f * (guess - max);
- result = guess - delta;
- out_of_bounds_sentry = true; // only take this branch once!
+ T diff = ((fabs(max) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(max))) ? T(1000) : T(result / max);
+ if(fabs(diff) < 1)
+ diff = 1 / diff;
+ if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
+ {
+ // Only a small out of bounds step, lets assume that the result
+ // is probably approximately at min:
+ delta = 0.99f * (guess - max);
+ result = guess - delta;
+ out_of_bounds_sentry = true; // only take this branch once!
+ }
+ else
+ {
+ delta = (guess - max) / 2;
+ result = guess - delta;
+ if((result == min) || (result == max))
+ break;
+ }
}
+ // update brackets:
+ if(delta > 0)
+ max = guess;
else
- {
- delta = (guess - max) / 2;
- result = guess - delta;
- if((result == min) || (result == max))
- break;
- }
- }
- // update brackets:
- if(delta > 0)
- max = guess;
- else
- min = guess;
- }while(--count && (fabs(result * factor) < fabs(delta)));
+ min = guess;
+ } while(count && (fabs(result * factor) < fabs(delta)));
- max_iter -= count;
+ max_iter -= count;
#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Halley iteration, final count = " << max_iter << std::endl;
+ std::cout << "Second order root iteration, final count = " << max_iter << std::endl;
#endif
- return result;
+ return result;
+ }
+
}
template <class F, class T>
-inline T halley_iterate(F f, T guess, T min, T max, int digits)
+T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
- boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
- return halley_iterate(f, guess, min, max, digits, m);
+ return detail::second_order_root_finder<detail::halley_step>(f, guess, min, max, digits, max_iter);
}
template <class F, class T>
-T schroeder_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter)
+inline T halley_iterate(F f, T guess, T min, T max, int digits) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
- BOOST_MATH_STD_USING
-
- T f0(0), f1, f2, last_f0(0);
- T result = guess;
-
- T factor = static_cast<T>(ldexp(1.0, 1 - digits));
- T delta = 0;
- T delta1 = tools::max_value<T>();
- T delta2 = tools::max_value<T>();
-
-#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Schroeder iteration, limit = " << factor << std::endl;
-#endif
+ boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+ return halley_iterate(f, guess, min, max, digits, m);
+}
- boost::uintmax_t count(max_iter);
+namespace detail{
- do{
- last_f0 = f0;
- delta2 = delta1;
- delta1 = delta;
- boost::math::tie(f0, f1, f2) = f(result);
- if(0 == f0)
- break;
- if((f1 == 0) && (f2 == 0))
- {
- // Oops zero derivative!!!
-#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Halley iteration, zero derivative found" << std::endl;
-#endif
- detail::handle_zero_derivative(f, last_f0, f0, delta, result, guess, min, max);
- }
- else
+ struct schroder_stepper
+ {
+ template <class T>
+ static T step(const T& x, const T& f0, const T& f1, const T& f2) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T))
{
T ratio = f0 / f1;
- if(ratio / result < 0.1)
+ T delta;
+ if(ratio / x < 0.1)
{
delta = ratio + (f2 / (2 * f1)) * ratio * ratio;
// check second derivative doesn't over compensate:
@@ -477,66 +520,44 @@ T schroeder_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& ma
}
else
delta = ratio; // fall back to Newton iteration.
+ return delta;
}
- if(fabs(delta * 2) > fabs(delta2))
- {
- // last two steps haven't converged, try bisection:
- delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
- }
- guess = result;
- result -= delta;
-#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Halley iteration, delta = " << delta << std::endl;
-#endif
- if(result <= min)
- {
- delta = 0.5F * (guess - min);
- result = guess - delta;
- if((result == min) || (result == max))
- break;
- }
- else if(result >= max)
- {
- delta = 0.5F * (guess - max);
- result = guess - delta;
- if((result == min) || (result == max))
- break;
- }
- // update brackets:
- if(delta > 0)
- max = guess;
- else
- min = guess;
- }while(--count && (fabs(result * factor) < fabs(delta)));
-
- max_iter -= count;
+ };
-#ifdef BOOST_MATH_INSTRUMENT
- std::cout << "Schroeder iteration, final count = " << max_iter << std::endl;
+}
- static boost::uintmax_t max_count = 0;
- if(max_iter > max_count)
- {
- max_count = max_iter;
- std::cout << "Maximum iterations: " << max_iter << std::endl;
- }
-#endif
+template <class F, class T>
+T schroder_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
+{
+ return detail::second_order_root_finder<detail::schroder_stepper>(f, guess, min, max, digits, max_iter);
+}
- return result;
+template <class F, class T>
+inline T schroder_iterate(F f, T guess, T min, T max, int digits) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
+{
+ boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
+ return schroder_iterate(f, guess, min, max, digits, m);
+}
+//
+// These two are the old spelling of this function, retained for backwards compatibity just in case:
+//
+template <class F, class T>
+T schroeder_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_iter) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
+{
+ return detail::second_order_root_finder<detail::schroder_stepper>(f, guess, min, max, digits, max_iter);
}
template <class F, class T>
-inline T schroeder_iterate(F f, T guess, T min, T max, int digits)
+inline T schroeder_iterate(F f, T guess, T min, T max, int digits) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(T) && noexcept(std::declval<F>()(std::declval<T>())))
{
boost::uintmax_t m = (std::numeric_limits<boost::uintmax_t>::max)();
- return schroeder_iterate(f, guess, min, max, digits, m);
+ return schroder_iterate(f, guess, min, max, digits, m);
}
+
} // namespace tools
} // namespace math
} // namespace boost
#endif // BOOST_MATH_TOOLS_NEWTON_SOLVER_HPP
-
-
diff --git a/boost/math/tools/series.hpp b/boost/math/tools/series.hpp
index a32a33fba1..ab01549a2d 100644
--- a/boost/math/tools/series.hpp
+++ b/boost/math/tools/series.hpp
@@ -21,7 +21,7 @@ namespace boost{ namespace math{ namespace tools{
// Simple series summation come first:
//
template <class Functor, class U, class V>
-inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms, const V& init_value)
+inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms, const V& init_value) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
@@ -44,14 +44,14 @@ inline typename Functor::result_type sum_series(Functor& func, const U& factor,
}
template <class Functor, class U>
-inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms)
+inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
typename Functor::result_type init_value = 0;
return sum_series(func, factor, max_terms, init_value);
}
template <class Functor, class U>
-inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms, const U& init_value)
+inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms, const U& init_value) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
typedef typename Functor::result_type result_type;
@@ -60,7 +60,7 @@ inline typename Functor::result_type sum_series(Functor& func, int bits, boost::
}
template <class Functor>
-inline typename Functor::result_type sum_series(Functor& func, int bits)
+inline typename Functor::result_type sum_series(Functor& func, int bits) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
typedef typename Functor::result_type result_type;
@@ -70,7 +70,7 @@ inline typename Functor::result_type sum_series(Functor& func, int bits)
}
template <class Functor>
-inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
typedef typename Functor::result_type result_type;
@@ -79,7 +79,7 @@ inline typename Functor::result_type sum_series(Functor& func, int bits, boost::
}
template <class Functor, class U>
-inline typename Functor::result_type sum_series(Functor& func, int bits, const U& init_value)
+inline typename Functor::result_type sum_series(Functor& func, int bits, const U& init_value) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
boost::uintmax_t iters = (std::numeric_limits<boost::uintmax_t>::max)();
@@ -99,7 +99,7 @@ inline typename Functor::result_type sum_series(Functor& func, int bits, const U
// in any case the result is still much better than a naive summation.
//
template <class Functor>
-inline typename Functor::result_type kahan_sum_series(Functor& func, int bits)
+inline typename Functor::result_type kahan_sum_series(Functor& func, int bits) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
@@ -122,7 +122,7 @@ inline typename Functor::result_type kahan_sum_series(Functor& func, int bits)
}
template <class Functor>
-inline typename Functor::result_type kahan_sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+inline typename Functor::result_type kahan_sum_series(Functor& func, int bits, boost::uintmax_t& max_terms) BOOST_NOEXCEPT_IF(BOOST_MATH_IS_FLOAT(typename Functor::result_type) && noexcept(std::declval<Functor>()()))
{
BOOST_MATH_STD_USING
diff --git a/boost/math/tools/toms748_solve.hpp b/boost/math/tools/toms748_solve.hpp
index 48737a821a..dca6bf0218 100644
--- a/boost/math/tools/toms748_solve.hpp
+++ b/boost/math/tools/toms748_solve.hpp
@@ -31,6 +31,10 @@ template <class T>
class eps_tolerance
{
public:
+ eps_tolerance()
+ {
+ eps = 4 * tools::epsilon<T>();
+ }
eps_tolerance(unsigned bits)
{
BOOST_MATH_STD_USING
@@ -108,7 +112,7 @@ void bracket(F f, T& a, T& b, T c, T& fa, T& fb, T& d, T& fd)
}
else if(c >= b - fabs(b) * tol)
{
- c = b - fabs(a) * tol;
+ c = b - fabs(b) * tol;
}
//
// OK, lets invoke f(c):
diff --git a/boost/math/tools/traits.hpp b/boost/math/tools/traits.hpp
index c49bf19b86..385388a5e3 100644
--- a/boost/math/tools/traits.hpp
+++ b/boost/math/tools/traits.hpp
@@ -26,8 +26,7 @@ as defined above, and has member functions "scale" and "location".
#endif
#include <boost/mpl/has_xxx.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost{ namespace math{ namespace tools{
@@ -101,8 +100,8 @@ struct is_scaled_distribution_imp
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_distribution,T,::boost::math::tools::detail::is_distribution_imp<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_scaled_distribution,T,::boost::math::tools::detail::is_scaled_distribution_imp<T>::value)
+template <class T> struct is_distribution : public boost::integral_constant<bool, ::boost::math::tools::detail::is_distribution_imp<T>::value> {};
+template <class T> struct is_scaled_distribution : public boost::integral_constant<bool, ::boost::math::tools::detail::is_scaled_distribution_imp<T>::value> {};
}}}
diff --git a/boost/math/tools/workaround.hpp b/boost/math/tools/workaround.hpp
index 20106814c7..29ce8b1c04 100644
--- a/boost/math/tools/workaround.hpp
+++ b/boost/math/tools/workaround.hpp
@@ -19,14 +19,14 @@ namespace boost{ namespace math{ namespace tools{
// std::fmod(1185.0L, 1.5L);
//
template <class T>
-inline T fmod_workaround(T a, T b)
+inline T fmod_workaround(T a, T b) BOOST_MATH_NOEXCEPT(T)
{
BOOST_MATH_STD_USING
return fmod(a, b);
}
#if (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) && ((LDBL_MANT_DIG == 106) || (__LDBL_MANT_DIG__ == 106))
template <>
-inline long double fmod_workaround(long double a, long double b)
+inline long double fmod_workaround(long double a, long double b) BOOST_NOEXCEPT
{
return ::fmodl(a, b);
}
diff --git a/boost/math/tr1.hpp b/boost/math/tr1.hpp
index df8ab0ef47..eae9216d04 100644
--- a/boost/math/tr1.hpp
+++ b/boost/math/tr1.hpp
@@ -105,7 +105,10 @@ namespace boost{ namespace math{ namespace tr1{ extern "C"{
#endif
#if !(defined(BOOST_INTEL) && defined(__APPLE__)) && !(defined(__FLT_EVAL_METHOD__) && !defined(__cplusplus))
-#ifndef FLT_EVAL_METHOD
+#if !defined(FLT_EVAL_METHOD)
+typedef float float_t;
+typedef double double_t;
+#elif FLT_EVAL_METHOD == -1
typedef float float_t;
typedef double double_t;
#elif FLT_EVAL_METHOD == 0
diff --git a/boost/move/core.hpp b/boost/move/core.hpp
index 55486e6b45..54aece0b71 100644
--- a/boost/move/core.hpp
+++ b/boost/move/core.hpp
@@ -27,6 +27,8 @@
#include <boost/move/detail/config_begin.hpp>
#include <boost/move/detail/workaround.hpp>
+// @cond
+
//boost_move_no_copy_constructor_or_assign typedef
//used to detect noncopyable types for other Boost libraries.
#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
@@ -49,6 +51,8 @@
//
#endif //BOOST_NO_CXX11_DELETED_FUNCTIONS
+// @endcond
+
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
#include <boost/move/detail/type_traits.hpp>
diff --git a/boost/move/default_delete.hpp b/boost/move/default_delete.hpp
index afe1b1bb63..1c26ed924b 100644
--- a/boost/move/default_delete.hpp
+++ b/boost/move/default_delete.hpp
@@ -31,6 +31,7 @@
//! Describes the default deleter (destruction policy) of <tt>unique_ptr</tt>: <tt>default_delete</tt>.
namespace boost{
+// @cond
namespace move_upd {
namespace bmupmu = ::boost::move_upmu;
@@ -96,6 +97,7 @@ typedef int bool_conversion::* explicit_bool_arg;
#endif
} //namespace move_upd {
+// @endcond
namespace movelib {
@@ -123,7 +125,11 @@ struct default_delete
#endif
#if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+ //! Trivial copy constructor
+ //!
default_delete(const default_delete&) BOOST_NOEXCEPT = default;
+ //! Trivial assignment
+ //!
default_delete &operator=(const default_delete&) BOOST_NOEXCEPT = default;
#else
typedef typename bmupmu::remove_extent<T>::type element_type;
diff --git a/boost/move/detail/fwd_macros.hpp b/boost/move/detail/fwd_macros.hpp
index 8d5ab2e9b9..e091890dc5 100644
--- a/boost/move/detail/fwd_macros.hpp
+++ b/boost/move/detail/fwd_macros.hpp
@@ -65,7 +65,7 @@ namespace move_detail {
//BOOST_MOVE_REPEATN(MACRO)
#define BOOST_MOVE_REPEAT0(MACRO)
-#define BOOST_MOVE_REPEAT1(MACRO) MACRO
+#define BOOST_MOVE_REPEAT1(MACRO) MACRO
#define BOOST_MOVE_REPEAT2(MACRO) BOOST_MOVE_REPEAT1(MACRO), MACRO
#define BOOST_MOVE_REPEAT3(MACRO) BOOST_MOVE_REPEAT2(MACRO), MACRO
#define BOOST_MOVE_REPEAT4(MACRO) BOOST_MOVE_REPEAT3(MACRO), MACRO
@@ -77,7 +77,7 @@ namespace move_detail {
//BOOST_MOVE_FWDN
#define BOOST_MOVE_FWD0
-#define BOOST_MOVE_FWD1 ::boost::forward<P0>(p0)
+#define BOOST_MOVE_FWD1 ::boost::forward<P0>(p0)
#define BOOST_MOVE_FWD2 BOOST_MOVE_FWD1, ::boost::forward<P1>(p1)
#define BOOST_MOVE_FWD3 BOOST_MOVE_FWD2, ::boost::forward<P2>(p2)
#define BOOST_MOVE_FWD4 BOOST_MOVE_FWD3, ::boost::forward<P3>(p3)
@@ -89,7 +89,7 @@ namespace move_detail {
//BOOST_MOVE_FWDQN
#define BOOST_MOVE_FWDQ0
-#define BOOST_MOVE_FWDQ1 ::boost::forward<Q0>(q0)
+#define BOOST_MOVE_FWDQ1 ::boost::forward<Q0>(q0)
#define BOOST_MOVE_FWDQ2 BOOST_MOVE_FWDQ1, ::boost::forward<Q1>(q1)
#define BOOST_MOVE_FWDQ3 BOOST_MOVE_FWDQ2, ::boost::forward<Q2>(q2)
#define BOOST_MOVE_FWDQ4 BOOST_MOVE_FWDQ3, ::boost::forward<Q3>(q3)
@@ -101,7 +101,7 @@ namespace move_detail {
//BOOST_MOVE_ARGN
#define BOOST_MOVE_ARG0
-#define BOOST_MOVE_ARG1 p0
+#define BOOST_MOVE_ARG1 p0
#define BOOST_MOVE_ARG2 BOOST_MOVE_ARG1, p1
#define BOOST_MOVE_ARG3 BOOST_MOVE_ARG2, p2
#define BOOST_MOVE_ARG4 BOOST_MOVE_ARG3, p3
@@ -111,9 +111,21 @@ namespace move_detail {
#define BOOST_MOVE_ARG8 BOOST_MOVE_ARG7, p7
#define BOOST_MOVE_ARG9 BOOST_MOVE_ARG8, p8
+//BOOST_MOVE_ARGQN
+#define BOOST_MOVE_ARGQ0
+#define BOOST_MOVE_ARGQ1 q0
+#define BOOST_MOVE_ARGQ2 BOOST_MOVE_ARGQ1, q1
+#define BOOST_MOVE_ARGQ3 BOOST_MOVE_ARGQ2, q2
+#define BOOST_MOVE_ARGQ4 BOOST_MOVE_ARGQ3, q3
+#define BOOST_MOVE_ARGQ5 BOOST_MOVE_ARGQ4, q4
+#define BOOST_MOVE_ARGQ6 BOOST_MOVE_ARGQ5, q5
+#define BOOST_MOVE_ARGQ7 BOOST_MOVE_ARGQ6, q6
+#define BOOST_MOVE_ARGQ8 BOOST_MOVE_ARGQ7, q7
+#define BOOST_MOVE_ARGQ9 BOOST_MOVE_ARGQ8, q8
+
//BOOST_MOVE_DECLVALN
#define BOOST_MOVE_DECLVAL0
-#define BOOST_MOVE_DECLVAL1 ::boost::move_detail::declval<P0>()
+#define BOOST_MOVE_DECLVAL1 ::boost::move_detail::declval<P0>()
#define BOOST_MOVE_DECLVAL2 BOOST_MOVE_DECLVAL1, ::boost::move_detail::declval<P1>()
#define BOOST_MOVE_DECLVAL3 BOOST_MOVE_DECLVAL2, ::boost::move_detail::declval<P2>()
#define BOOST_MOVE_DECLVAL4 BOOST_MOVE_DECLVAL3, ::boost::move_detail::declval<P3>()
@@ -123,19 +135,36 @@ namespace move_detail {
#define BOOST_MOVE_DECLVAL8 BOOST_MOVE_DECLVAL7, ::boost::move_detail::declval<P7>()
#define BOOST_MOVE_DECLVAL9 BOOST_MOVE_DECLVAL8, ::boost::move_detail::declval<P8>()
+//BOOST_MOVE_DECLVALQN
+#define BOOST_MOVE_DECLVALQ0
+#define BOOST_MOVE_DECLVALQ1 ::boost::move_detail::declval<Q0>()
+#define BOOST_MOVE_DECLVALQ2 BOOST_MOVE_DECLVALQ1, ::boost::move_detail::declval<Q1>()
+#define BOOST_MOVE_DECLVALQ3 BOOST_MOVE_DECLVALQ2, ::boost::move_detail::declval<Q2>()
+#define BOOST_MOVE_DECLVALQ4 BOOST_MOVE_DECLVALQ3, ::boost::move_detail::declval<Q3>()
+#define BOOST_MOVE_DECLVALQ5 BOOST_MOVE_DECLVALQ4, ::boost::move_detail::declval<Q4>()
+#define BOOST_MOVE_DECLVALQ6 BOOST_MOVE_DECLVALQ5, ::boost::move_detail::declval<Q5>()
+#define BOOST_MOVE_DECLVALQ7 BOOST_MOVE_DECLVALQ6, ::boost::move_detail::declval<Q6>()
+#define BOOST_MOVE_DECLVALQ8 BOOST_MOVE_DECLVALQ7, ::boost::move_detail::declval<Q7>()
+#define BOOST_MOVE_DECLVALQ9 BOOST_MOVE_DECLVALQ8, ::boost::move_detail::declval<Q8>()
+
#ifdef BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
#define BOOST_MOVE_MREF(T) ::boost::move_detail::mref<T>
#define BOOST_MOVE_MFWD(N) ::boost::forward<P##N>(this->m_p##N.get())
+ #define BOOST_MOVE_MFWDQ(N) ::boost::forward<Q##N>(this->m_q##N.get())
#else
#define BOOST_MOVE_MREF(T) BOOST_FWD_REF(T)
#define BOOST_MOVE_MFWD(N) ::boost::forward<P##N>(this->m_p##N)
+ #define BOOST_MOVE_MFWDQ(N) ::boost::forward<Q##N>(this->m_q##N)
#endif
#define BOOST_MOVE_MITFWD(N) *this->m_p##N
#define BOOST_MOVE_MINC(N) ++this->m_p##N
+#define BOOST_MOVE_MITFWDQ(N) *this->m_q##N
+#define BOOST_MOVE_MINCQ(N) ++this->m_q##N
+
//BOOST_MOVE_MFWDN
#define BOOST_MOVE_MFWD0
-#define BOOST_MOVE_MFWD1 BOOST_MOVE_MFWD(0)
+#define BOOST_MOVE_MFWD1 BOOST_MOVE_MFWD(0)
#define BOOST_MOVE_MFWD2 BOOST_MOVE_MFWD1, BOOST_MOVE_MFWD(1)
#define BOOST_MOVE_MFWD3 BOOST_MOVE_MFWD2, BOOST_MOVE_MFWD(2)
#define BOOST_MOVE_MFWD4 BOOST_MOVE_MFWD3, BOOST_MOVE_MFWD(3)
@@ -145,9 +174,21 @@ namespace move_detail {
#define BOOST_MOVE_MFWD8 BOOST_MOVE_MFWD7, BOOST_MOVE_MFWD(7)
#define BOOST_MOVE_MFWD9 BOOST_MOVE_MFWD8, BOOST_MOVE_MFWD(8)
+//BOOST_MOVE_MFWDN
+#define BOOST_MOVE_MFWDQ0
+#define BOOST_MOVE_MFWDQ1 BOOST_MOVE_MFWDQ(0)
+#define BOOST_MOVE_MFWDQ2 BOOST_MOVE_MFWDQ1, BOOST_MOVE_MFWDQ(1)
+#define BOOST_MOVE_MFWDQ3 BOOST_MOVE_MFWDQ2, BOOST_MOVE_MFWDQ(2)
+#define BOOST_MOVE_MFWDQ4 BOOST_MOVE_MFWDQ3, BOOST_MOVE_MFWDQ(3)
+#define BOOST_MOVE_MFWDQ5 BOOST_MOVE_MFWDQ4, BOOST_MOVE_MFWDQ(4)
+#define BOOST_MOVE_MFWDQ6 BOOST_MOVE_MFWDQ5, BOOST_MOVE_MFWDQ(5)
+#define BOOST_MOVE_MFWDQ7 BOOST_MOVE_MFWDQ6, BOOST_MOVE_MFWDQ(6)
+#define BOOST_MOVE_MFWDQ8 BOOST_MOVE_MFWDQ7, BOOST_MOVE_MFWDQ(7)
+#define BOOST_MOVE_MFWDQ9 BOOST_MOVE_MFWDQ8, BOOST_MOVE_MFWDQ(8)
+
//BOOST_MOVE_MINCN
#define BOOST_MOVE_MINC0
-#define BOOST_MOVE_MINC1 BOOST_MOVE_MINC(0)
+#define BOOST_MOVE_MINC1 BOOST_MOVE_MINC(0)
#define BOOST_MOVE_MINC2 BOOST_MOVE_MINC1, BOOST_MOVE_MINC(1)
#define BOOST_MOVE_MINC3 BOOST_MOVE_MINC2, BOOST_MOVE_MINC(2)
#define BOOST_MOVE_MINC4 BOOST_MOVE_MINC3, BOOST_MOVE_MINC(3)
@@ -157,9 +198,21 @@ namespace move_detail {
#define BOOST_MOVE_MINC8 BOOST_MOVE_MINC7, BOOST_MOVE_MINC(7)
#define BOOST_MOVE_MINC9 BOOST_MOVE_MINC8, BOOST_MOVE_MINC(8)
+//BOOST_MOVE_MINCQN
+#define BOOST_MOVE_MINCQ0
+#define BOOST_MOVE_MINCQ1 BOOST_MOVE_MINCQ(0)
+#define BOOST_MOVE_MINCQ2 BOOST_MOVE_MINCQ1, BOOST_MOVE_MINCQ(1)
+#define BOOST_MOVE_MINCQ3 BOOST_MOVE_MINCQ2, BOOST_MOVE_MINCQ(2)
+#define BOOST_MOVE_MINCQ4 BOOST_MOVE_MINCQ3, BOOST_MOVE_MINCQ(3)
+#define BOOST_MOVE_MINCQ5 BOOST_MOVE_MINCQ4, BOOST_MOVE_MINCQ(4)
+#define BOOST_MOVE_MINCQ6 BOOST_MOVE_MINCQ5, BOOST_MOVE_MINCQ(5)
+#define BOOST_MOVE_MINCQ7 BOOST_MOVE_MINCQ6, BOOST_MOVE_MINCQ(6)
+#define BOOST_MOVE_MINCQ8 BOOST_MOVE_MINCQ7, BOOST_MOVE_MINCQ(7)
+#define BOOST_MOVE_MINCQ9 BOOST_MOVE_MINCQ8, BOOST_MOVE_MINCQ(8)
+
//BOOST_MOVE_MITFWDN
#define BOOST_MOVE_MITFWD0
-#define BOOST_MOVE_MITFWD1 BOOST_MOVE_MITFWD(0)
+#define BOOST_MOVE_MITFWD1 BOOST_MOVE_MITFWD(0)
#define BOOST_MOVE_MITFWD2 BOOST_MOVE_MITFWD1, BOOST_MOVE_MITFWD(1)
#define BOOST_MOVE_MITFWD3 BOOST_MOVE_MITFWD2, BOOST_MOVE_MITFWD(2)
#define BOOST_MOVE_MITFWD4 BOOST_MOVE_MITFWD3, BOOST_MOVE_MITFWD(3)
@@ -169,10 +222,21 @@ namespace move_detail {
#define BOOST_MOVE_MITFWD8 BOOST_MOVE_MITFWD7, BOOST_MOVE_MITFWD(7)
#define BOOST_MOVE_MITFWD9 BOOST_MOVE_MITFWD8, BOOST_MOVE_MITFWD(8)
+//BOOST_MOVE_MITFWDQN
+#define BOOST_MOVE_MITFWDQ0
+#define BOOST_MOVE_MITFWDQ1 BOOST_MOVE_MITFWDQ(0)
+#define BOOST_MOVE_MITFWDQ2 BOOST_MOVE_MITFWDQ1, BOOST_MOVE_MITFWDQ(1)
+#define BOOST_MOVE_MITFWDQ3 BOOST_MOVE_MITFWDQ2, BOOST_MOVE_MITFWDQ(2)
+#define BOOST_MOVE_MITFWDQ4 BOOST_MOVE_MITFWDQ3, BOOST_MOVE_MITFWDQ(3)
+#define BOOST_MOVE_MITFWDQ5 BOOST_MOVE_MITFWDQ4, BOOST_MOVE_MITFWDQ(4)
+#define BOOST_MOVE_MITFWDQ6 BOOST_MOVE_MITFWDQ5, BOOST_MOVE_MITFWDQ(5)
+#define BOOST_MOVE_MITFWDQ7 BOOST_MOVE_MITFWDQ6, BOOST_MOVE_MITFWDQ(6)
+#define BOOST_MOVE_MITFWDQ8 BOOST_MOVE_MITFWDQ7, BOOST_MOVE_MITFWDQ(7)
+#define BOOST_MOVE_MITFWDQ9 BOOST_MOVE_MITFWDQ8, BOOST_MOVE_MITFWDQ(8)
//BOOST_MOVE_FWD_INITN
#define BOOST_MOVE_FWD_INIT0
-#define BOOST_MOVE_FWD_INIT1 m_p0(::boost::forward<P0>(p0))
+#define BOOST_MOVE_FWD_INIT1 m_p0(::boost::forward<P0>(p0))
#define BOOST_MOVE_FWD_INIT2 BOOST_MOVE_FWD_INIT1, m_p1(::boost::forward<P1>(p1))
#define BOOST_MOVE_FWD_INIT3 BOOST_MOVE_FWD_INIT2, m_p2(::boost::forward<P2>(p2))
#define BOOST_MOVE_FWD_INIT4 BOOST_MOVE_FWD_INIT3, m_p3(::boost::forward<P3>(p3))
@@ -182,9 +246,21 @@ namespace move_detail {
#define BOOST_MOVE_FWD_INIT8 BOOST_MOVE_FWD_INIT7, m_p7(::boost::forward<P7>(p7))
#define BOOST_MOVE_FWD_INIT9 BOOST_MOVE_FWD_INIT8, m_p8(::boost::forward<P8>(p8))
+//BOOST_MOVE_FWD_INITQN
+#define BOOST_MOVE_FWD_INITQ0
+#define BOOST_MOVE_FWD_INITQ1 m_q0(::boost::forward<Q0>(q0))
+#define BOOST_MOVE_FWD_INITQ2 BOOST_MOVE_FWD_INITQ1, m_q1(::boost::forward<Q1>(q1))
+#define BOOST_MOVE_FWD_INITQ3 BOOST_MOVE_FWD_INITQ2, m_q2(::boost::forward<Q2>(q2))
+#define BOOST_MOVE_FWD_INITQ4 BOOST_MOVE_FWD_INITQ3, m_q3(::boost::forward<Q3>(q3))
+#define BOOST_MOVE_FWD_INITQ5 BOOST_MOVE_FWD_INITQ4, m_q4(::boost::forward<Q4>(q4))
+#define BOOST_MOVE_FWD_INITQ6 BOOST_MOVE_FWD_INITQ5, m_q5(::boost::forward<Q5>(q5))
+#define BOOST_MOVE_FWD_INITQ7 BOOST_MOVE_FWD_INITQ6, m_q6(::boost::forward<Q6>(q6))
+#define BOOST_MOVE_FWD_INITQ8 BOOST_MOVE_FWD_INITQ7, m_q7(::boost::forward<Q7>(q7))
+#define BOOST_MOVE_FWD_INITQ9 BOOST_MOVE_FWD_INITQ8, m_q8(::boost::forward<Q8>(q8))
+
//BOOST_MOVE_VAL_INITN
#define BOOST_MOVE_VAL_INIT0
-#define BOOST_MOVE_VAL_INIT1 m_p0(p0)
+#define BOOST_MOVE_VAL_INIT1 m_p0(p0)
#define BOOST_MOVE_VAL_INIT2 BOOST_MOVE_VAL_INIT1, m_p1(p1)
#define BOOST_MOVE_VAL_INIT3 BOOST_MOVE_VAL_INIT2, m_p2(p2)
#define BOOST_MOVE_VAL_INIT4 BOOST_MOVE_VAL_INIT3, m_p3(p3)
@@ -194,9 +270,21 @@ namespace move_detail {
#define BOOST_MOVE_VAL_INIT8 BOOST_MOVE_VAL_INIT7, m_p7(p7)
#define BOOST_MOVE_VAL_INIT9 BOOST_MOVE_VAL_INIT8, m_p8(p8)
+//BOOST_MOVE_VAL_INITQN
+#define BOOST_MOVE_VAL_INITQ0
+#define BOOST_MOVE_VAL_INITQ1 m_q0(q0)
+#define BOOST_MOVE_VAL_INITQ2 BOOST_MOVE_VAL_INITQ1, m_q1(q1)
+#define BOOST_MOVE_VAL_INITQ3 BOOST_MOVE_VAL_INITQ2, m_q2(q2)
+#define BOOST_MOVE_VAL_INITQ4 BOOST_MOVE_VAL_INITQ3, m_q3(q3)
+#define BOOST_MOVE_VAL_INITQ5 BOOST_MOVE_VAL_INITQ4, m_q4(q4)
+#define BOOST_MOVE_VAL_INITQ6 BOOST_MOVE_VAL_INITQ5, m_q5(q5)
+#define BOOST_MOVE_VAL_INITQ7 BOOST_MOVE_VAL_INITQ6, m_q6(q6)
+#define BOOST_MOVE_VAL_INITQ8 BOOST_MOVE_VAL_INITQ7, m_q7(q7)
+#define BOOST_MOVE_VAL_INITQ9 BOOST_MOVE_VAL_INITQ8, m_q8(q8)
+
//BOOST_MOVE_UREFN
#define BOOST_MOVE_UREF0
-#define BOOST_MOVE_UREF1 BOOST_FWD_REF(P0) p0
+#define BOOST_MOVE_UREF1 BOOST_FWD_REF(P0) p0
#define BOOST_MOVE_UREF2 BOOST_MOVE_UREF1, BOOST_FWD_REF(P1) p1
#define BOOST_MOVE_UREF3 BOOST_MOVE_UREF2, BOOST_FWD_REF(P2) p2
#define BOOST_MOVE_UREF4 BOOST_MOVE_UREF3, BOOST_FWD_REF(P3) p3
@@ -206,9 +294,21 @@ namespace move_detail {
#define BOOST_MOVE_UREF8 BOOST_MOVE_UREF7, BOOST_FWD_REF(P7) p7
#define BOOST_MOVE_UREF9 BOOST_MOVE_UREF8, BOOST_FWD_REF(P8) p8
+//BOOST_MOVE_UREFQN
+#define BOOST_MOVE_UREFQ0
+#define BOOST_MOVE_UREFQ1 BOOST_FWD_REF(Q0) q0
+#define BOOST_MOVE_UREFQ2 BOOST_MOVE_UREFQ1, BOOST_FWD_REF(Q1) q1
+#define BOOST_MOVE_UREFQ3 BOOST_MOVE_UREFQ2, BOOST_FWD_REF(Q2) q2
+#define BOOST_MOVE_UREFQ4 BOOST_MOVE_UREFQ3, BOOST_FWD_REF(Q3) q3
+#define BOOST_MOVE_UREFQ5 BOOST_MOVE_UREFQ4, BOOST_FWD_REF(Q4) q4
+#define BOOST_MOVE_UREFQ6 BOOST_MOVE_UREFQ5, BOOST_FWD_REF(Q5) q5
+#define BOOST_MOVE_UREFQ7 BOOST_MOVE_UREFQ6, BOOST_FWD_REF(Q6) q6
+#define BOOST_MOVE_UREFQ8 BOOST_MOVE_UREFQ7, BOOST_FWD_REF(Q7) q7
+#define BOOST_MOVE_UREFQ9 BOOST_MOVE_UREFQ8, BOOST_FWD_REF(Q8) q8
+
//BOOST_MOVE_VALN
#define BOOST_MOVE_VAL0
-#define BOOST_MOVE_VAL1 P0 p0
+#define BOOST_MOVE_VAL1 BOOST_FWD_REF(P0) p0
#define BOOST_MOVE_VAL2 BOOST_MOVE_VAL1, BOOST_FWD_REF(P1) p1
#define BOOST_MOVE_VAL3 BOOST_MOVE_VAL2, BOOST_FWD_REF(P2) p2
#define BOOST_MOVE_VAL4 BOOST_MOVE_VAL3, BOOST_FWD_REF(P3) p3
@@ -218,22 +318,23 @@ namespace move_detail {
#define BOOST_MOVE_VAL8 BOOST_MOVE_VAL7, BOOST_FWD_REF(P7) p7
#define BOOST_MOVE_VAL9 BOOST_MOVE_VAL8, BOOST_FWD_REF(P8) p8
-//BOOST_MOVE_UREFQN
-#define BOOST_MOVE_UREFQ0
-#define BOOST_MOVE_UREFQ1 BOOST_FWD_REF(Q0) q0
-#define BOOST_MOVE_UREFQ2 BOOST_MOVE_UREFQ1, BOOST_FWD_REF(Q1) q1
-#define BOOST_MOVE_UREFQ3 BOOST_MOVE_UREFQ2, BOOST_FWD_REF(Q2) q2
-#define BOOST_MOVE_UREFQ4 BOOST_MOVE_UREFQ3, BOOST_FWD_REF(Q3) q3
-#define BOOST_MOVE_UREFQ5 BOOST_MOVE_UREFQ4, BOOST_FWD_REF(Q4) q4
-#define BOOST_MOVE_UREFQ6 BOOST_MOVE_UREFQ5, BOOST_FWD_REF(Q5) q5
-#define BOOST_MOVE_UREFQ7 BOOST_MOVE_UREFQ6, BOOST_FWD_REF(Q6) q6
-#define BOOST_MOVE_UREFQ8 BOOST_MOVE_UREFQ7, BOOST_FWD_REF(Q7) q7
-#define BOOST_MOVE_UREFQ9 BOOST_MOVE_UREFQ8, BOOST_FWD_REF(Q8) q8
+//BOOST_MOVE_VALQN
+#define BOOST_MOVE_VALQ0
+#define BOOST_MOVE_VALQ1 BOOST_FWD_REF(Q0) q0
+#define BOOST_MOVE_VALQ2 BOOST_MOVE_VALQ1, BOOST_FWD_REF(Q1) q1
+#define BOOST_MOVE_VALQ3 BOOST_MOVE_VALQ2, BOOST_FWD_REF(Q2) q2
+#define BOOST_MOVE_VALQ4 BOOST_MOVE_VALQ3, BOOST_FWD_REF(Q3) q3
+#define BOOST_MOVE_VALQ5 BOOST_MOVE_VALQ4, BOOST_FWD_REF(Q4) q4
+#define BOOST_MOVE_VALQ6 BOOST_MOVE_VALQ5, BOOST_FWD_REF(Q5) q5
+#define BOOST_MOVE_VALQ7 BOOST_MOVE_VALQ6, BOOST_FWD_REF(Q6) q6
+#define BOOST_MOVE_VALQ8 BOOST_MOVE_VALQ7, BOOST_FWD_REF(Q7) q7
+#define BOOST_MOVE_VALQ9 BOOST_MOVE_VALQ8, BOOST_FWD_REF(Q8) q8
+
-//BOOST_MOVE_CREFN
#define BOOST_MOVE_UNVOIDCREF(T) const typename boost::move_detail::unvoid<T>::type&
+//BOOST_MOVE_CREFN
#define BOOST_MOVE_CREF0
-#define BOOST_MOVE_CREF1 BOOST_MOVE_UNVOIDCREF(P0) p0
+#define BOOST_MOVE_CREF1 BOOST_MOVE_UNVOIDCREF(P0) p0
#define BOOST_MOVE_CREF2 BOOST_MOVE_CREF1, BOOST_MOVE_UNVOIDCREF(P1) p1
#define BOOST_MOVE_CREF3 BOOST_MOVE_CREF2, BOOST_MOVE_UNVOIDCREF(P2) p2
#define BOOST_MOVE_CREF4 BOOST_MOVE_CREF3, BOOST_MOVE_UNVOIDCREF(P3) p3
@@ -243,9 +344,21 @@ namespace move_detail {
#define BOOST_MOVE_CREF8 BOOST_MOVE_CREF7, BOOST_MOVE_UNVOIDCREF(P7) p7
#define BOOST_MOVE_CREF9 BOOST_MOVE_CREF8, BOOST_MOVE_UNVOIDCREF(P8) p8
+//BOOST_MOVE_CREFQN
+#define BOOST_MOVE_CREFQ0
+#define BOOST_MOVE_CREFQ1 BOOST_MOVE_UNVOIDCREF(Q0) q0
+#define BOOST_MOVE_CREFQ2 BOOST_MOVE_CREFQ1, BOOST_MOVE_UNVOIDCREF(Q1) q1
+#define BOOST_MOVE_CREFQ3 BOOST_MOVE_CREFQ2, BOOST_MOVE_UNVOIDCREF(Q2) q2
+#define BOOST_MOVE_CREFQ4 BOOST_MOVE_CREFQ3, BOOST_MOVE_UNVOIDCREF(Q3) q3
+#define BOOST_MOVE_CREFQ5 BOOST_MOVE_CREFQ4, BOOST_MOVE_UNVOIDCREF(Q4) q4
+#define BOOST_MOVE_CREFQ6 BOOST_MOVE_CREFQ5, BOOST_MOVE_UNVOIDCREF(Q5) q5
+#define BOOST_MOVE_CREFQ7 BOOST_MOVE_CREFQ6, BOOST_MOVE_UNVOIDCREF(Q6) q6
+#define BOOST_MOVE_CREFQ8 BOOST_MOVE_CREFQ7, BOOST_MOVE_UNVOIDCREF(Q7) q7
+#define BOOST_MOVE_CREFQ9 BOOST_MOVE_CREFQ8, BOOST_MOVE_UNVOIDCREF(Q8) q8
+
//BOOST_MOVE_CLASSN
#define BOOST_MOVE_CLASS0
-#define BOOST_MOVE_CLASS1 class P0
+#define BOOST_MOVE_CLASS1 class P0
#define BOOST_MOVE_CLASS2 BOOST_MOVE_CLASS1, class P1
#define BOOST_MOVE_CLASS3 BOOST_MOVE_CLASS2, class P2
#define BOOST_MOVE_CLASS4 BOOST_MOVE_CLASS3, class P3
@@ -257,7 +370,7 @@ namespace move_detail {
//BOOST_MOVE_CLASSQN
#define BOOST_MOVE_CLASSQ0
-#define BOOST_MOVE_CLASSQ1 class Q0
+#define BOOST_MOVE_CLASSQ1 class Q0
#define BOOST_MOVE_CLASSQ2 BOOST_MOVE_CLASSQ1, class Q1
#define BOOST_MOVE_CLASSQ3 BOOST_MOVE_CLASSQ2, class Q2
#define BOOST_MOVE_CLASSQ4 BOOST_MOVE_CLASSQ3, class Q3
@@ -269,7 +382,7 @@ namespace move_detail {
//BOOST_MOVE_CLASSDFLTN
#define BOOST_MOVE_CLASSDFLT0
-#define BOOST_MOVE_CLASSDFLT1 class P0 = void
+#define BOOST_MOVE_CLASSDFLT1 class P0 = void
#define BOOST_MOVE_CLASSDFLT2 BOOST_MOVE_CLASSDFLT1, class P1 = void
#define BOOST_MOVE_CLASSDFLT3 BOOST_MOVE_CLASSDFLT2, class P2 = void
#define BOOST_MOVE_CLASSDFLT4 BOOST_MOVE_CLASSDFLT3, class P3 = void
@@ -279,9 +392,21 @@ namespace move_detail {
#define BOOST_MOVE_CLASSDFLT8 BOOST_MOVE_CLASSDFLT7, class P7 = void
#define BOOST_MOVE_CLASSDFLT9 BOOST_MOVE_CLASSDFLT8, class P8 = void
+//BOOST_MOVE_CLASSDFLTQN
+#define BOOST_MOVE_CLASSDFLTQ0
+#define BOOST_MOVE_CLASSDFLTQ1 class Q0 = void
+#define BOOST_MOVE_CLASSDFLTQ2 BOOST_MOVE_CLASSDFLTQ1, class Q1 = void
+#define BOOST_MOVE_CLASSDFLTQ3 BOOST_MOVE_CLASSDFLTQ2, class Q2 = void
+#define BOOST_MOVE_CLASSDFLTQ4 BOOST_MOVE_CLASSDFLTQ3, class Q3 = void
+#define BOOST_MOVE_CLASSDFLTQ5 BOOST_MOVE_CLASSDFLTQ4, class Q4 = void
+#define BOOST_MOVE_CLASSDFLTQ6 BOOST_MOVE_CLASSDFLTQ5, class Q5 = void
+#define BOOST_MOVE_CLASSDFLTQ7 BOOST_MOVE_CLASSDFLTQ6, class Q6 = void
+#define BOOST_MOVE_CLASSDFLTQ8 BOOST_MOVE_CLASSDFLTQ7, class Q7 = void
+#define BOOST_MOVE_CLASSDFLTQ9 BOOST_MOVE_CLASSDFLTQ8, class Q8 = void
+
//BOOST_MOVE_TARGN
#define BOOST_MOVE_TARG0
-#define BOOST_MOVE_TARG1 P0
+#define BOOST_MOVE_TARG1 P0
#define BOOST_MOVE_TARG2 BOOST_MOVE_TARG1, P1
#define BOOST_MOVE_TARG3 BOOST_MOVE_TARG2, P2
#define BOOST_MOVE_TARG4 BOOST_MOVE_TARG3, P3
@@ -291,9 +416,21 @@ namespace move_detail {
#define BOOST_MOVE_TARG8 BOOST_MOVE_TARG7, P7
#define BOOST_MOVE_TARG9 BOOST_MOVE_TARG8, P8
+//BOOST_MOVE_TARGQN
+#define BOOST_MOVE_TARGQ0
+#define BOOST_MOVE_TARGQ1 Q0
+#define BOOST_MOVE_TARGQ2 BOOST_MOVE_TARGQ1, Q1
+#define BOOST_MOVE_TARGQ3 BOOST_MOVE_TARGQ2, Q2
+#define BOOST_MOVE_TARGQ4 BOOST_MOVE_TARGQ3, Q3
+#define BOOST_MOVE_TARGQ5 BOOST_MOVE_TARGQ4, Q4
+#define BOOST_MOVE_TARGQ6 BOOST_MOVE_TARGQ5, Q5
+#define BOOST_MOVE_TARGQ7 BOOST_MOVE_TARGQ6, Q6
+#define BOOST_MOVE_TARGQ8 BOOST_MOVE_TARGQ7, Q7
+#define BOOST_MOVE_TARGQ9 BOOST_MOVE_TARGQ8, Q8
+
//BOOST_MOVE_FWD_TN
#define BOOST_MOVE_FWD_T0
-#define BOOST_MOVE_FWD_T1 typename ::boost::move_detail::forward_type<P0>::type
+#define BOOST_MOVE_FWD_T1 typename ::boost::move_detail::forward_type<P0>::type
#define BOOST_MOVE_FWD_T2 BOOST_MOVE_FWD_T1, typename ::boost::move_detail::forward_type<P1>::type
#define BOOST_MOVE_FWD_T3 BOOST_MOVE_FWD_T2, typename ::boost::move_detail::forward_type<P2>::type
#define BOOST_MOVE_FWD_T4 BOOST_MOVE_FWD_T3, typename ::boost::move_detail::forward_type<P3>::type
@@ -303,9 +440,21 @@ namespace move_detail {
#define BOOST_MOVE_FWD_T8 BOOST_MOVE_FWD_T7, typename ::boost::move_detail::forward_type<P7>::type
#define BOOST_MOVE_FWD_T9 BOOST_MOVE_FWD_T8, typename ::boost::move_detail::forward_type<P8>::type
+//BOOST_MOVE_FWD_TQN
+#define BOOST_MOVE_FWD_TQ0
+#define BOOST_MOVE_FWD_TQ1 typename ::boost::move_detail::forward_type<Q0>::type
+#define BOOST_MOVE_FWD_TQ2 BOOST_MOVE_FWD_TQ1, typename ::boost::move_detail::forward_type<Q1>::type
+#define BOOST_MOVE_FWD_TQ3 BOOST_MOVE_FWD_TQ2, typename ::boost::move_detail::forward_type<Q2>::type
+#define BOOST_MOVE_FWD_TQ4 BOOST_MOVE_FWD_TQ3, typename ::boost::move_detail::forward_type<Q3>::type
+#define BOOST_MOVE_FWD_TQ5 BOOST_MOVE_FWD_TQ4, typename ::boost::move_detail::forward_type<Q4>::type
+#define BOOST_MOVE_FWD_TQ6 BOOST_MOVE_FWD_TQ5, typename ::boost::move_detail::forward_type<Q5>::type
+#define BOOST_MOVE_FWD_TQ7 BOOST_MOVE_FWD_TQ6, typename ::boost::move_detail::forward_type<Q6>::type
+#define BOOST_MOVE_FWD_TQ8 BOOST_MOVE_FWD_TQ7, typename ::boost::move_detail::forward_type<Q7>::type
+#define BOOST_MOVE_FWD_TQ9 BOOST_MOVE_FWD_TQ8, typename ::boost::move_detail::forward_type<Q8>::type
+
//BOOST_MOVE_MREFX
#define BOOST_MOVE_MREF0
-#define BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P0) m_p0;
+#define BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P0) m_p0;
#define BOOST_MOVE_MREF2 BOOST_MOVE_MREF1 BOOST_MOVE_MREF(P1) m_p1;
#define BOOST_MOVE_MREF3 BOOST_MOVE_MREF2 BOOST_MOVE_MREF(P2) m_p2;
#define BOOST_MOVE_MREF4 BOOST_MOVE_MREF3 BOOST_MOVE_MREF(P3) m_p3;
@@ -315,9 +464,21 @@ namespace move_detail {
#define BOOST_MOVE_MREF8 BOOST_MOVE_MREF7 BOOST_MOVE_MREF(P7) m_p7;
#define BOOST_MOVE_MREF9 BOOST_MOVE_MREF8 BOOST_MOVE_MREF(P8) m_p8;
+//BOOST_MOVE_MREFQX
+#define BOOST_MOVE_MREFQ0
+#define BOOST_MOVE_MREFQ1 BOOST_MOVE_MREFQ(Q0) m_q0;
+#define BOOST_MOVE_MREFQ2 BOOST_MOVE_MREFQ1 BOOST_MOVE_MREFQ(Q1) m_q1;
+#define BOOST_MOVE_MREFQ3 BOOST_MOVE_MREFQ2 BOOST_MOVE_MREFQ(Q2) m_q2;
+#define BOOST_MOVE_MREFQ4 BOOST_MOVE_MREFQ3 BOOST_MOVE_MREFQ(Q3) m_q3;
+#define BOOST_MOVE_MREFQ5 BOOST_MOVE_MREFQ4 BOOST_MOVE_MREFQ(Q4) m_q4;
+#define BOOST_MOVE_MREFQ6 BOOST_MOVE_MREFQ5 BOOST_MOVE_MREFQ(Q5) m_q5;
+#define BOOST_MOVE_MREFQ7 BOOST_MOVE_MREFQ6 BOOST_MOVE_MREFQ(Q6) m_q6;
+#define BOOST_MOVE_MREFQ8 BOOST_MOVE_MREFQ7 BOOST_MOVE_MREFQ(Q7) m_q7;
+#define BOOST_MOVE_MREFQ9 BOOST_MOVE_MREFQ8 BOOST_MOVE_MREFQ(Q8) m_q8;
+
//BOOST_MOVE_MEMBX
#define BOOST_MOVE_MEMB0
-#define BOOST_MOVE_MEMB1 P0 m_p0;
+#define BOOST_MOVE_MEMB1 P0 m_p0;
#define BOOST_MOVE_MEMB2 BOOST_MOVE_MEMB1 P1 m_p1;
#define BOOST_MOVE_MEMB3 BOOST_MOVE_MEMB2 P2 m_p2;
#define BOOST_MOVE_MEMB4 BOOST_MOVE_MEMB3 P3 m_p3;
@@ -327,6 +488,18 @@ namespace move_detail {
#define BOOST_MOVE_MEMB8 BOOST_MOVE_MEMB7 P7 m_p7;
#define BOOST_MOVE_MEMB9 BOOST_MOVE_MEMB8 P8 m_p8;
+//BOOST_MOVE_MEMBQX
+#define BOOST_MOVE_MEMBQ0
+#define BOOST_MOVE_MEMBQ1 Q0 m_q0;
+#define BOOST_MOVE_MEMBQ2 BOOST_MOVE_MEMBQ1 Q1 m_q1;
+#define BOOST_MOVE_MEMBQ3 BOOST_MOVE_MEMBQ2 Q2 m_q2;
+#define BOOST_MOVE_MEMBQ4 BOOST_MOVE_MEMBQ3 Q3 m_q3;
+#define BOOST_MOVE_MEMBQ5 BOOST_MOVE_MEMBQ4 Q4 m_q4;
+#define BOOST_MOVE_MEMBQ6 BOOST_MOVE_MEMBQ5 Q5 m_q5;
+#define BOOST_MOVE_MEMBQ7 BOOST_MOVE_MEMBQ6 Q6 m_q6;
+#define BOOST_MOVE_MEMBQ8 BOOST_MOVE_MEMBQ7 Q7 m_q7;
+#define BOOST_MOVE_MEMBQ9 BOOST_MOVE_MEMBQ8 Q8 m_q8;
+
//BOOST_MOVE_TMPL_LTN
#define BOOST_MOVE_TMPL_LT0
#define BOOST_MOVE_TMPL_LT1 template<
@@ -412,7 +585,7 @@ namespace move_detail {
#define BOOST_MOVE_COLON9 BOOST_MOVE_COLON1
//BOOST_MOVE_ITERATE_2TON
-#define BOOST_MOVE_ITERATE_2TO2(MACROFUNC) MACROFUNC(2)
+#define BOOST_MOVE_ITERATE_2TO2(MACROFUNC) MACROFUNC(2)
#define BOOST_MOVE_ITERATE_2TO3(MACROFUNC) BOOST_MOVE_ITERATE_2TO2(MACROFUNC) MACROFUNC(3)
#define BOOST_MOVE_ITERATE_2TO4(MACROFUNC) BOOST_MOVE_ITERATE_2TO3(MACROFUNC) MACROFUNC(4)
#define BOOST_MOVE_ITERATE_2TO5(MACROFUNC) BOOST_MOVE_ITERATE_2TO4(MACROFUNC) MACROFUNC(5)
@@ -422,7 +595,7 @@ namespace move_detail {
#define BOOST_MOVE_ITERATE_2TO9(MACROFUNC) BOOST_MOVE_ITERATE_2TO8(MACROFUNC) MACROFUNC(9)
//BOOST_MOVE_ITERATE_1TON
-#define BOOST_MOVE_ITERATE_1TO1(MACROFUNC) MACROFUNC(1)
+#define BOOST_MOVE_ITERATE_1TO1(MACROFUNC) MACROFUNC(1)
#define BOOST_MOVE_ITERATE_1TO2(MACROFUNC) BOOST_MOVE_ITERATE_1TO1(MACROFUNC) MACROFUNC(2)
#define BOOST_MOVE_ITERATE_1TO3(MACROFUNC) BOOST_MOVE_ITERATE_1TO2(MACROFUNC) MACROFUNC(3)
#define BOOST_MOVE_ITERATE_1TO4(MACROFUNC) BOOST_MOVE_ITERATE_1TO3(MACROFUNC) MACROFUNC(4)
@@ -433,7 +606,7 @@ namespace move_detail {
#define BOOST_MOVE_ITERATE_1TO9(MACROFUNC) BOOST_MOVE_ITERATE_1TO8(MACROFUNC) MACROFUNC(9)
//BOOST_MOVE_ITERATE_0TON
-#define BOOST_MOVE_ITERATE_0TO0(MACROFUNC) MACROFUNC(0)
+#define BOOST_MOVE_ITERATE_0TO0(MACROFUNC) MACROFUNC(0)
#define BOOST_MOVE_ITERATE_0TO1(MACROFUNC) BOOST_MOVE_ITERATE_0TO0(MACROFUNC) MACROFUNC(1)
#define BOOST_MOVE_ITERATE_0TO2(MACROFUNC) BOOST_MOVE_ITERATE_0TO1(MACROFUNC) MACROFUNC(2)
#define BOOST_MOVE_ITERATE_0TO3(MACROFUNC) BOOST_MOVE_ITERATE_0TO2(MACROFUNC) MACROFUNC(3)
@@ -456,6 +629,29 @@ namespace move_detail {
#define BOOST_MOVE_ITERATE_8TO8(MACROFUNC) MACROFUNC(8)
#define BOOST_MOVE_ITERATE_9TO9(MACROFUNC) MACROFUNC(9)
+//BOOST_MOVE_ITER2D_0TO9
+#define BOOST_MOVE_ITER2DLOW_0TO0(MACROFUNC2D, M) MACROFUNC2D(M, 0)
+#define BOOST_MOVE_ITER2DLOW_0TO1(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO0(MACROFUNC2D, M) MACROFUNC2D(M, 1)
+#define BOOST_MOVE_ITER2DLOW_0TO2(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO1(MACROFUNC2D, M) MACROFUNC2D(M, 2)
+#define BOOST_MOVE_ITER2DLOW_0TO3(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO2(MACROFUNC2D, M) MACROFUNC2D(M, 3)
+#define BOOST_MOVE_ITER2DLOW_0TO4(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO3(MACROFUNC2D, M) MACROFUNC2D(M, 4)
+#define BOOST_MOVE_ITER2DLOW_0TO5(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO4(MACROFUNC2D, M) MACROFUNC2D(M, 5)
+#define BOOST_MOVE_ITER2DLOW_0TO6(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO5(MACROFUNC2D, M) MACROFUNC2D(M, 6)
+#define BOOST_MOVE_ITER2DLOW_0TO7(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO6(MACROFUNC2D, M) MACROFUNC2D(M, 7)
+#define BOOST_MOVE_ITER2DLOW_0TO8(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO7(MACROFUNC2D, M) MACROFUNC2D(M, 8)
+#define BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, M) BOOST_MOVE_ITER2DLOW_0TO8(MACROFUNC2D, M) MACROFUNC2D(M, 9)
+//
+#define BOOST_MOVE_ITER2D_0TO0(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 0)
+#define BOOST_MOVE_ITER2D_0TO1(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO0(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 1)
+#define BOOST_MOVE_ITER2D_0TO2(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO1(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 2)
+#define BOOST_MOVE_ITER2D_0TO3(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO2(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 3)
+#define BOOST_MOVE_ITER2D_0TO4(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO3(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 4)
+#define BOOST_MOVE_ITER2D_0TO5(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO4(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 5)
+#define BOOST_MOVE_ITER2D_0TO6(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO5(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 6)
+#define BOOST_MOVE_ITER2D_0TO7(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO6(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 7)
+#define BOOST_MOVE_ITER2D_0TO8(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO7(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 8)
+#define BOOST_MOVE_ITER2D_0TO9(MACROFUNC2D) BOOST_MOVE_ITER2D_0TO8(MACROFUNC2D) BOOST_MOVE_ITER2DLOW_0TO9(MACROFUNC2D, 9)
+
//BOOST_MOVE_CAT
#define BOOST_MOVE_CAT(a, b) BOOST_MOVE_CAT_I(a, b)
#define BOOST_MOVE_CAT_I(a, b) a ## b
diff --git a/boost/move/detail/iterator_traits.hpp b/boost/move/detail/iterator_traits.hpp
index 2c5dc3eaeb..a75ee03827 100644
--- a/boost/move/detail/iterator_traits.hpp
+++ b/boost/move/detail/iterator_traits.hpp
@@ -24,17 +24,7 @@
#include <cstddef>
-#if defined(__clang__) && defined(_LIBCPP_VERSION)
- #define BOOST_MOVE_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wc++11-extensions"
- #define BOOST_MOVE_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
- #define BOOST_MOVE_STD_NS_END _LIBCPP_END_NAMESPACE_STD
-#else
- #define BOOST_MOVE_STD_NS_BEG namespace std{
- #define BOOST_MOVE_STD_NS_END }
-#endif
-
+#include <boost/move/detail/std_ns_begin.hpp>
BOOST_MOVE_STD_NS_BEG
struct input_iterator_tag;
@@ -44,11 +34,7 @@ struct random_access_iterator_tag;
struct output_iterator_tag;
BOOST_MOVE_STD_NS_END
-
-#ifdef BOOST_MOVE_CLANG_INLINE_STD_NS
- #pragma GCC diagnostic pop
- #undef BOOST_MOVE_CLANG_INLINE_STD_NS
-#endif //BOOST_MOVE_CLANG_INLINE_STD_NS
+#include <boost/move/detail/std_ns_end.hpp>
namespace boost{ namespace movelib{
diff --git a/boost/move/detail/meta_utils.hpp b/boost/move/detail/meta_utils.hpp
index a8a61dbd7b..323c13af10 100644
--- a/boost/move/detail/meta_utils.hpp
+++ b/boost/move/detail/meta_utils.hpp
@@ -332,6 +332,11 @@ struct eval_if
: if_<C,T1,T2>::type
{};
+
+#if defined(BOOST_GCC) && (BOOST_GCC <= 40000)
+#define BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN
+#endif
+
template<class T, class U, class R = void>
struct enable_if_convertible
: enable_if< is_convertible<T, U>, R>
diff --git a/boost/move/detail/move_helpers.hpp b/boost/move/detail/move_helpers.hpp
index e3b8883159..7b62e26994 100644
--- a/boost/move/detail/move_helpers.hpp
+++ b/boost/move/detail/move_helpers.hpp
@@ -26,9 +26,9 @@
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#define BOOST_MOVE_CATCH_CONST(U) \
- typename ::boost::move_detail::if_< ::boost::move_detail::is_class_or_union<U>, BOOST_CATCH_CONST_RLVALUE(U), const U &>::type
+ typename ::boost::move_detail::if_< ::boost::move_detail::is_class<U>, BOOST_CATCH_CONST_RLVALUE(U), const U &>::type
#define BOOST_MOVE_CATCH_RVALUE(U)\
- typename ::boost::move_detail::if_< ::boost::move_detail::is_class_or_union<U>, BOOST_RV_REF(U), ::boost::move_detail::nat>::type
+ typename ::boost::move_detail::if_< ::boost::move_detail::is_class<U>, BOOST_RV_REF(U), ::boost::move_detail::nat>::type
#define BOOST_MOVE_CATCH_FWD(U) BOOST_FWD_REF(U)
#else
#define BOOST_MOVE_CATCH_CONST(U) const U &
@@ -36,142 +36,216 @@
#define BOOST_MOVE_CATCH_FWD(U) U &&
#endif
-#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(::boost::move(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(TYPE &x)\
- { return FWD_FUNCTION(const_cast<const TYPE &>(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::enable_if_and\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::move_detail::is_class_or_union<TYPE>\
- , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
- >::type\
- PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
- { return FWD_FUNCTION(u); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::disable_if_or\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
- , ::boost::move_detail::and_ \
- < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
- , ::boost::move_detail::is_class_or_union<BOOST_MOVE_TEMPL_PARAM> \
- > \
- >::type\
- PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(::boost::move(t));\
- }\
+////////////////////////////////////////
+//
+// BOOST_MOVE_CONVERSION_AWARE_CATCH
//
+////////////////////////////////////////
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(::boost::move(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(TYPE &x)\
+ { return FWD_FUNCTION(const_cast<const TYPE &>(x)); }\
+ //
+ #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::enable_if_and\
+ < ::boost::move_detail::nat \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_class<TYPE>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type* = 0)\
+ { return FWD_FUNCTION(u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::disable_if_or\
+ < ::boost::move_detail::nat \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::and_ \
+ < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::is_class<BOOST_MOVE_TEMPL_PARAM> \
+ > \
+ >::type* = 0)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(::boost::move(t));\
+ }\
+ //
+ #else
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::enable_if_and\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_class<TYPE>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type\
+ PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+ { return FWD_FUNCTION(u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::disable_if_or\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::and_ \
+ < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::is_class<BOOST_MOVE_TEMPL_PARAM> \
+ > \
+ >::type\
+ PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(::boost::move(t));\
+ }\
+ //
+ #endif
#elif (defined(_MSC_VER) && (_MSC_VER == 1600))
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(::boost::move(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::enable_if_c\
- < !::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value\
- , RETURN_VALUE >::type\
- PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(::boost::move(t));\
- }\
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(::boost::move(x)); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::enable_if_c\
+ < !::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value\
+ , RETURN_VALUE >::type\
+ PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(::boost::move(t));\
+ }\
+ //
+
+#else //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(::boost::move(x)); }\
+ //
+
+#endif //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+////////////////////////////////////////
//
-
-#else
-
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(::boost::move(x)); }\
+// BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG
//
-
-#endif
-
+////////////////////////////////////////
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, TYPE &x)\
- { return FWD_FUNCTION(arg1, const_cast<const TYPE &>(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::enable_if_and\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
- >::type\
- PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
- { return FWD_FUNCTION(arg1, u); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::disable_if_or\
- < RETURN_VALUE \
- , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
- >::type\
- PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(arg1, ::boost::move(t));\
- }\
-//
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, TYPE &x)\
+ { return FWD_FUNCTION(arg1, const_cast<const TYPE &>(x)); }\
+ //
+ #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::enable_if_and\
+ < ::boost::move_detail::nat \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type* = 0)\
+ { return FWD_FUNCTION(arg1, u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::disable_if_or\
+ < void \
+ , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
+ >::type* = 0)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(arg1, ::boost::move(t));\
+ }\
+ //
+ #else
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::enable_if_and\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type\
+ PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+ { return FWD_FUNCTION(arg1, u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::disable_if_or\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
+ >::type\
+ PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(arg1, ::boost::move(t));\
+ }\
+ //
+ #endif
#elif (defined(_MSC_VER) && (_MSC_VER == 1600))
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::disable_if_or\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
- , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO> \
- >::type\
- PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(arg1, ::boost::move(t));\
- }\
-//
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::disable_if_or\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO> \
+ >::type\
+ PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(arg1, ::boost::move(t));\
+ }\
+ //
#else
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
-//
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
+ //
#endif
diff --git a/boost/move/detail/std_ns_begin.hpp b/boost/move/detail/std_ns_begin.hpp
new file mode 100644
index 0000000000..a768e61a15
--- /dev/null
+++ b/boost/move/detail/std_ns_begin.hpp
@@ -0,0 +1,30 @@
+#//////////////////////////////////////////////////////////////////////////////
+#//
+#// (C) Copyright Ion Gaztanaga 2015-2015.
+#// Distributed under the Boost Software License, Version 1.0.
+#// (See accompanying file LICENSE_1_0.txt or copy at
+#// http://www.boost.org/LICENSE_1_0.txt)
+#//
+#// See http://www.boost.org/libs/move for documentation.
+#//
+#//////////////////////////////////////////////////////////////////////////////
+#
+#if defined(_LIBCPP_VERSION)
+ #if defined(__clang__)
+ #define BOOST_MOVE_STD_NS_GCC_DIAGNOSTIC_PUSH
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wc++11-extensions"
+ #endif
+ #define BOOST_MOVE_STD_NS_BEG _LIBCPP_BEGIN_NAMESPACE_STD
+ #define BOOST_MOVE_STD_NS_END _LIBCPP_END_NAMESPACE_STD
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE_VERSION) //GCC >= 4.6
+ #define BOOST_MOVE_STD_NS_BEG namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ #define BOOST_MOVE_STD_NS_END _GLIBCXX_END_NAMESPACE_VERSION } // namespace
+#elif defined(BOOST_GNU_STDLIB) && defined(_GLIBCXX_BEGIN_NAMESPACE) //GCC >= 4.2
+ #define BOOST_MOVE_STD_NS_BEG _GLIBCXX_BEGIN_NAMESPACE(std)
+ #define BOOST_MOVE_STD_NS_END _GLIBCXX_END_NAMESPACE
+#else
+ #define BOOST_MOVE_STD_NS_BEG namespace std{
+ #define BOOST_MOVE_STD_NS_END }
+#endif
+
diff --git a/boost/move/detail/std_ns_end.hpp b/boost/move/detail/std_ns_end.hpp
new file mode 100644
index 0000000000..097505995b
--- /dev/null
+++ b/boost/move/detail/std_ns_end.hpp
@@ -0,0 +1,14 @@
+#//////////////////////////////////////////////////////////////////////////////
+#//
+#// (C) Copyright Ion Gaztanaga 2015-2015.
+#// Distributed under the Boost Software License, Version 1.0.
+#// (See accompanying file LICENSE_1_0.txt or copy at
+#// http://www.boost.org/LICENSE_1_0.txt)
+#//
+#// See http://www.boost.org/libs/move for documentation.
+#//
+#//////////////////////////////////////////////////////////////////////////////
+#ifdef BOOST_MOVE_STD_NS_GCC_DIAGNOSTIC_PUSH
+ #pragma GCC diagnostic pop
+ #undef BOOST_MOVE_STD_NS_GCC_DIAGNOSTIC_PUSH
+#endif //BOOST_MOVE_STD_NS_GCC_DIAGNOSTIC_PUSH
diff --git a/boost/move/detail/type_traits.hpp b/boost/move/detail/type_traits.hpp
index ab79fb128b..816fdca7b2 100644
--- a/boost/move/detail/type_traits.hpp
+++ b/boost/move/detail/type_traits.hpp
@@ -480,7 +480,7 @@ template <class T>
struct remove_all_extents<T[]>
{ typedef typename remove_all_extents<T>::type type; };
-template <class T, size_t N>
+template <class T, std::size_t N>
struct remove_all_extents<T[N]>
{ typedef typename remove_all_extents<T>::type type;};
@@ -1003,7 +1003,7 @@ BOOST_MOVE_ALIGNED_STORAGE_WITH_BOOST_ALIGNMENT(0x1000)
#else //BOOST_NO_ALIGNMENT
-template<class T, size_t Len>
+template<class T, std::size_t Len>
union aligned_union
{
T aligner;
diff --git a/boost/move/unique_ptr.hpp b/boost/move/unique_ptr.hpp
index bcf4faeea0..5b067436af 100644
--- a/boost/move/unique_ptr.hpp
+++ b/boost/move/unique_ptr.hpp
@@ -38,7 +38,7 @@
//! specially in C++03 compilers:
//! - <tt>operator < </tt> uses pointer <tt>operator < </tt>instead of <tt>std::less<common_type></tt>.
//! This avoids dependencies on <tt>std::common_type</tt> and <tt>std::less</tt>
-//! (<tt><type_traits>/<functional></tt> headers. In C++03 this avoid pulling Boost.Typeof and other
+//! (<tt><type_traits>/<functional></tt> headers). In C++03 this avoid pulling Boost.Typeof and other
//! cascading dependencies. As in all Boost platforms <tt>operator <</tt> on raw pointers and
//! other smart pointers provides strict weak ordering in practice this should not be a problem for users.
//! - assignable from literal 0 for compilers without nullptr
@@ -46,6 +46,7 @@
//! cv-less T and cv-less U are the same type and T is more CV qualified than U.
namespace boost{
+// @cond
namespace move_upd {
////////////////////////////////////////////
@@ -301,6 +302,7 @@ struct enable_up_moveconv_constr
{};
} //namespace move_upd {
+// @endcond
namespace movelib {
diff --git a/boost/move/utility_core.hpp b/boost/move/utility_core.hpp
index 89e4f07f8b..7fd1ea1443 100644
--- a/boost/move/utility_core.hpp
+++ b/boost/move/utility_core.hpp
@@ -265,6 +265,8 @@
#if defined(BOOST_MOVE_DOXYGEN_INVOKED)
+ //! <b>Effects</b>: Calls `boost::move` if `input_reference` is not a lvalue reference.
+ //! Otherwise returns the reference
template <class T> output_reference move_if_not_lvalue_reference(input_reference) noexcept;
#elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
diff --git a/boost/mpi/collectives/reduce.hpp b/boost/mpi/collectives/reduce.hpp
index 4a94d71c12..1e2722ee6d 100644
--- a/boost/mpi/collectives/reduce.hpp
+++ b/boost/mpi/collectives/reduce.hpp
@@ -46,7 +46,7 @@ namespace detail {
template<typename T, typename Op>
void
reduce_impl(const communicator& comm, const T* in_values, int n,
- T* out_values, Op op, int root, mpl::true_ /*is_mpi_op*/,
+ T* out_values, Op /*op*/, int root, mpl::true_ /*is_mpi_op*/,
mpl::true_/*is_mpi_datatype*/)
{
BOOST_MPI_CHECK_RESULT(MPI_Reduce,
@@ -59,7 +59,7 @@ namespace detail {
// datatype and operation, so we'll use MPI_Reduce directly.
template<typename T, typename Op>
void
- reduce_impl(const communicator& comm, const T* in_values, int n, Op op,
+ reduce_impl(const communicator& comm, const T* in_values, int n, Op /*op*/,
int root, mpl::true_ /*is_mpi_op*/, mpl::true_/*is_mpi_datatype*/)
{
BOOST_MPI_CHECK_RESULT(MPI_Reduce,
diff --git a/boost/mpi/collectives/scan.hpp b/boost/mpi/collectives/scan.hpp
index 4cba4a83cb..9264838ae8 100644
--- a/boost/mpi/collectives/scan.hpp
+++ b/boost/mpi/collectives/scan.hpp
@@ -47,7 +47,7 @@ namespace detail {
template<typename T, typename Op>
void
scan_impl(const communicator& comm, const T* in_values, int n, T* out_values,
- Op op, mpl::true_ /*is_mpi_op*/, mpl::true_ /*is_mpi_datatype*/)
+ Op /*op*/, mpl::true_ /*is_mpi_op*/, mpl::true_ /*is_mpi_datatype*/)
{
BOOST_MPI_CHECK_RESULT(MPI_Scan,
(const_cast<T*>(in_values), out_values, n,
diff --git a/boost/mpi/detail/forward_skeleton_iarchive.hpp b/boost/mpi/detail/forward_skeleton_iarchive.hpp
index c4b9e0f2a8..0dfcaf9748 100644
--- a/boost/mpi/detail/forward_skeleton_iarchive.hpp
+++ b/boost/mpi/detail/forward_skeleton_iarchive.hpp
@@ -61,10 +61,10 @@ BOOST_ARCHIVE_FORWARD_IMPLEMENTATION(archive::tracking_type)
BOOST_ARCHIVE_FORWARD_IMPLEMENTATION(archive::class_name_type)
BOOST_ARCHIVE_FORWARD_IMPLEMENTATION(serialization::collection_size_type)
- void load_override(std::string & s , int)
+ void load_override(std::string & s)
{
serialization::collection_size_type length(s.size());
- load_override(length,0);
+ load_override(length);
s.resize(length);
}
diff --git a/boost/mpi/detail/forward_skeleton_oarchive.hpp b/boost/mpi/detail/forward_skeleton_oarchive.hpp
index 4b0e057266..1a170b4ab7 100644
--- a/boost/mpi/detail/forward_skeleton_oarchive.hpp
+++ b/boost/mpi/detail/forward_skeleton_oarchive.hpp
@@ -61,9 +61,9 @@ BOOST_ARCHIVE_FORWARD_IMPLEMENTATION(archive::tracking_type)
BOOST_ARCHIVE_FORWARD_IMPLEMENTATION(archive::class_name_type)
BOOST_ARCHIVE_FORWARD_IMPLEMENTATION(serialization::collection_size_type)
- void save_override(std::string const & t , int)
+ void save_override(std::string const & t)
{
- save_override(serialization::collection_size_type(t.size()),0);
+ save_override(serialization::collection_size_type(t.size()));
}
diff --git a/boost/mpi/detail/ignore_skeleton_oarchive.hpp b/boost/mpi/detail/ignore_skeleton_oarchive.hpp
index 29248f993d..f9285a25d3 100644
--- a/boost/mpi/detail/ignore_skeleton_oarchive.hpp
+++ b/boost/mpi/detail/ignore_skeleton_oarchive.hpp
@@ -58,10 +58,10 @@ BOOST_ARCHIVE_IGNORE_IMPLEMENTATION(archive::class_name_type)
BOOST_ARCHIVE_IGNORE_IMPLEMENTATION(serialization::collection_size_type)
BOOST_ARCHIVE_IGNORE_IMPLEMENTATION(serialization::item_version_type)
- void save_override(std::string const & s, int)
+ void save_override(std::string const & s)
{
if (s.size())
- save_override(serialization::make_array(s.data(),s.size()),0);
+ save_override(serialization::make_array(s.data(),s.size()));
}
#undef BOOST_ARCHIVE_IGNORE_IMPLEMENTATION
diff --git a/boost/mpl/string.hpp b/boost/mpl/string.hpp
index 345918f902..e7898562df 100644
--- a/boost/mpl/string.hpp
+++ b/boost/mpl/string.hpp
@@ -59,7 +59,7 @@ namespace boost { namespace mpl
#define BOOST_MPL_MULTICHAR_LENGTH(c) \
(std::size_t)((c<CHAR_MIN) ? 4 : ((c>0xffffff)+(c>0xffff)+(c>0xff)+1))
- #if defined(BOOST_ENDIAN_LITTLE_BYTE) && defined(__SUNPRO_CC)
+ #if BOOST_ENDIAN_LITTLE_BYTE && defined(__SUNPRO_CC)
#define BOOST_MPL_MULTICHAR_AT(c,i) \
(char)(0xff&((unsigned)(c)>>(8*(std::size_t)(i))))
diff --git a/boost/multi_index/detail/ord_index_impl.hpp b/boost/multi_index/detail/ord_index_impl.hpp
index 8ebaccb2cf..040cb98963 100644
--- a/boost/multi_index/detail/ord_index_impl.hpp
+++ b/boost/multi_index/detail/ord_index_impl.hpp
@@ -1556,7 +1556,7 @@ template<
inline boost::mpl::true_* boost_foreach_is_noncopyable(
boost::multi_index::detail::ordered_index<
KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>*&,
- boost::foreach::tag)
+ boost_foreach_argument_dependent_lookup_hack)
{
return 0;
}
diff --git a/boost/multi_index/global_fun.hpp b/boost/multi_index/global_fun.hpp
index 3ae2afdafc..2c13769100 100644
--- a/boost/multi_index/global_fun.hpp
+++ b/boost/multi_index/global_fun.hpp
@@ -14,6 +14,7 @@
#endif
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
+#include <boost/detail/workaround.hpp>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_reference.hpp>
@@ -80,7 +81,14 @@ struct const_ref_global_fun_base
Type operator()(
const reference_wrapper<
typename remove_const<
- typename remove_reference<Value>::type>::type>& x)const
+ typename remove_reference<Value>::type>::type>& x
+
+#if BOOST_WORKAROUND(BOOST_MSVC,==1310)
+/* http://lists.boost.org/Archives/boost/2015/10/226135.php */
+ ,int=0
+#endif
+
+ )const
{
return operator()(x.get());
}
diff --git a/boost/multi_index/hashed_index.hpp b/boost/multi_index/hashed_index.hpp
index 436fecf771..352d0c13f1 100644
--- a/boost/multi_index/hashed_index.hpp
+++ b/boost/multi_index/hashed_index.hpp
@@ -1714,7 +1714,7 @@ template<
inline boost::mpl::true_* boost_foreach_is_noncopyable(
boost::multi_index::detail::hashed_index<
KeyFromValue,Hash,Pred,SuperMeta,TagList,Category>*&,
- boost::foreach::tag)
+ boost_foreach_argument_dependent_lookup_hack)
{
return 0;
}
diff --git a/boost/multi_index/identity.hpp b/boost/multi_index/identity.hpp
index 370deb928b..6c832ce156 100644
--- a/boost/multi_index/identity.hpp
+++ b/boost/multi_index/identity.hpp
@@ -14,6 +14,7 @@
#endif
#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
#include <boost/mpl/if.hpp>
#include <boost/multi_index/identity_fwd.hpp>
#include <boost/type_traits/is_const.hpp>
@@ -71,7 +72,14 @@ struct const_identity_base
}
Type& operator()(
- const reference_wrapper<typename remove_const<Type>::type>& x)const
+ const reference_wrapper<typename remove_const<Type>::type>& x
+
+#if BOOST_WORKAROUND(BOOST_MSVC,==1310)
+/* http://lists.boost.org/Archives/boost/2015/10/226135.php */
+ ,int=0
+#endif
+
+ )const
{
return x.get();
}
diff --git a/boost/multi_index/random_access_index.hpp b/boost/multi_index/random_access_index.hpp
index 5a628fb75a..fe1884ddd3 100644
--- a/boost/multi_index/random_access_index.hpp
+++ b/boost/multi_index/random_access_index.hpp
@@ -1156,7 +1156,7 @@ struct random_access
template<typename SuperMeta,typename TagList>
inline boost::mpl::true_* boost_foreach_is_noncopyable(
boost::multi_index::detail::random_access_index<SuperMeta,TagList>*&,
- boost::foreach::tag)
+ boost_foreach_argument_dependent_lookup_hack)
{
return 0;
}
diff --git a/boost/multi_index/ranked_index.hpp b/boost/multi_index/ranked_index.hpp
index a5da5242ca..4fd4d32c75 100644
--- a/boost/multi_index/ranked_index.hpp
+++ b/boost/multi_index/ranked_index.hpp
@@ -270,7 +270,7 @@ struct rank_policy
typedef ranked_index<OrderedIndexImpl> type;
};
- /* algorihmic stuff */
+ /* algorithmic stuff */
template<typename Pointer>
static void add(Pointer x,Pointer root)
@@ -302,13 +302,13 @@ struct rank_policy
{
y->size=x->size;
x->size=ranked_node_size(x->left())+ranked_node_size(x->right())+1;
- };
+ }
template<typename Pointer>
static void rotate_right(Pointer x,Pointer y) /* in: x==y->right() */
{
rotate_left(x,y);
- };
+ }
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
/* invariant stuff */
diff --git a/boost/multi_index/sequenced_index.hpp b/boost/multi_index/sequenced_index.hpp
index ce96bb5f9a..424eebc376 100644
--- a/boost/multi_index/sequenced_index.hpp
+++ b/boost/multi_index/sequenced_index.hpp
@@ -1051,7 +1051,7 @@ struct sequenced
template<typename SuperMeta,typename TagList>
inline boost::mpl::true_* boost_foreach_is_noncopyable(
boost::multi_index::detail::sequenced_index<SuperMeta,TagList>*&,
- boost::foreach::tag)
+ boost_foreach_argument_dependent_lookup_hack)
{
return 0;
}
diff --git a/boost/multiprecision/concepts/mp_number_archetypes.hpp b/boost/multiprecision/concepts/mp_number_archetypes.hpp
index 5d5d841710..9a5f15962b 100644
--- a/boost/multiprecision/concepts/mp_number_archetypes.hpp
+++ b/boost/multiprecision/concepts/mp_number_archetypes.hpp
@@ -89,7 +89,7 @@ struct number_backend_float_architype
if(digits)
ss.precision(digits);
else
- ss.precision(std::numeric_limits<long double>::digits10 + 2);
+ ss.precision(std::numeric_limits<long double>::digits10 + 3);
boost::intmax_t i = m_value;
boost::uintmax_t u = m_value;
if(!(f & std::ios_base::scientific) && m_value == i)
diff --git a/boost/multiprecision/cpp_bin_float.hpp b/boost/multiprecision/cpp_bin_float.hpp
index 4c00799843..bdf6a6308b 100644
--- a/boost/multiprecision/cpp_bin_float.hpp
+++ b/boost/multiprecision/cpp_bin_float.hpp
@@ -43,7 +43,7 @@ public:
typedef typename rep_type::signed_types signed_types;
typedef typename rep_type::unsigned_types unsigned_types;
- typedef boost::mpl::list<double, long double> float_types;
+ typedef boost::mpl::list<float, double, long double> float_types;
typedef Exponent exponent_type;
static const exponent_type max_exponent_limit = boost::integer_traits<exponent_type>::const_max - 2 * static_cast<exponent_type>(bit_count);
@@ -104,6 +104,18 @@ public:
this->assign_float(f);
}
+ template <class Float>
+ explicit cpp_bin_float(const Float& f,
+ typename boost::enable_if_c<
+ (number_category<Float>::value == number_kind_floating_point)
+ && (std::numeric_limits<Float>::digits > (int)bit_count)
+ && (std::numeric_limits<Float>::radix == 2)
+ >::type const* = 0)
+ : m_data(), m_exponent(0), m_sign(false)
+ {
+ this->assign_float(f);
+ }
+
cpp_bin_float& operator=(const cpp_bin_float &o) BOOST_MP_NOEXCEPT_IF(noexcept(std::declval<rep_type&>() = std::declval<const rep_type&>()))
{
m_data = o.m_data;
@@ -125,7 +137,7 @@ public:
template <class Float>
typename boost::enable_if_c<
(number_category<Float>::value == number_kind_floating_point)
- && (std::numeric_limits<Float>::digits <= (int)bit_count)
+ //&& (std::numeric_limits<Float>::digits <= (int)bit_count)
&& (std::numeric_limits<Float>::radix == 2), cpp_bin_float&>::type operator=(const Float& f)
{
return assign_float(f);
@@ -193,7 +205,7 @@ public:
template <class Float>
typename boost::enable_if_c<
(number_category<Float>::value == number_kind_floating_point)
- && !is_floating_point<Float>::value
+ && !boost::is_floating_point<Float>::value
/*&& (std::numeric_limits<number<Float> >::radix == 2)*/,
cpp_bin_float&>::type assign_float(Float f)
{
@@ -1405,6 +1417,8 @@ namespace detail{
template<unsigned D1, backends::digit_base_type B1, class A1, class E1, E1 M1, E1 M2, unsigned D2, backends::digit_base_type B2, class A2, class E2, E2 M3, E2 M4>
struct is_explicitly_convertible<backends::cpp_bin_float<D1, B1, A1, E1, M1, M2>, backends::cpp_bin_float<D2, B2, A2, E2, M3, M4> > : public mpl::true_ {};
+template<class FloatT, unsigned D2, backends::digit_base_type B2, class A2, class E2, E2 M3, E2 M4>
+struct is_explicitly_convertible<FloatT, backends::cpp_bin_float<D2, B2, A2, E2, M3, M4> > : public boost::is_floating_point<FloatT> {};
}
#endif
@@ -1478,7 +1492,7 @@ public:
BOOST_STATIC_CONSTEXPR int digits = boost::multiprecision::cpp_bin_float<Digits, DigitBase, Allocator, Exponent, MinE, MaxE>::bit_count;
BOOST_STATIC_CONSTEXPR int digits10 = (digits - 1) * 301 / 1000;
// Is this really correct???
- BOOST_STATIC_CONSTEXPR int max_digits10 = (digits * 301 / 1000) + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = (digits * 301 / 1000) + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = false;
BOOST_STATIC_CONSTEXPR bool is_exact = false;
diff --git a/boost/multiprecision/cpp_int.hpp b/boost/multiprecision/cpp_int.hpp
index d451567bb9..60ad87676c 100644
--- a/boost/multiprecision/cpp_int.hpp
+++ b/boost/multiprecision/cpp_int.hpp
@@ -16,6 +16,7 @@
#include <boost/type_traits/is_floating_point.hpp>
#include <boost/multiprecision/cpp_int/cpp_int_config.hpp>
#include <boost/multiprecision/rational_adaptor.hpp>
+#include <boost/multiprecision/traits/is_byte_container.hpp>
#include <boost/detail/endian.hpp>
#include <boost/integer/static_min_max.hpp>
#include <boost/type_traits/common_type.hpp>
@@ -38,9 +39,20 @@ namespace backends{
#pragma warning(disable:4127 4351 4293 4996 4307 4702 6285)
#endif
-template <unsigned MinBits = 0, unsigned MaxBits = 0, cpp_integer_type SignType = signed_magnitude, cpp_int_check_type Checked = unchecked, class Allocator = typename mpl::if_c<MinBits && (MinBits == MaxBits), void, std::allocator<limb_type> >::type >
+template <unsigned MinBits = 0, unsigned MaxBits = 0, boost::multiprecision::cpp_integer_type SignType = signed_magnitude, cpp_int_check_type Checked = unchecked, class Allocator = typename mpl::if_c<MinBits && (MinBits == MaxBits), void, std::allocator<limb_type> >::type >
struct cpp_int_backend;
+} // namespace backends
+
+namespace detail {
+
+ template <unsigned MinBits, unsigned MaxBits, boost::multiprecision::cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
+ struct is_byte_container<backends::cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator> > : public boost::false_type {};
+
+} // namespace detail
+
+namespace backends{
+
template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, bool trivial = false>
struct cpp_int_base;
//
@@ -944,7 +956,7 @@ public:
if(b)
negate();
}
- BOOST_MP_FORCEINLINE void resize(unsigned new_size, unsigned min_size)
+ BOOST_MP_FORCEINLINE void resize(unsigned, unsigned min_size)
{
detail::verify_new_size(2, min_size, checked_type());
}
@@ -1270,7 +1282,7 @@ private:
}
public:
template <class Arithmetic>
- BOOST_MP_FORCEINLINE cpp_int_backend& operator = (Arithmetic val) BOOST_MP_NOEXCEPT_IF(noexcept(std::declval<cpp_int_backend>().do_assign_arithmetic(std::declval<Arithmetic>(), trivial_tag())))
+ BOOST_MP_FORCEINLINE typename boost::enable_if_c<!boost::multiprecision::detail::is_byte_container<Arithmetic>::value, cpp_int_backend&>::type operator = (Arithmetic val) BOOST_MP_NOEXCEPT_IF(noexcept(std::declval<cpp_int_backend>().do_assign_arithmetic(std::declval<Arithmetic>(), trivial_tag())))
{
do_assign_arithmetic(val, trivial_tag());
return *this;
@@ -1355,43 +1367,97 @@ private:
n -= 1;
}
}
+ //
+ // Exception guarentee: create the result in stack variable "result"
+ // then do a swap at the end. In the event of a throw, *this will
+ // be left unchanged.
+ //
+ cpp_int_backend result;
if(n)
{
- if(radix == 8 || radix == 16)
+ if(radix == 16)
{
- unsigned shift = radix == 8 ? 3 : 4;
- unsigned block_count = base_type::limb_bits / shift;
- unsigned block_shift = shift * block_count;
- limb_type val, block;
+ while(*s == '0') ++s;
+ std::size_t bitcount = 4 * std::strlen(s);
+ limb_type val;
+ std::size_t limb, shift;
+ if(bitcount > 4)
+ bitcount -= 4;
+ else
+ bitcount = 0;
+ std::size_t newsize = bitcount / (sizeof(limb_type) * CHAR_BIT) + 1;
+ result.resize(static_cast<unsigned>(newsize), static_cast<unsigned>(newsize)); // will throw if this is a checked integer that cannot be resized
+ std::memset(result.limbs(), 0, result.size() * sizeof(limb_type));
while(*s)
{
- block = 0;
- for(unsigned i = 0; (i < block_count); ++i)
+ if(*s >= '0' && *s <= '9')
+ val = *s - '0';
+ else if(*s >= 'a' && *s <= 'f')
+ val = 10 + *s - 'a';
+ else if(*s >= 'A' && *s <= 'F')
+ val = 10 + *s - 'A';
+ else
{
- if(*s >= '0' && *s <= '9')
- val = *s - '0';
- else if(*s >= 'a' && *s <= 'f')
- val = 10 + *s - 'a';
- else if(*s >= 'A' && *s <= 'F')
- val = 10 + *s - 'A';
- else
- val = base_type::max_limb_value;
- if(val >= radix)
- {
- BOOST_THROW_EXCEPTION(std::runtime_error("Unexpected content found while parsing character string."));
- }
- block <<= shift;
- block |= val;
- if(!*++s)
+ BOOST_THROW_EXCEPTION(std::runtime_error("Unexpected content found while parsing character string."));
+ }
+ limb = bitcount / (sizeof(limb_type) * CHAR_BIT);
+ shift = bitcount % (sizeof(limb_type) * CHAR_BIT);
+ val <<= shift;
+ if(result.size() > limb)
+ {
+ result.limbs()[limb] |= val;
+ }
+ ++s;
+ bitcount -= 4;
+ }
+ result.normalize();
+ }
+ else if(radix == 8)
+ {
+ while(*s == '0') ++s;
+ std::size_t bitcount = 3 * std::strlen(s);
+ limb_type val;
+ std::size_t limb, shift;
+ if(bitcount > 3)
+ bitcount -= 3;
+ else
+ bitcount = 0;
+ std::size_t newsize = bitcount / (sizeof(limb_type) * CHAR_BIT) + 1;
+ result.resize(static_cast<unsigned>(newsize), static_cast<unsigned>(newsize)); // will throw if this is a checked integer that cannot be resized
+ std::memset(result.limbs(), 0, result.size() * sizeof(limb_type));
+ while(*s)
+ {
+ if(*s >= '0' && *s <= '7')
+ val = *s - '0';
+ else
+ {
+ BOOST_THROW_EXCEPTION(std::runtime_error("Unexpected content found while parsing character string."));
+ }
+ limb = bitcount / (sizeof(limb_type) * CHAR_BIT);
+ shift = bitcount % (sizeof(limb_type) * CHAR_BIT);
+ if(result.size() > limb)
+ {
+ result.limbs()[limb] |= (val << shift);
+ if(shift > sizeof(limb_type) * CHAR_BIT - 3)
{
- // final shift is different:
- block_shift = (i + 1) * shift;
- break;
+ // Deal with the bits in val that overflow into the next limb:
+ val >>= (sizeof(limb_type) * CHAR_BIT - shift);
+ if(val)
+ {
+ // If this is the most-significant-limb, we may need to allocate an extra one for the overflow:
+ if(limb + 1 == newsize)
+ result.resize(static_cast<unsigned>(newsize + 1), static_cast<unsigned>(newsize + 1));
+ if(result.size() > limb + 1)
+ {
+ result.limbs()[limb + 1] |= val;
+ }
+ }
}
}
- eval_left_shift(*this, block_shift);
- this->limbs()[0] |= block;
+ ++s;
+ bitcount -= 3;
}
+ result.normalize();
}
else
{
@@ -1416,13 +1482,14 @@ private:
break;
}
}
- eval_multiply(*this, block_mult);
- eval_add(*this, block);
+ eval_multiply(result, block_mult);
+ eval_add(result, block);
}
}
}
if(isneg)
- this->negate();
+ result.negate();
+ result.swap(*this);
}
public:
cpp_int_backend& operator = (const char* s)
@@ -1638,6 +1705,67 @@ public:
{
return do_get_string(f, trivial_tag());
}
+private:
+ template <class Container>
+ void construct_from_container(const Container& c, const mpl::false_&)
+ {
+ //
+ // We assume that c is a sequence of (unsigned) bytes with the most significant byte first:
+ //
+ unsigned newsize = static_cast<unsigned>(c.size() / sizeof(limb_type));
+ if(c.size() % sizeof(limb_type))
+ {
+ ++newsize;
+ }
+ if(newsize)
+ {
+ this->resize(newsize, newsize); // May throw
+ std::memset(this->limbs(), 0, this->size());
+ typename Container::const_iterator i(c.begin()), j(c.end());
+ unsigned byte_location = static_cast<unsigned>(c.size() - 1);
+ while(i != j)
+ {
+ unsigned limb = byte_location / sizeof(limb_type);
+ unsigned shift = (byte_location % sizeof(limb_type)) * CHAR_BIT;
+ if(this->size() > limb)
+ this->limbs()[limb] |= static_cast<limb_type>(static_cast<unsigned char>(*i)) << shift;
+ ++i;
+ --byte_location;
+ }
+ }
+ }
+ template <class Container>
+ void construct_from_container(const Container& c, const mpl::true_&)
+ {
+ //
+ // We assume that c is a sequence of (unsigned) bytes with the most significant byte first:
+ //
+ typedef typename base_type::local_limb_type local_limb_type;
+ *this->limbs() = 0;
+ if(c.size())
+ {
+ typename Container::const_iterator i(c.begin()), j(c.end());
+ unsigned byte_location = static_cast<unsigned>(c.size() - 1);
+ while(i != j)
+ {
+ unsigned limb = byte_location / sizeof(local_limb_type);
+ unsigned shift = (byte_location % sizeof(local_limb_type)) * CHAR_BIT;
+ if(limb == 0)
+ this->limbs()[0] |= static_cast<limb_type>(static_cast<unsigned char>(*i)) << shift;
+ ++i;
+ --byte_location;
+ }
+ }
+ }
+public:
+ template <class Container>
+ cpp_int_backend(const Container& c, typename boost::enable_if_c<boost::multiprecision::detail::is_byte_container<Container>::value>::type const* = 0)
+ {
+ //
+ // We assume that c is a sequence of (unsigned) bytes with the most significant byte first:
+ //
+ construct_from_container(c, trivial_tag());
+ }
template <unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
int compare_imp(const cpp_int_backend<MinBits2, MaxBits2, SignType2, Checked2, Allocator2>& o, const mpl::false_&, const mpl::false_&)const BOOST_NOEXCEPT
{
@@ -1811,5 +1939,6 @@ struct is_explicitly_convertible<cpp_int_backend<MinBits, MaxBits, SignType, Che
#include <boost/multiprecision/cpp_int/literals.hpp>
#endif
#include <boost/multiprecision/cpp_int/serialize.hpp>
+#include <boost/multiprecision/cpp_int/import_export.hpp>
#endif
diff --git a/boost/multiprecision/cpp_int/bitwise.hpp b/boost/multiprecision/cpp_int/bitwise.hpp
index a39e2590cb..dd6ba9d191 100644
--- a/boost/multiprecision/cpp_int/bitwise.hpp
+++ b/boost/multiprecision/cpp_int/bitwise.hpp
@@ -8,6 +8,11 @@
#ifndef BOOST_MP_CPP_INT_BIT_HPP
#define BOOST_MP_CPP_INT_BIT_HPP
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4319)
+#endif
+
namespace boost{ namespace multiprecision{ namespace backends{
template <unsigned MinBits1, unsigned MaxBits1, cpp_integer_type SignType1, cpp_int_check_type Checked1, class Allocator1, unsigned MinBits2, unsigned MaxBits2, cpp_integer_type SignType2, cpp_int_check_type Checked2, class Allocator2>
@@ -653,4 +658,8 @@ inline typename enable_if_c<
}}} // namespaces
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
#endif
diff --git a/boost/multiprecision/cpp_int/divide.hpp b/boost/multiprecision/cpp_int/divide.hpp
index c94bc71498..5fe6ce6ad8 100644
--- a/boost/multiprecision/cpp_int/divide.hpp
+++ b/boost/multiprecision/cpp_int/divide.hpp
@@ -242,7 +242,21 @@ void divide_unsigned_helper(
// Update r in a way that won't actually produce a negative result
// in case the argument types are unsigned:
//
- if(r.compare(t) > 0)
+ if(truncated_t && carry)
+ {
+ // We need to calculate 2^n + t - r
+ // where n is the number of bits in this type.
+ // Simplest way is to get 2^n - r by complementing
+ // r, then add t to it. Note that we can't call eval_complement
+ // in case this is a signed checked type:
+ for(unsigned i = 0; i <= r_order; ++i)
+ r.limbs()[i] = ~prem[i];
+ r.normalize();
+ eval_increment(r);
+ eval_add(r, t);
+ r_neg = !r_neg;
+ }
+ else if(r.compare(t) > 0)
{
eval_subtract(r, t);
}
diff --git a/boost/multiprecision/cpp_int/import_export.hpp b/boost/multiprecision/cpp_int/import_export.hpp
new file mode 100644
index 0000000000..f2f15f6421
--- /dev/null
+++ b/boost/multiprecision/cpp_int/import_export.hpp
@@ -0,0 +1,200 @@
+///////////////////////////////////////////////////////////////
+// Copyright 2015 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+
+#ifndef BOOST_MP_CPP_INT_IMPORT_EXPORT_HPP
+#define BOOST_MP_CPP_INT_IMPORT_EXPORT_HPP
+
+
+namespace boost {
+ namespace multiprecision {
+
+ namespace detail {
+
+ template <class Backend, class Unsigned>
+ void assign_bits(Backend& val, Unsigned bits, unsigned bit_location, unsigned chunk_bits, const mpl::false_& tag)
+ {
+ unsigned limb = bit_location / (sizeof(limb_type) * CHAR_BIT);
+ unsigned shift = bit_location % (sizeof(limb_type) * CHAR_BIT);
+
+ limb_type mask = chunk_bits >= sizeof(limb_type) * CHAR_BIT ? ~static_cast<limb_type>(0u) : (static_cast<limb_type>(1u) << chunk_bits) - 1;
+
+ limb_type value = (static_cast<limb_type>(bits) & mask) << shift;
+ if(value)
+ {
+ if(val.size() == limb)
+ {
+ val.resize(limb + 1, limb + 1);
+ if(val.size() > limb)
+ val.limbs()[limb] = value;
+ }
+ else if(val.size() > limb)
+ val.limbs()[limb] |= value;
+ }
+ if(chunk_bits > sizeof(limb_type) * CHAR_BIT - shift)
+ {
+ shift = sizeof(limb_type) * CHAR_BIT - shift;
+ chunk_bits -= shift;
+ bit_location += shift;
+ bits >>= shift;
+ if(bits)
+ assign_bits(val, bits, bit_location, chunk_bits, tag);
+ }
+ }
+ template <class Backend, class Unsigned>
+ void assign_bits(Backend& val, Unsigned bits, unsigned bit_location, unsigned chunk_bits, const mpl::true_&)
+ {
+ typedef typename Backend::local_limb_type local_limb_type;
+ //
+ // Check for possible overflow, this may trigger an exception, or have no effect
+ // depending on whether this is a checked integer or not:
+ //
+ if((bit_location >= sizeof(local_limb_type) * CHAR_BIT) && bits)
+ val.resize(2, 2);
+ else
+ {
+ local_limb_type mask = chunk_bits >= sizeof(local_limb_type) * CHAR_BIT ? ~static_cast<local_limb_type>(0u) : (static_cast<local_limb_type>(1u) << chunk_bits) - 1;
+ local_limb_type value = (static_cast<local_limb_type>(bits) & mask) << bit_location;
+ *val.limbs() |= value;
+ //
+ // Check for overflow bits:
+ //
+ bit_location = sizeof(local_limb_type) * CHAR_BIT - bit_location;
+ bits >>= bit_location;
+ if(bits)
+ val.resize(2, 2); // May throw!
+ }
+ }
+
+ template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
+ inline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, unsigned bits, const mpl::false_&)
+ {
+ unsigned limb_count = static_cast<unsigned>(bits / (sizeof(limb_type) * CHAR_BIT));
+ if(bits % (sizeof(limb_type) * CHAR_BIT))
+ ++limb_count;
+ static const unsigned max_limbs = MaxBits ? MaxBits / (CHAR_BIT * sizeof(limb_type)) + ((MaxBits % (CHAR_BIT * sizeof(limb_type))) ? 1 : 0) : (std::numeric_limits<unsigned>::max)();
+ if(limb_count > max_limbs)
+ limb_count = max_limbs;
+ newval.resize(limb_count, limb_count);
+ std::memset(newval.limbs(), 0, newval.size() * sizeof(limb_type));
+ }
+ template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator>
+ inline void resize_to_bit_size(cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>& newval, unsigned, const mpl::true_&)
+ {
+ *newval.limbs() = 0;
+ }
+
+ }
+
+
+ template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class Iterator>
+ number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>&
+ import_bits(
+ number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, Iterator i, Iterator j, unsigned chunk_size = 0, bool msv_first = true)
+ {
+ typename number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>::backend_type newval;
+
+ typedef typename std::iterator_traits<Iterator>::value_type value_type;
+ typedef typename boost::make_unsigned<value_type>::type unsigned_value_type;
+ typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
+ typedef typename boost::make_unsigned<difference_type>::type size_type;
+ typedef typename cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>::trivial_tag tag_type;
+
+ if(!chunk_size)
+ chunk_size = std::numeric_limits<value_type>::digits;
+
+ size_type limbs = std::distance(i, j);
+ size_type bits = limbs * chunk_size;
+
+ detail::resize_to_bit_size(newval, static_cast<unsigned>(bits), tag_type());
+
+ difference_type bit_location = msv_first ? bits - chunk_size : 0;
+ difference_type bit_location_change = msv_first ? -static_cast<difference_type>(chunk_size) : chunk_size;
+
+ while(i != j)
+ {
+ detail::assign_bits(newval, static_cast<unsigned_value_type>(*i), static_cast<unsigned>(bit_location), chunk_size, tag_type());
+ ++i;
+ bit_location += bit_location_change;
+ }
+
+ newval.normalize();
+
+ val.backend().swap(newval);
+ return val;
+ }
+
+
+ namespace detail {
+
+ template <class Backend>
+ boost::uintmax_t extract_bits(const Backend& val, unsigned location, unsigned count, const mpl::false_& tag)
+ {
+ unsigned limb = location / (sizeof(limb_type) * CHAR_BIT);
+ unsigned shift = location % (sizeof(limb_type) * CHAR_BIT);
+ boost::uintmax_t result = 0;
+ boost::uintmax_t mask = count == std::numeric_limits<boost::uintmax_t>::digits ? ~static_cast<boost::uintmax_t>(0) : (static_cast<boost::uintmax_t>(1u) << count) - 1;
+ if(count > (sizeof(limb_type) * CHAR_BIT - shift))
+ {
+ result = extract_bits(val, location + sizeof(limb_type) * CHAR_BIT - shift, count - sizeof(limb_type) * CHAR_BIT + shift, tag);
+ result <<= sizeof(limb_type) * CHAR_BIT - shift;
+ }
+ if(limb < val.size())
+ result |= (val.limbs()[limb] >> shift) & mask;
+ return result;
+ }
+
+ template <class Backend>
+ inline boost::uintmax_t extract_bits(const Backend& val, unsigned location, unsigned count, const mpl::true_&)
+ {
+ boost::uintmax_t result = *val.limbs();
+ boost::uintmax_t mask = count == std::numeric_limits<boost::uintmax_t>::digits ? ~static_cast<boost::uintmax_t>(0) : (static_cast<boost::uintmax_t>(1u) << count) - 1;
+ return (result >> location) & mask;
+ }
+ }
+
+ template <unsigned MinBits, unsigned MaxBits, cpp_integer_type SignType, cpp_int_check_type Checked, class Allocator, expression_template_option ExpressionTemplates, class OutputIterator>
+ OutputIterator export_bits(
+ const number<cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>, ExpressionTemplates>& val, OutputIterator out, unsigned chunk_size, bool msv_first = true)
+ {
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable:4244)
+#endif
+ typedef typename cpp_int_backend<MinBits, MaxBits, SignType, Checked, Allocator>::trivial_tag tag_type;
+ if(!val)
+ {
+ *out = 0;
+ ++out;
+ return out;
+ }
+ unsigned bitcount = msb(val) + 1;
+ unsigned chunks = bitcount / chunk_size;
+ if(bitcount % chunk_size)
+ ++chunks;
+
+ int bit_location = msv_first ? bitcount - chunk_size : 0;
+ int bit_step = msv_first ? -static_cast<int>(chunk_size) : chunk_size;
+ while(bit_location % bit_step) ++bit_location;
+
+ do
+ {
+ *out = detail::extract_bits(val.backend(), bit_location, chunk_size, tag_type());
+ ++out;
+ bit_location += bit_step;
+ } while((bit_location >= 0) && (bit_location < (int)bitcount));
+
+ return out;
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+ }
+
+ }
+}
+
+
+
+#endif // BOOST_MP_CPP_INT_IMPORT_EXPORT_HPP
+
diff --git a/boost/multiprecision/cpp_int/limits.hpp b/boost/multiprecision/cpp_int/limits.hpp
index 6088cb1105..36a38d5a3b 100644
--- a/boost/multiprecision/cpp_int/limits.hpp
+++ b/boost/multiprecision/cpp_int/limits.hpp
@@ -131,7 +131,7 @@ public:
static number_type lowest() { return (min)(); }
BOOST_STATIC_CONSTEXPR int digits = boost::multiprecision::backends::max_precision<backend_type>::value == UINT_MAX ? INT_MAX : boost::multiprecision::backends::max_precision<backend_type>::value;
BOOST_STATIC_CONSTEXPR int digits10 = (digits > INT_MAX / 301) ? (digits / 1000) * 301L : (digits * 301) / 1000;
- BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = boost::multiprecision::is_signed_number<backend_type>::value;
BOOST_STATIC_CONSTEXPR bool is_integer = true;
BOOST_STATIC_CONSTEXPR bool is_exact = true;
diff --git a/boost/multiprecision/detail/default_ops.hpp b/boost/multiprecision/detail/default_ops.hpp
index 01fbe181df..f76addb350 100644
--- a/boost/multiprecision/detail/default_ops.hpp
+++ b/boost/multiprecision/detail/default_ops.hpp
@@ -801,7 +801,7 @@ struct terminal
{
terminal(const R& v) : value(v){}
terminal(){}
- terminal& operator = (R val) { value = val; }
+ terminal& operator = (R val) { value = val; return *this; }
R value;
operator R()const { return value; }
};
@@ -930,7 +930,7 @@ inline void eval_fmod(T& result, const T& a, const T& b)
}
T n;
eval_divide(result, a, b);
- if(eval_get_sign(a) < 0)
+ if(eval_get_sign(result) < 0)
eval_ceil(n, result);
else
eval_floor(n, result);
diff --git a/boost/multiprecision/detail/functions/trig.hpp b/boost/multiprecision/detail/functions/trig.hpp
index 5d4e2639c2..be2a9deb77 100644
--- a/boost/multiprecision/detail/functions/trig.hpp
+++ b/boost/multiprecision/detail/functions/trig.hpp
@@ -486,14 +486,18 @@ void eval_asin(T& result, const T& x)
result.negate();
return;
}
-
+#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
+ typedef typename boost::multiprecision::detail::canonical<long double, T>::type guess_type;
+#else
+ typedef fp_type guess_type;
+#endif
// Get initial estimate using standard math function asin.
- double dd;
+ guess_type dd;
eval_convert_to(&dd, xx);
- result = fp_type(std::asin(dd));
+ result = (guess_type)(std::asin(dd));
- unsigned current_digits = std::numeric_limits<double>::digits - 5;
+ unsigned current_digits = std::numeric_limits<guess_type>::digits - 5;
unsigned target_precision = boost::multiprecision::detail::digits2<number<T, et_on> >::value;
// Newton-Raphson iteration
diff --git a/boost/multiprecision/detail/number_base.hpp b/boost/multiprecision/detail/number_base.hpp
index d725779091..6e18763b5c 100644
--- a/boost/multiprecision/detail/number_base.hpp
+++ b/boost/multiprecision/detail/number_base.hpp
@@ -135,6 +135,10 @@ struct bits_of
: sizeof(T) * CHAR_BIT - (is_signed<T>::value ? 1 : 0);
};
+#if defined(_GLIBCXX_USE_FLOAT128) && defined(BOOST_GCC) && !defined(__STRICT_ANSI__)
+template<> struct bits_of<__float128> { static const unsigned value = 113; };
+#endif
+
template <int b>
struct has_enough_bits
{
@@ -177,7 +181,8 @@ struct canonical_imp<Val, Backend, mpl::int_<0> >
typename Backend::signed_types,
pred_type
>::type iter_type;
- typedef typename mpl::deref<iter_type>::type type;
+ typedef typename mpl::end<typename Backend::signed_types>::type end_type;
+ typedef typename mpl::eval_if<boost::is_same<iter_type, end_type>, mpl::identity<Val>, mpl::deref<iter_type> >::type type;
};
template <class Val, class Backend>
struct canonical_imp<Val, Backend, mpl::int_<1> >
@@ -187,7 +192,8 @@ struct canonical_imp<Val, Backend, mpl::int_<1> >
typename Backend::unsigned_types,
pred_type
>::type iter_type;
- typedef typename mpl::deref<iter_type>::type type;
+ typedef typename mpl::end<typename Backend::unsigned_types>::type end_type;
+ typedef typename mpl::eval_if<boost::is_same<iter_type, end_type>, mpl::identity<Val>, mpl::deref<iter_type> >::type type;
};
template <class Val, class Backend>
struct canonical_imp<Val, Backend, mpl::int_<2> >
@@ -197,7 +203,8 @@ struct canonical_imp<Val, Backend, mpl::int_<2> >
typename Backend::float_types,
pred_type
>::type iter_type;
- typedef typename mpl::deref<iter_type>::type type;
+ typedef typename mpl::end<typename Backend::float_types>::type end_type;
+ typedef typename mpl::eval_if<boost::is_same<iter_type, end_type>, mpl::identity<Val>, mpl::deref<iter_type> >::type type;
};
template <class Val, class Backend>
struct canonical_imp<Val, Backend, mpl::int_<3> >
@@ -372,11 +379,36 @@ struct expression<tag, Arg1, void, void, void>
static const unsigned depth = left_type::depth + 1;
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- explicit operator bool()const
+# if (defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)) || (defined(BOOST_INTEL) && (BOOST_INTEL <= 1500))
+ //
+ // Horrible workaround for gcc-4.6.x which always prefers the template
+ // operator bool() rather than the non-template operator when converting to
+ // an arithmetic type:
+ //
+ template <class T, typename boost::enable_if<is_same<T, bool>, int>::type = 0>
+ explicit operator T ()const
+ {
+ result_type r(*this);
+ return static_cast<bool>(r);
+ }
+ template <class T, typename boost::disable_if_c<is_same<T, bool>::value || is_void<T>::value || is_number<T>::value, int>::type = 0>
+ explicit operator T ()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+# else
+ template <class T, typename boost::disable_if_c<is_number<T>::value, int>::type = 0>
+ explicit operator T()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+ BOOST_MP_FORCEINLINE explicit operator bool()const
{
result_type r(*this);
return static_cast<bool>(r);
}
+ explicit operator void()const {}
+# endif
#else
operator unmentionable_type()const
{
@@ -385,6 +417,13 @@ struct expression<tag, Arg1, void, void, void>
}
#endif
+ template <class T>
+ T convert_to()
+ {
+ result_type r(*this);
+ return r.template convert_to<T>();
+ }
+
private:
typename expression_storage<Arg1>::type arg;
expression& operator=(const expression&);
@@ -404,10 +443,36 @@ struct expression<terminal, Arg1, void, void, void>
static const unsigned depth = 0;
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- explicit operator bool()const
+# if (defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)) || (defined(BOOST_INTEL) && (BOOST_INTEL <= 1500))
+ //
+ // Horrible workaround for gcc-4.6.x which always prefers the template
+ // operator bool() rather than the non-template operator when converting to
+ // an arithmetic type:
+ //
+ template <class T, typename boost::enable_if<is_same<T, bool>, int>::type = 0>
+ explicit operator T ()const
+ {
+ result_type r(*this);
+ return static_cast<bool>(r);
+}
+ template <class T, typename boost::disable_if_c<is_same<T, bool>::value || is_void<T>::value || is_number<T>::value, int>::type = 0>
+ explicit operator T ()const
{
- return static_cast<bool>(arg);
+ return static_cast<T>(static_cast<result_type>(*this));
}
+# else
+ template <class T, typename boost::disable_if_c<is_number<T>::value, int>::type = 0>
+ explicit operator T()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+ BOOST_MP_FORCEINLINE explicit operator bool()const
+ {
+ result_type r(*this);
+ return static_cast<bool>(r);
+ }
+ explicit operator void()const {}
+# endif
#else
operator unmentionable_type()const
{
@@ -415,6 +480,13 @@ struct expression<terminal, Arg1, void, void, void>
}
#endif
+ template <class T>
+ T convert_to()
+ {
+ result_type r(*this);
+ return r.template convert_to<T>();
+ }
+
private:
typename expression_storage<Arg1>::type arg;
expression& operator=(const expression&);
@@ -439,11 +511,36 @@ struct expression<tag, Arg1, Arg2, void, void>
const Arg2& right_ref()const BOOST_NOEXCEPT { return arg2; }
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- explicit operator bool()const
+# if (defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)) || (defined(BOOST_INTEL) && (BOOST_INTEL <= 1500))
+ //
+ // Horrible workaround for gcc-4.6.x which always prefers the template
+ // operator bool() rather than the non-template operator when converting to
+ // an arithmetic type:
+ //
+ template <class T, typename boost::enable_if<is_same<T, bool>, int>::type = 0>
+ explicit operator T ()const
{
result_type r(*this);
return static_cast<bool>(r);
+}
+ template <class T, typename boost::disable_if_c<is_same<T, bool>::value || is_void<T>::value || is_number<T>::value, int>::type = 0>
+ explicit operator T ()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
}
+# else
+ template <class T, typename boost::disable_if_c<is_number<T>::value, int>::type = 0>
+ explicit operator T()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+ BOOST_MP_FORCEINLINE explicit operator bool()const
+ {
+ result_type r(*this);
+ return static_cast<bool>(r);
+ }
+ explicit operator void()const {}
+# endif
#else
operator unmentionable_type()const
{
@@ -451,6 +548,13 @@ struct expression<tag, Arg1, Arg2, void, void>
return r ? &unmentionable::proc : 0;
}
#endif
+ template <class T>
+ T convert_to()
+ {
+ result_type r(*this);
+ return r.template convert_to<T>();
+ }
+
static const unsigned left_depth = left_type::depth + 1;
static const unsigned right_depth = right_type::depth + 1;
static const unsigned depth = left_depth > right_depth ? left_depth : right_depth;
@@ -486,11 +590,36 @@ struct expression<tag, Arg1, Arg2, Arg3, void>
const Arg3& right_ref()const BOOST_NOEXCEPT { return arg3; }
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- explicit operator bool()const
+# if (defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)) || (defined(BOOST_INTEL) && (BOOST_INTEL <= 1500))
+ //
+ // Horrible workaround for gcc-4.6.x which always prefers the template
+ // operator bool() rather than the non-template operator when converting to
+ // an arithmetic type:
+ //
+ template <class T, typename boost::enable_if<is_same<T, bool>, int>::type = 0>
+ explicit operator T ()const
{
result_type r(*this);
return static_cast<bool>(r);
+}
+ template <class T, typename boost::disable_if_c<is_same<T, bool>::value || is_void<T>::value || is_number<T>::value, int>::type = 0>
+ explicit operator T ()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+# else
+ template <class T, typename boost::disable_if_c<is_number<T>::value, int>::type = 0>
+ explicit operator T()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
}
+ BOOST_MP_FORCEINLINE explicit operator bool()const
+ {
+ result_type r(*this);
+ return static_cast<bool>(r);
+ }
+ explicit operator void()const {}
+# endif
#else
operator unmentionable_type()const
{
@@ -498,6 +627,13 @@ struct expression<tag, Arg1, Arg2, Arg3, void>
return r ? &unmentionable::proc : 0;
}
#endif
+ template <class T>
+ T convert_to()
+ {
+ result_type r(*this);
+ return r.template convert_to<T>();
+ }
+
static const unsigned left_depth = left_type::depth + 1;
static const unsigned middle_depth = middle_type::depth + 1;
static const unsigned right_depth = right_type::depth + 1;
@@ -542,11 +678,36 @@ struct expression
const Arg4& right_ref()const BOOST_NOEXCEPT { return arg4; }
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
- explicit operator bool()const
+# if (defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 7)) || (defined(BOOST_INTEL) && (BOOST_INTEL <= 1500))
+ //
+ // Horrible workaround for gcc-4.6.x which always prefers the template
+ // operator bool() rather than the non-template operator when converting to
+ // an arithmetic type:
+ //
+ template <class T, typename boost::enable_if<is_same<T, bool>, int>::type = 0>
+ explicit operator T ()const
+ {
+ result_type r(*this);
+ return static_cast<bool>(r);
+}
+ template <class T, typename boost::disable_if_c<is_same<T, bool>::value || is_void<T>::value || is_number<T>::value, int>::type = 0>
+ explicit operator T ()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+# else
+ template <class T, typename boost::disable_if_c<is_number<T>::value, int>::type = 0>
+ explicit operator T()const
+ {
+ return static_cast<T>(static_cast<result_type>(*this));
+ }
+ BOOST_MP_FORCEINLINE explicit operator bool()const
{
result_type r(*this);
return static_cast<bool>(r);
}
+ explicit operator void()const {}
+# endif
#else
operator unmentionable_type()const
{
@@ -554,6 +715,13 @@ struct expression
return r ? &unmentionable::proc : 0;
}
#endif
+ template <class T>
+ T convert_to()
+ {
+ result_type r(*this);
+ return r.template convert_to<T>();
+ }
+
static const unsigned left_depth = left_type::depth + 1;
static const unsigned left_middle_depth = left_middle_type::depth + 1;
static const unsigned right_middle_depth = right_middle_type::depth + 1;
diff --git a/boost/multiprecision/float128.hpp b/boost/multiprecision/float128.hpp
index cd70fa009b..4341672393 100644
--- a/boost/multiprecision/float128.hpp
+++ b/boost/multiprecision/float128.hpp
@@ -144,10 +144,10 @@ public:
return *this;
}
template <class T>
- BOOST_CONSTEXPR float128_backend(const T& i, const typename enable_if_c<is_convertible<T, float128_type>::value>::type* = 0) BOOST_NOEXCEPT
+ BOOST_CONSTEXPR float128_backend(const T& i, const typename enable_if_c<is_convertible<T, float128_type>::value>::type* = 0) BOOST_NOEXCEPT_IF(noexcept(std::declval<float128_type&>() = std::declval<const T&>()))
: m_value(i) {}
template <class T>
- typename enable_if_c<is_arithmetic<T>::value || is_convertible<T, float128_type>::value, float128_backend&>::type operator = (const T& i) BOOST_NOEXCEPT
+ typename enable_if_c<is_arithmetic<T>::value || is_convertible<T, float128_type>::value, float128_backend&>::type operator = (const T& i) BOOST_NOEXCEPT_IF(noexcept(std::declval<float128_type&>() = std::declval<const T&>()))
{
m_value = i;
return *this;
diff --git a/boost/multiprecision/gmp.hpp b/boost/multiprecision/gmp.hpp
index 6351f7ea48..f7d4e90961 100644
--- a/boost/multiprecision/gmp.hpp
+++ b/boost/multiprecision/gmp.hpp
@@ -2296,7 +2296,7 @@ public:
BOOST_STATIC_CONSTEXPR int digits = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301L ? 2 : 1));
BOOST_STATIC_CONSTEXPR int digits10 = Digits10;
// Have to allow for a possible extra limb inside the gmp data structure:
- BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 2 + ((GMP_LIMB_BITS * 301L) / 1000L);
+ BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 3 + ((GMP_LIMB_BITS * 301L) / 1000L);
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = false;
BOOST_STATIC_CONSTEXPR bool is_exact = false;
@@ -2522,7 +2522,7 @@ public:
static number_type lowest() { return (min)(); }
BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = true;
BOOST_STATIC_CONSTEXPR bool is_exact = true;
@@ -2621,7 +2621,7 @@ public:
// Digits are unbounded, use zero for now:
BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = false;
BOOST_STATIC_CONSTEXPR bool is_exact = true;
diff --git a/boost/multiprecision/miller_rabin.hpp b/boost/multiprecision/miller_rabin.hpp
index d62f103fb7..96dac04df5 100644
--- a/boost/multiprecision/miller_rabin.hpp
+++ b/boost/multiprecision/miller_rabin.hpp
@@ -144,6 +144,8 @@ typename enable_if_c<number_category<I>::value == number_kind_integer, bool>::ty
#endif
typedef I number_type;
+ if (n == 2)
+ return true; // Trivial special case.
if(bit_test(n, 0) == 0)
return false; // n is even
if(n <= 227)
diff --git a/boost/multiprecision/mpfi.hpp b/boost/multiprecision/mpfi.hpp
index 8d13981ceb..66a23cab70 100644
--- a/boost/multiprecision/mpfi.hpp
+++ b/boost/multiprecision/mpfi.hpp
@@ -125,7 +125,7 @@ struct mpfi_float_imp
{
if(m_data[0].left._mpfr_d == 0)
mpfi_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
- boost::ulong_long_type mask = (((1uLL << (std::numeric_limits<unsigned long>::digits - 1) - 1) << 1) | 1u);
+ boost::ulong_long_type mask = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1u);
unsigned shift = 0;
mpfi_t t;
mpfi_init2(t, (std::max)(static_cast<unsigned long>(std::numeric_limits<boost::ulong_long_type>::digits), static_cast<unsigned long>(multiprecision::detail::digits10_2_2(digits10))));
@@ -1145,11 +1145,17 @@ namespace tools{
template <>
inline int digits<boost::multiprecision::mpfi_float>()
+#ifdef BOOST_MATH_NOEXCEPT
+ BOOST_NOEXCEPT
+#endif
{
return boost::multiprecision::backends::detail::get_default_precision();
}
template <>
inline int digits<boost::multiprecision::number<boost::multiprecision::mpfi_float_backend<0>, boost::multiprecision::et_off> >()
+#ifdef BOOST_MATH_NOEXCEPT
+ BOOST_NOEXCEPT
+#endif
{
return boost::multiprecision::backends::detail::get_default_precision();
}
@@ -1309,7 +1315,7 @@ public:
BOOST_STATIC_CONSTEXPR int digits = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301 ? 2 : 1));
BOOST_STATIC_CONSTEXPR int digits10 = Digits10;
// Is this really correct???
- BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = false;
BOOST_STATIC_CONSTEXPR bool is_exact = false;
diff --git a/boost/multiprecision/mpfr.hpp b/boost/multiprecision/mpfr.hpp
index dcf0044cdd..fde558be79 100644
--- a/boost/multiprecision/mpfr.hpp
+++ b/boost/multiprecision/mpfr.hpp
@@ -131,7 +131,7 @@ struct mpfr_float_imp<digits10, allocate_dynamic>
{
if(m_data[0]._mpfr_d == 0)
mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
- boost::ulong_long_type mask = (((1uLL << (std::numeric_limits<unsigned long>::digits - 1) - 1) << 1) | 1uLL);
+ boost::ulong_long_type mask = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uLL);
unsigned shift = 0;
mpfr_t t;
mpfr_init2(t, (std::max)(static_cast<unsigned long>(std::numeric_limits<boost::ulong_long_type>::digits), static_cast<unsigned long>(multiprecision::detail::digits10_2_2(digits10))));
@@ -419,7 +419,7 @@ struct mpfr_float_imp<digits10, allocate_stack>
#else
mpfr_float_imp& operator = (boost::ulong_long_type i)
{
- boost::ulong_long_type mask = (((1uLL << (std::numeric_limits<unsigned long>::digits - 1) - 1) << 1) | 1uL);
+ boost::ulong_long_type mask = ((((1uLL << (std::numeric_limits<unsigned long>::digits - 1)) - 1) << 1) | 1uL);
unsigned shift = 0;
mpfr_t t;
mp_limb_t t_limbs[limb_count];
@@ -1455,15 +1455,61 @@ namespace tools{
template <>
inline int digits<boost::multiprecision::mpfr_float>()
+#ifdef BOOST_MATH_NOEXCEPT
+ BOOST_NOEXCEPT
+#endif
{
return boost::multiprecision::backends::detail::get_default_precision();
}
template <>
inline int digits<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >()
+#ifdef BOOST_MATH_NOEXCEPT
+ BOOST_NOEXCEPT
+#endif
{
return boost::multiprecision::backends::detail::get_default_precision();
}
+template <>
+inline boost::multiprecision::mpfr_float
+ max_value<boost::multiprecision::mpfr_float>()
+{
+ boost::multiprecision::mpfr_float result(0.5);
+ mpfr_mul_2exp(result.backend().data(), result.backend().data(), mpfr_get_emax(), GMP_RNDN);
+ BOOST_ASSERT(mpfr_number_p(result.backend().data()));
+ return result;
+}
+
+template <>
+inline boost::multiprecision::mpfr_float
+ min_value<boost::multiprecision::mpfr_float>()
+{
+ boost::multiprecision::mpfr_float result(0.5);
+ mpfr_div_2exp(result.backend().data(), result.backend().data(), -mpfr_get_emin(), GMP_RNDN);
+ BOOST_ASSERT(mpfr_number_p(result.backend().data()));
+ return result;
+}
+
+template <>
+inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off>
+ max_value<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >()
+{
+ boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> result(0.5);
+ mpfr_mul_2exp(result.backend().data(), result.backend().data(), mpfr_get_emax(), GMP_RNDN);
+ BOOST_ASSERT(mpfr_number_p(result.backend().data()));
+ return result;
+}
+
+template <>
+inline boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off>
+ min_value<boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> >()
+{
+ boost::multiprecision::number<boost::multiprecision::mpfr_float_backend<0>, boost::multiprecision::et_off> result(0.5);
+ mpfr_div_2exp(result.backend().data(), result.backend().data(), -mpfr_get_emin(), GMP_RNDN);
+ BOOST_ASSERT(mpfr_number_p(result.backend().data()));
+ return result;
+}
+
} // namespace tools
namespace constants{ namespace detail{
@@ -1618,7 +1664,7 @@ public:
BOOST_STATIC_CONSTEXPR int digits = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301 ? 2 : 1));
BOOST_STATIC_CONSTEXPR int digits10 = Digits10;
// Is this really correct???
- BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = false;
BOOST_STATIC_CONSTEXPR bool is_exact = false;
diff --git a/boost/multiprecision/number.hpp b/boost/multiprecision/number.hpp
index 92242847de..9d8b64b20e 100644
--- a/boost/multiprecision/number.hpp
+++ b/boost/multiprecision/number.hpp
@@ -24,6 +24,7 @@
#include <boost/multiprecision/traits/is_restricted_conversion.hpp>
#include <istream> // stream operators
#include <cstdio> // EOF
+#include <cctype> // isspace
namespace boost{ namespace multiprecision{
@@ -1706,6 +1707,48 @@ inline std::ostream& operator << (std::ostream& os, const expression<tag, A1, A2
value_type temp(r);
return os << temp;
}
+//
+// What follows is the input streaming code: this is not "proper" iostream code at all
+// but that's fiendishly hard to write when dealing with multiple backends all
+// with different requirements... yes we could deligate this to the backend author...
+// but we really want backends to be EASY to write!
+// For now just pull in all the characters that could possibly form the number
+// and let the backend's string parser make use of it. This fixes most use cases
+// including CSV type formats such as those used by the Random lib.
+//
+inline std::string read_string_while(std::istream& is, std::string const& permitted_chars)
+{
+ std::ios_base::iostate state = std::ios_base::goodbit;
+ const std::istream::sentry sentry_check(is);
+ std::string result;
+
+ if(sentry_check)
+ {
+ int c = is.rdbuf()->sgetc();
+
+ for(;; c = is.rdbuf()->snextc())
+ if(std::istream::traits_type::eq_int_type(std::istream::traits_type::eof(), c))
+ { // end of file:
+ state |= std::ios_base::eofbit;
+ break;
+ }
+ else if(permitted_chars.find_first_of(std::istream::traits_type::to_char_type(c)) == std::string::npos)
+ {
+ // Invalid numeric character, stop reading:
+ is.rdbuf()->sputbackc(static_cast<char>(c));
+ break;
+ }
+ else
+ {
+ result.append(1, std::istream::traits_type::to_char_type(c));
+ }
+ }
+
+ if(!result.size())
+ state |= std::ios_base::failbit;
+ is.setstate(state);
+ return result;
+}
} // namespace detail
@@ -1715,12 +1758,27 @@ inline std::istream& operator >> (std::istream& is, number<Backend, ExpressionTe
bool hex_format = (is.flags() & std::ios_base::hex) == std::ios_base::hex;
bool oct_format = (is.flags() & std::ios_base::oct) == std::ios_base::oct;
std::string s;
- is >> s;
- if(hex_format && (number_category<Backend>::value == number_kind_integer) && ((s[0] != '0') || (s[1] != 'x')))
- s.insert(s.find_first_not_of("+-"), "0x");
- if(oct_format && (number_category<Backend>::value == number_kind_integer) && (s[0] != '0'))
- s.insert(s.find_first_not_of("+-"), "0");
- r.assign(s);
+ switch(boost::multiprecision::number_category<number<Backend, ExpressionTemplates> >::value)
+ {
+ case boost::multiprecision::number_kind_integer:
+ s = detail::read_string_while(is, "+-0xX123456789");
+ break;
+ case boost::multiprecision::number_kind_floating_point:
+ s = detail::read_string_while(is, "+-eE.0123456789infINFnanNANinfinityINFINITY");
+ break;
+ default:
+ is >> s;
+ }
+ if(s.size())
+ {
+ if(hex_format && (number_category<Backend>::value == number_kind_integer) && ((s[0] != '0') || (s[1] != 'x')))
+ s.insert(s.find_first_not_of("+-"), "0x");
+ if(oct_format && (number_category<Backend>::value == number_kind_integer) && (s[0] != '0'))
+ s.insert(s.find_first_not_of("+-"), "0");
+ r.assign(s);
+ }
+ else if(!is.fail())
+ is.setstate(std::istream::failbit);
return is;
}
diff --git a/boost/multiprecision/random.hpp b/boost/multiprecision/random.hpp
index def97f0582..c6b7d34e03 100644
--- a/boost/multiprecision/random.hpp
+++ b/boost/multiprecision/random.hpp
@@ -8,590 +8,11 @@
#ifndef BOOST_MP_RANDOM_HPP
#define BOOST_MP_RANDOM_HPP
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4127)
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (boost/multiprecision/random.hpp) is deprecated: please use the random number library headers directly.")
#endif
-#include <boost/multiprecision/number.hpp>
-
-namespace boost{ namespace random{ namespace detail{
-//
-// This is a horrible hack: this declaration has to appear before the definition of
-// uniform_int_distribution, otherwise it won't be used...
-// Need to find a better solution, like make Boost.Random safe to use with
-// UDT's and depricate/remove this header altogether.
-//
-template<class Engine, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-boost::multiprecision::number<Backend, ExpressionTemplates>
- generate_uniform_int(Engine& eng, const boost::multiprecision::number<Backend, ExpressionTemplates>& min_value, const boost::multiprecision::number<Backend, ExpressionTemplates>& max_value);
-
-}}}
#include <boost/random.hpp>
-#include <boost/mpl/eval_if.hpp>
-
-namespace boost{
-namespace random{
-namespace detail{
-
-template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-struct subtract<boost::multiprecision::number<Backend, ExpressionTemplates>, true>
-{
- typedef boost::multiprecision::number<Backend, ExpressionTemplates> result_type;
- result_type operator()(result_type const& x, result_type const& y) { return x - y; }
-};
-
-}
-
-template<class Engine, std::size_t w, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-class independent_bits_engine<Engine, w, boost::multiprecision::number<Backend, ExpressionTemplates> >
-{
-public:
- typedef Engine base_type;
- typedef boost::multiprecision::number<Backend, ExpressionTemplates> result_type;
-
- static result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
- { return 0; }
- // This is the only function we modify compared to the primary template:
- static result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
- {
- // This expression allows for the possibility that w == std::numeric_limits<result_type>::digits:
- return (((result_type(1) << (w - 1)) - 1) << 1) + 1;
- }
-
- independent_bits_engine() { }
-
- BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(independent_bits_engine,
- result_type, seed_arg)
- {
- _base.seed(seed_arg);
- }
-
- BOOST_RANDOM_DETAIL_SEED_SEQ_CONSTRUCTOR(independent_bits_engine,
- SeedSeq, seq)
- { _base.seed(seq); }
-
- independent_bits_engine(const base_type& base_arg) : _base(base_arg) {}
-
- template<class It>
- independent_bits_engine(It& first, It last) : _base(first, last) { }
-
- void seed() { _base.seed(); }
-
- BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(independent_bits_engine,
- result_type, seed_arg)
- { _base.seed(seed_arg); }
-
- BOOST_RANDOM_DETAIL_SEED_SEQ_SEED(independent_bits_engine,
- SeedSeq, seq)
- { _base.seed(seq); }
-
- template<class It> void seed(It& first, It last)
- { _base.seed(first, last); }
-
- result_type operator()()
- {
- // While it may seem wasteful to recalculate this
- // every time, both msvc and gcc can propagate
- // constants, resolving this at compile time.
- base_unsigned range =
- detail::subtract<base_result>()((_base.max)(), (_base.min)());
- std::size_t m =
- (range == (std::numeric_limits<base_unsigned>::max)()) ?
- std::numeric_limits<base_unsigned>::digits :
- detail::integer_log2(range + 1);
- std::size_t n = (w + m - 1) / m;
- std::size_t w0, n0;
- base_unsigned y0, y1;
- base_unsigned y0_mask, y1_mask;
- calc_params(n, range, w0, n0, y0, y1, y0_mask, y1_mask);
- if(base_unsigned(range - y0 + 1) > y0 / n) {
- // increment n and try again.
- ++n;
- calc_params(n, range, w0, n0, y0, y1, y0_mask, y1_mask);
- }
-
- BOOST_ASSERT(n0*w0 + (n - n0)*(w0 + 1) == w);
-
- result_type S = 0;
- for(std::size_t k = 0; k < n0; ++k) {
- base_unsigned u;
- do {
- u = detail::subtract<base_result>()(_base(), (_base.min)());
- } while(u > base_unsigned(y0 - 1));
- S = (S << w0) + (u & y0_mask);
- }
- for(std::size_t k = 0; k < (n - n0); ++k) {
- base_unsigned u;
- do {
- u = detail::subtract<base_result>()(_base(), (_base.min)());
- } while(u > base_unsigned(y1 - 1));
- S = (S << (w0 + 1)) + (u & y1_mask);
- }
- return S;
- }
-
- /** Fills a range with random values */
- template<class Iter>
- void generate(Iter first, Iter last)
- { detail::generate_from_int(*this, first, last); }
-
- /** Advances the state of the generator by @c z. */
- void discard(boost::uintmax_t z)
- {
- for(boost::uintmax_t i = 0; i < z; ++i) {
- (*this)();
- }
- }
-
- const base_type& base() const { return _base; }
-
- /**
- * Writes the textual representation if the generator to a @c std::ostream.
- * The textual representation of the engine is the textual representation
- * of the base engine.
- */
- BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, independent_bits_engine, r)
- {
- os << r._base;
- return os;
- }
-
- /**
- * Reads the state of an @c independent_bits_engine from a
- * @c std::istream.
- */
- BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, independent_bits_engine, r)
- {
- is >> r._base;
- return is;
- }
-
- /**
- * Returns: true iff the two @c independent_bits_engines will
- * produce the same sequence of values.
- */
- BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(independent_bits_engine, x, y)
- { return x._base == y._base; }
- /**
- * Returns: true iff the two @c independent_bits_engines will
- * produce different sequences of values.
- */
- BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(independent_bits_engine)
-
-private:
-
- /// \cond show_private
- typedef typename base_type::result_type base_result;
- typedef typename make_unsigned<base_result>::type base_unsigned;
-
- void calc_params(
- std::size_t n, base_unsigned range,
- std::size_t& w0, std::size_t& n0,
- base_unsigned& y0, base_unsigned& y1,
- base_unsigned& y0_mask, base_unsigned& y1_mask)
- {
- BOOST_ASSERT(w >= n);
- w0 = w/n;
- n0 = n - w % n;
- y0_mask = (base_unsigned(2) << (w0 - 1)) - 1;
- y1_mask = (y0_mask << 1) | 1;
- y0 = (range + 1) & ~y0_mask;
- y1 = (range + 1) & ~y1_mask;
- BOOST_ASSERT(y0 != 0 || base_unsigned(range + 1) == 0);
- }
- /// \endcond
-
- Engine _base;
-};
-
-template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-class uniform_smallint<boost::multiprecision::number<Backend, ExpressionTemplates> >
-{
-public:
- typedef boost::multiprecision::number<Backend, ExpressionTemplates> input_type;
- typedef boost::multiprecision::number<Backend, ExpressionTemplates> result_type;
-
- class param_type
- {
- public:
-
- typedef uniform_smallint distribution_type;
-
- /** constructs the parameters of a @c uniform_smallint distribution. */
- param_type(result_type const& min_arg = 0, result_type const& max_arg = 9)
- : _min(min_arg), _max(max_arg)
- {
- BOOST_ASSERT(_min <= _max);
- }
-
- /** Returns the minimum value. */
- result_type a() const { return _min; }
- /** Returns the maximum value. */
- result_type b() const { return _max; }
-
-
- /** Writes the parameters to a @c std::ostream. */
- BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm)
- {
- os << parm._min << " " << parm._max;
- return os;
- }
-
- /** Reads the parameters from a @c std::istream. */
- BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm)
- {
- is >> parm._min >> std::ws >> parm._max;
- return is;
- }
-
- /** Returns true if the two sets of parameters are equal. */
- BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
- { return lhs._min == rhs._min && lhs._max == rhs._max; }
-
- /** Returns true if the two sets of parameters are different. */
- BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
-
- private:
- result_type _min;
- result_type _max;
- };
-
- /**
- * Constructs a @c uniform_smallint. @c min and @c max are the
- * lower and upper bounds of the output range, respectively.
- */
- explicit uniform_smallint(result_type const& min_arg = 0, result_type const& max_arg = 9)
- : _min(min_arg), _max(max_arg) {}
-
- /**
- * Constructs a @c uniform_smallint from its parameters.
- */
- explicit uniform_smallint(const param_type& parm)
- : _min(parm.a()), _max(parm.b()) {}
-
- /** Returns the minimum value of the distribution. */
- result_type a() const { return _min; }
- /** Returns the maximum value of the distribution. */
- result_type b() const { return _max; }
- /** Returns the minimum value of the distribution. */
- result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
- /** Returns the maximum value of the distribution. */
- result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
-
- /** Returns the parameters of the distribution. */
- param_type param() const { return param_type(_min, _max); }
- /** Sets the parameters of the distribution. */
- void param(const param_type& parm)
- {
- _min = parm.a();
- _max = parm.b();
- }
-
- /**
- * Effects: Subsequent uses of the distribution do not depend
- * on values produced by any engine prior to invoking reset.
- */
- void reset() { }
-
- /** Returns a value uniformly distributed in the range [min(), max()]. */
- template<class Engine>
- result_type operator()(Engine& eng) const
- {
- typedef typename Engine::result_type base_result;
- return generate(eng, boost::is_integral<base_result>());
- }
-
- /** Returns a value uniformly distributed in the range [param.a(), param.b()]. */
- template<class Engine>
- result_type operator()(Engine& eng, const param_type& parm) const
- { return uniform_smallint(parm)(eng); }
-
- /** Writes the distribution to a @c std::ostream. */
- BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, uniform_smallint, ud)
- {
- os << ud._min << " " << ud._max;
- return os;
- }
-
- /** Reads the distribution from a @c std::istream. */
- BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, uniform_smallint, ud)
- {
- is >> ud._min >> std::ws >> ud._max;
- return is;
- }
-
- /**
- * Returns true if the two distributions will produce identical
- * sequences of values given equal generators.
- */
- BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(uniform_smallint, lhs, rhs)
- { return lhs._min == rhs._min && lhs._max == rhs._max; }
-
- /**
- * Returns true if the two distributions may produce different
- * sequences of values given equal generators.
- */
- BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(uniform_smallint)
-
-private:
-
- // \cond show_private
- template<class Engine>
- result_type generate(Engine& eng, boost::mpl::true_) const
- {
- // equivalent to (eng() - eng.min()) % (_max - _min + 1) + _min,
- // but guarantees no overflow.
- typedef typename Engine::result_type base_result;
- typedef typename boost::make_unsigned<base_result>::type base_unsigned;
- typedef result_type range_type;
- range_type range = random::detail::subtract<result_type>()(_max, _min);
- base_unsigned base_range =
- random::detail::subtract<result_type>()((eng.max)(), (eng.min)());
- base_unsigned val =
- random::detail::subtract<base_result>()(eng(), (eng.min)());
- if(range >= base_range) {
- return boost::random::detail::add<range_type, result_type>()(
- static_cast<range_type>(val), _min);
- } else {
- base_unsigned modulus = static_cast<base_unsigned>(range) + 1;
- return boost::random::detail::add<range_type, result_type>()(
- static_cast<range_type>(val % modulus), _min);
- }
- }
-
- template<class Engine>
- result_type generate(Engine& eng, boost::mpl::false_) const
- {
- typedef typename Engine::result_type base_result;
- typedef result_type range_type;
- range_type range = random::detail::subtract<result_type>()(_max, _min);
- base_result val = boost::uniform_01<base_result>()(eng);
- // what is the worst that can possibly happen here?
- // base_result may not be able to represent all the values in [0, range]
- // exactly. If this happens, it will cause round off error and we
- // won't be able to produce all the values in the range. We don't
- // care about this because the user has already told us not to by
- // using uniform_smallint. However, we do need to be careful
- // to clamp the result, or floating point rounding can produce
- // an out of range result.
- range_type offset = static_cast<range_type>(val * (range + 1));
- if(offset > range) return _max;
- return boost::random::detail::add<range_type, result_type>()(offset , _min);
- }
- // \endcond
-
- result_type _min;
- result_type _max;
-};
-
-
-namespace detail{
-
-template<class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-struct select_uniform_01<boost::multiprecision::number<Backend, ExpressionTemplates> >
-{
- template<class RealType>
- struct apply
- {
- typedef new_uniform_01<boost::multiprecision::number<Backend, ExpressionTemplates> > type;
- };
-};
-
-template<class Engine, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-boost::multiprecision::number<Backend, ExpressionTemplates>
- generate_uniform_int(
- Engine& eng, const boost::multiprecision::number<Backend, ExpressionTemplates>& min_value, const boost::multiprecision::number<Backend, ExpressionTemplates>& max_value,
- boost::mpl::true_ /** is_integral<Engine::result_type> */)
-{
- typedef boost::multiprecision::number<Backend, ExpressionTemplates> result_type;
- // Since we're using big-numbers, use the result type for all internal calculations:
- typedef result_type range_type;
- typedef result_type base_result;
- typedef result_type base_unsigned;
- const range_type range = random::detail::subtract<result_type>()(max_value, min_value);
- const base_result bmin = (eng.min)();
- const base_unsigned brange =
- random::detail::subtract<base_result>()((eng.max)(), (eng.min)());
-
- if(range == 0) {
- return min_value;
- } else if(brange == range) {
- // this will probably never happen in real life
- // basically nothing to do; just take care we don't overflow / underflow
- base_unsigned v = random::detail::subtract<base_result>()(eng(), bmin);
- return random::detail::add<base_unsigned, result_type>()(v, min_value);
- } else if(brange < range) {
- // use rejection method to handle things like 0..3 --> 0..4
- for(;;) {
- // concatenate several invocations of the base RNG
- // take extra care to avoid overflows
-
- // limit == floor((range+1)/(brange+1))
- // Therefore limit*(brange+1) <= range+1
- range_type limit;
- if(std::numeric_limits<range_type>::is_bounded && (range == (std::numeric_limits<range_type>::max)())) {
- limit = range/(range_type(brange)+1);
- if(range % (range_type(brange)+1) == range_type(brange))
- ++limit;
- } else {
- limit = (range+1)/(range_type(brange)+1);
- }
-
- // We consider "result" as expressed to base (brange+1):
- // For every power of (brange+1), we determine a random factor
- range_type result = range_type(0);
- range_type mult = range_type(1);
-
- // loop invariants:
- // result < mult
- // mult <= range
- while(mult <= limit) {
- // Postcondition: result <= range, thus no overflow
- //
- // limit*(brange+1)<=range+1 def. of limit (1)
- // eng()-bmin<=brange eng() post. (2)
- // and mult<=limit. loop condition (3)
- // Therefore mult*(eng()-bmin+1)<=range+1 by (1),(2),(3) (4)
- // Therefore mult*(eng()-bmin)+mult<=range+1 rearranging (4) (5)
- // result<mult loop invariant (6)
- // Therefore result+mult*(eng()-bmin)<range+1 by (5), (6) (7)
- //
- // Postcondition: result < mult*(brange+1)
- //
- // result<mult loop invariant (1)
- // eng()-bmin<=brange eng() post. (2)
- // Therefore result+mult*(eng()-bmin) <
- // mult+mult*(eng()-bmin) by (1) (3)
- // Therefore result+(eng()-bmin)*mult <
- // mult+mult*brange by (2), (3) (4)
- // Therefore result+(eng()-bmin)*mult <
- // mult*(brange+1) by (4)
- result += static_cast<range_type>(random::detail::subtract<base_result>()(eng(), bmin) * mult);
-
- // equivalent to (mult * (brange+1)) == range+1, but avoids overflow.
- if(mult * range_type(brange) == range - mult + 1) {
- // The destination range is an integer power of
- // the generator's range.
- return(result);
- }
-
- // Postcondition: mult <= range
- //
- // limit*(brange+1)<=range+1 def. of limit (1)
- // mult<=limit loop condition (2)
- // Therefore mult*(brange+1)<=range+1 by (1), (2) (3)
- // mult*(brange+1)!=range+1 preceding if (4)
- // Therefore mult*(brange+1)<range+1 by (3), (4) (5)
- //
- // Postcondition: result < mult
- //
- // See the second postcondition on the change to result.
- mult *= range_type(brange)+range_type(1);
- }
- // loop postcondition: range/mult < brange+1
- //
- // mult > limit loop condition (1)
- // Suppose range/mult >= brange+1 Assumption (2)
- // range >= mult*(brange+1) by (2) (3)
- // range+1 > mult*(brange+1) by (3) (4)
- // range+1 > (limit+1)*(brange+1) by (1), (4) (5)
- // (range+1)/(brange+1) > limit+1 by (5) (6)
- // limit < floor((range+1)/(brange+1)) by (6) (7)
- // limit==floor((range+1)/(brange+1)) def. of limit (8)
- // not (2) reductio (9)
- //
- // loop postcondition: (range/mult)*mult+(mult-1) >= range
- //
- // (range/mult)*mult + range%mult == range identity (1)
- // range%mult < mult def. of % (2)
- // (range/mult)*mult+mult > range by (1), (2) (3)
- // (range/mult)*mult+(mult-1) >= range by (3) (4)
- //
- // Note that the maximum value of result at this point is (mult-1),
- // so after this final step, we generate numbers that can be
- // at least as large as range. We have to really careful to avoid
- // overflow in this final addition and in the rejection. Anything
- // that overflows is larger than range and can thus be rejected.
-
- // range/mult < brange+1 -> no endless loop
- range_type result_increment =
- generate_uniform_int(
- eng,
- static_cast<range_type>(0),
- static_cast<range_type>(range/mult),
- boost::mpl::true_());
- if(std::numeric_limits<range_type>::is_bounded && ((std::numeric_limits<range_type>::max)() / mult < result_increment)) {
- // The multiplication would overflow. Reject immediately.
- continue;
- }
- result_increment *= mult;
- // unsigned integers are guaranteed to wrap on overflow.
- result += result_increment;
- if(result < result_increment) {
- // The addition overflowed. Reject.
- continue;
- }
- if(result > range) {
- // Too big. Reject.
- continue;
- }
- return random::detail::add<range_type, result_type>()(result, min_value);
- }
- } else { // brange > range
- range_type bucket_size;
- // it's safe to add 1 to range, as long as we cast it first,
- // because we know that it is less than brange. However,
- // we do need to be careful not to cause overflow by adding 1
- // to brange.
- if(std::numeric_limits<base_unsigned>::is_bounded && (brange == (std::numeric_limits<base_unsigned>::max)())) {
- bucket_size = brange / (range+1);
- if(brange % (range+1) == range) {
- ++bucket_size;
- }
- } else {
- bucket_size = (brange+1) / (range+1);
- }
- for(;;) {
- range_type result =
- random::detail::subtract<base_result>()(eng(), bmin);
- result /= bucket_size;
- // result and range are non-negative, and result is possibly larger
- // than range, so the cast is safe
- if(result <= range)
- return result + min_value;
- }
- }
-}
-
-template<class Engine, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-inline boost::multiprecision::number<Backend, ExpressionTemplates>
- generate_uniform_int(Engine& eng, const boost::multiprecision::number<Backend, ExpressionTemplates>& min_value, const boost::multiprecision::number<Backend, ExpressionTemplates>& max_value)
-{
- typedef typename Engine::result_type base_result;
- typedef typename mpl::or_<boost::is_integral<base_result>, mpl::bool_<boost::multiprecision::number_category<Backend>::value == boost::multiprecision::number_kind_integer> >::type tag_type;
- return generate_uniform_int(eng, min_value, max_value,
- tag_type());
-}
-
-template<class Engine, class Backend, boost::multiprecision::expression_template_option ExpressionTemplates>
-inline boost::multiprecision::number<Backend, ExpressionTemplates> generate_uniform_real(Engine& eng, const boost::multiprecision::number<Backend, ExpressionTemplates>& min_value, const boost::multiprecision::number<Backend, ExpressionTemplates>& max_value)
-{
- if(max_value / 2 - min_value / 2 > (std::numeric_limits<boost::multiprecision::number<Backend, ExpressionTemplates> >::max)() / 2)
- return 2 * generate_uniform_real(eng, boost::multiprecision::number<Backend, ExpressionTemplates>(min_value / 2), boost::multiprecision::number<Backend, ExpressionTemplates>(max_value / 2));
- typedef typename Engine::result_type base_result;
- return generate_uniform_real(eng, min_value, max_value,
- boost::is_integral<base_result>());
-}
-
-} // detail
-
-
-}} // namespaces
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
#endif
diff --git a/boost/multiprecision/tommath.hpp b/boost/multiprecision/tommath.hpp
index 9c373443c6..346e5395b4 100644
--- a/boost/multiprecision/tommath.hpp
+++ b/boost/multiprecision/tommath.hpp
@@ -679,7 +679,7 @@ public:
static number_type lowest() { return (min)(); }
BOOST_STATIC_CONSTEXPR int digits = INT_MAX;
BOOST_STATIC_CONSTEXPR int digits10 = (INT_MAX / 1000) * 301L;
- BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 2;
+ BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 3;
BOOST_STATIC_CONSTEXPR bool is_signed = true;
BOOST_STATIC_CONSTEXPR bool is_integer = true;
BOOST_STATIC_CONSTEXPR bool is_exact = true;
diff --git a/boost/multiprecision/traits/is_byte_container.hpp b/boost/multiprecision/traits/is_byte_container.hpp
new file mode 100644
index 0000000000..1efda2930e
--- /dev/null
+++ b/boost/multiprecision/traits/is_byte_container.hpp
@@ -0,0 +1,33 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2015 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_IS_BYTE_CONTAINER_HPP
+#define BOOST_IS_BYTE_CONTAINER_HPP
+
+#include <boost/mpl/has_xxx.hpp>
+#include <boost/type_traits/is_integral.hpp>
+
+namespace boost{ namespace multiprecision{ namespace detail{
+
+ BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_member_value_type, value_type, false);
+ BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_member_const_iterator, const_iterator, false);
+
+ template <class C, bool b>
+ struct is_byte_container_imp
+ {
+ static const bool value = boost::is_integral<typename C::value_type>::value && (sizeof(typename C::value_type) == 1);
+ };
+
+ template <class C>
+ struct is_byte_container_imp<C, false> : public boost::false_type {};
+
+ template <class C>
+ struct is_byte_container : public is_byte_container_imp<C, has_member_value_type<C>::value && has_member_const_iterator<C>::value> {};
+
+
+}}} // namespaces
+
+#endif // BOOST_IS_BYTE_CONTAINER_HPP
+
diff --git a/boost/none.hpp b/boost/none.hpp
index 87a6c707ce..db744e58ac 100644
--- a/boost/none.hpp
+++ b/boost/none.hpp
@@ -22,8 +22,10 @@
namespace boost {
#ifdef BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE
+
none_t const none = (static_cast<none_t>(0)) ;
-#else
+
+#elif defined BOOST_OPTIONAL_USE_SINGLETON_DEFINITION_OF_NONE
namespace detail { namespace optional_detail {
@@ -45,9 +47,13 @@ namespace {
const none_t& none = detail::optional_detail::none_instance<none_t>::instance;
}
-#endif
+#else
+
+const none_t none ((none_t::init_tag()));
+
+#endif // older definitions
} // namespace boost
-#endif
+#endif // header guard
diff --git a/boost/none_t.hpp b/boost/none_t.hpp
index 13ce455b16..608cb0c354 100644
--- a/boost/none_t.hpp
+++ b/boost/none_t.hpp
@@ -16,13 +16,25 @@
namespace boost {
#ifdef BOOST_OPTIONAL_USE_OLD_DEFINITION_OF_NONE
+
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
-#else
+
+#elif defined BOOST_OPTIONAL_USE_SINGLETON_DEFINITION_OF_NONE
+
class none_t {};
-#endif
+
+#else
+
+struct none_t
+{
+ struct init_tag{};
+ explicit none_t(init_tag){} // to prevent default constructor
+};
+
+#endif // old implementation workarounds
} // namespace boost
-#endif
+#endif // header guard
diff --git a/boost/numeric/odeint.hpp b/boost/numeric/odeint.hpp
index 1cb8be94f4..e0100899ca 100644
--- a/boost/numeric/odeint.hpp
+++ b/boost/numeric/odeint.hpp
@@ -71,6 +71,7 @@
#include <boost/numeric/odeint/integrate/integrate_times.hpp>
#include <boost/numeric/odeint/integrate/observer_collection.hpp>
+#include <boost/numeric/odeint/integrate/max_step_checker.hpp>
#include <boost/numeric/odeint/stepper/generation.hpp>
diff --git a/boost/numeric/odeint/algebra/default_operations.hpp b/boost/numeric/odeint/algebra/default_operations.hpp
index b10944fa19..56139083cc 100644
--- a/boost/numeric/odeint/algebra/default_operations.hpp
+++ b/boost/numeric/odeint/algebra/default_operations.hpp
@@ -529,7 +529,7 @@ struct default_operations
{ }
template< class Res , class T1 , class T2 , class T3 , class T4 >
- Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &dxdt_old , const T4 &x_err )
+ Res operator()( Res r , const T1 &x_old , const T2 &/*x*/ , const T3 &dxdt_old , const T4 &x_err )
{
BOOST_USING_STD_MAX();
using std::abs;
@@ -574,7 +574,7 @@ struct default_operations
{ }
template< class Res , class T1 , class T2 , class T3 , class T4 >
- Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &dxdt_old , const T4 &x_err )
+ Res operator()( Res r , const T1 &x_old , const T2 &/*x*/ , const T3 &dxdt_old , const T4 &x_err )
{
using std::abs;
Res tmp = abs( get_unit_value( x_err ) ) /
diff --git a/boost/numeric/odeint/integrate/check_adapter.hpp b/boost/numeric/odeint/integrate/check_adapter.hpp
new file mode 100644
index 0000000000..3d3ebd6c88
--- /dev/null
+++ b/boost/numeric/odeint/integrate/check_adapter.hpp
@@ -0,0 +1,222 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/check_adapter.hpp
+
+ [begin_description]
+ Adapters to add checking facility to stepper and observer
+ [end_description]
+
+ Copyright 2015 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_CHECK_ADAPTER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_CHECK_ADAPTER_HPP_INCLUDED
+
+#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+template<class Stepper, class Checker,
+ class StepperCategory = typename base_tag<typename Stepper::stepper_category>::type>
+class checked_stepper;
+
+
+/**
+ * \brief Adapter to combine basic stepper and checker.
+ */
+template<class Stepper, class Checker>
+class checked_stepper<Stepper, Checker, stepper_tag>
+{
+
+public:
+ typedef Stepper stepper_type;
+ typedef Checker checker_type;
+ // forward stepper typedefs
+ typedef typename stepper_type::state_type state_type;
+ typedef typename stepper_type::value_type value_type;
+ typedef typename stepper_type::deriv_type deriv_type;
+ typedef typename stepper_type::time_type time_type;
+
+private:
+ stepper_type &m_stepper;
+ checker_type &m_checker;
+
+public:
+ /**
+ * \brief Construct the checked_stepper.
+ */
+ checked_stepper(stepper_type &stepper, checker_type &checker)
+ : m_stepper(stepper), m_checker(checker) { }
+
+ /**
+ * \brief forward of the do_step method
+ */
+ template<class System, class StateInOut>
+ void do_step(System system, StateInOut &state, const time_type t, const time_type dt)
+ {
+ // do the step
+ m_stepper.do_step(system, state, t, dt);
+ // call the checker
+ m_checker();
+ }
+};
+
+
+/**
+ * \brief Adapter to combine controlled stepper and checker.
+ */
+template<class ControlledStepper, class Checker>
+class checked_stepper<ControlledStepper, Checker, controlled_stepper_tag>
+{
+
+public:
+ typedef ControlledStepper stepper_type;
+ typedef Checker checker_type;
+ // forward stepper typedefs
+ typedef typename stepper_type::state_type state_type;
+ typedef typename stepper_type::value_type value_type;
+ typedef typename stepper_type::deriv_type deriv_type;
+ typedef typename stepper_type::time_type time_type;
+
+private:
+ stepper_type &m_stepper;
+ checker_type &m_checker;
+
+public:
+ /**
+ * \brief Construct the checked_stepper.
+ */
+ checked_stepper(stepper_type &stepper, checker_type &checker)
+ : m_stepper(stepper), m_checker(checker) { }
+
+ /**
+ * \brief forward of the do_step method
+ */
+ template< class System , class StateInOut >
+ controlled_step_result try_step( System system , StateInOut &state , time_type &t , time_type &dt )
+ {
+ // do the step
+ if( m_stepper.try_step(system, state, t, dt) == success )
+ {
+ // call the checker if step was successful
+ m_checker();
+ return success;
+ } else
+ {
+ // step failed -> return fail
+ return fail;
+ }
+ }
+};
+
+
+/**
+ * \brief Adapter to combine dense out stepper and checker.
+ */
+template<class DenseOutStepper, class Checker>
+class checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag>
+{
+
+public:
+ typedef DenseOutStepper stepper_type;
+ typedef Checker checker_type;
+ // forward stepper typedefs
+ typedef typename stepper_type::state_type state_type;
+ typedef typename stepper_type::value_type value_type;
+ typedef typename stepper_type::deriv_type deriv_type;
+ typedef typename stepper_type::time_type time_type;
+
+private:
+ stepper_type &m_stepper;
+ checker_type &m_checker;
+
+public:
+ /**
+ * \brief Construct the checked_stepper.
+ */
+ checked_stepper(stepper_type &stepper, checker_type &checker)
+ : m_stepper(stepper), m_checker(checker) { }
+
+
+ template< class System >
+ std::pair< time_type , time_type > do_step( System system )
+ {
+ m_checker();
+ return m_stepper.do_step(system);
+ }
+
+ /* provide the remaining dense out stepper interface */
+ template< class StateType >
+ void initialize( const StateType &x0 , time_type t0 , time_type dt0 )
+ { m_stepper.initialize(x0, t0, dt0); }
+
+
+ template< class StateOut >
+ void calc_state( time_type t , StateOut &x ) const
+ { m_stepper.calc_state(t, x); }
+
+ template< class StateOut >
+ void calc_state( time_type t , const StateOut &x ) const
+ { m_stepper.calc_state(t, x); }
+
+ const state_type& current_state( void ) const
+ { return m_stepper.current_state(); }
+
+ time_type current_time( void ) const
+ { return m_stepper.current_time(); }
+
+ const state_type& previous_state( void ) const
+ { return m_stepper.previous_state(); }
+
+ time_type previous_time( void ) const
+ { return m_stepper.previous_time(); }
+
+ time_type current_time_step( void ) const
+ { return m_stepper.current_time_step(); }
+
+};
+
+
+/**
+ * \brief Adapter to combine observer and checker.
+ */
+template<class Observer, class Checker>
+class checked_observer
+{
+public:
+ typedef Observer observer_type;
+ typedef Checker checker_type;
+
+private:
+ observer_type &m_observer;
+ checker_type &m_checker;
+
+public:
+ checked_observer(observer_type &observer, checker_type &checker)
+ : m_observer(observer), m_checker(checker)
+ {}
+
+ template< class State , class Time >
+ void operator()(const State& state, Time t) const
+ {
+ // call the observer
+ m_observer(state, t);
+ // reset the checker
+ m_checker.reset();
+ }
+};
+
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif \ No newline at end of file
diff --git a/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp b/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp
index 743e57709c..7516d44087 100644
--- a/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp
+++ b/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp
@@ -7,7 +7,7 @@
[end_description]
Copyright 2011-2013 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Copyright 2012 Christoph Koke
Distributed under the Boost Software License, Version 1.0.
@@ -25,6 +25,7 @@
#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
+#include <boost/numeric/odeint/integrate/max_step_checker.hpp>
#include <boost/numeric/odeint/integrate/detail/integrate_const.hpp>
#include <boost/numeric/odeint/util/bind.hpp>
#include <boost/numeric/odeint/util/unwrap_reference.hpp>
@@ -41,7 +42,7 @@ namespace odeint {
namespace detail {
// forward declaration
-template< class Stepper , class System , class State , class Time , class Observer>
+template< class Stepper , class System , class State , class Time , class Observer >
size_t integrate_const(
Stepper stepper , System system , State &start_state ,
Time start_time , Time end_time , Time dt ,
@@ -74,7 +75,7 @@ size_t integrate_adaptive(
/*
- * classical integrate adaptive
+ * integrate adaptive for controlled stepper
*/
template< class Stepper , class System , class State , class Time , class Observer >
size_t integrate_adaptive(
@@ -86,8 +87,7 @@ size_t integrate_adaptive(
typename odeint::unwrap_reference< Observer >::type &obs = observer;
typename odeint::unwrap_reference< Stepper >::type &st = stepper;
- const size_t max_attempts = 1000;
- const char *error_string = "Integrate adaptive : Maximal number of iterations reached. A step size could not be found.";
+ failed_step_checker fail_checker; // to throw a runtime_error if step size adjustment fails
size_t count = 0;
while( less_with_sign( start_time , end_time , dt ) )
{
@@ -97,15 +97,14 @@ size_t integrate_adaptive(
dt = end_time - start_time;
}
- size_t trials = 0;
controlled_step_result res;
do
{
res = st.try_step( system , start_state , start_time , dt );
- ++trials;
+ fail_checker(); // check number of failed steps
}
- while( ( res == fail ) && ( trials < max_attempts ) );
- if( trials == max_attempts ) BOOST_THROW_EXCEPTION( std::overflow_error( error_string ) );
+ while( res == fail );
+ fail_checker.reset(); // if we reach here, the step was successful -> reset fail checker
++count;
}
diff --git a/boost/numeric/odeint/integrate/detail/integrate_const.hpp b/boost/numeric/odeint/integrate/detail/integrate_const.hpp
index 312564ff16..7a86b32fa6 100644
--- a/boost/numeric/odeint/integrate/detail/integrate_const.hpp
+++ b/boost/numeric/odeint/integrate/detail/integrate_const.hpp
@@ -6,7 +6,7 @@
integrate const implementation
[end_description]
- Copyright 2012 Mario Mulansky
+ Copyright 2012-2015 Mario Mulansky
Copyright 2012 Christoph Koke
Copyright 2012 Karsten Ahnert
@@ -43,12 +43,13 @@ template< class Stepper , class System , class State , class Time , class Observ
size_t integrate_const(
Stepper stepper , System system , State &start_state ,
Time start_time , Time end_time , Time dt ,
- Observer observer , stepper_tag
+ Observer observer , stepper_tag
)
{
+
typename odeint::unwrap_reference< Observer >::type &obs = observer;
typename odeint::unwrap_reference< Stepper >::type &st = stepper;
-
+
Time time = start_time;
int step = 0;
// cast time+dt explicitely in case of expression templates (e.g. multiprecision)
@@ -72,11 +73,11 @@ template< class Stepper , class System , class State , class Time , class Observ
size_t integrate_const(
Stepper stepper , System system , State &start_state ,
Time start_time , Time end_time , Time dt ,
- Observer observer , controlled_stepper_tag
+ Observer observer , controlled_stepper_tag
)
{
typename odeint::unwrap_reference< Observer >::type &obs = observer;
-
+
Time time = start_time;
const Time time_step = dt;
int real_steps = 0;
@@ -85,8 +86,10 @@ size_t integrate_const(
while( less_eq_with_sign( static_cast<Time>(time+time_step) , end_time , dt ) )
{
obs( start_state , time );
- real_steps += detail::integrate_adaptive( stepper , system , start_state , time , time+time_step , dt ,
- null_observer() , controlled_stepper_tag() );
+ // integrate_adaptive_checked uses the given checker to throw if an overflow occurs
+ real_steps += detail::integrate_adaptive(stepper, system, start_state, time,
+ static_cast<Time>(time + time_step), dt,
+ null_observer(), controlled_stepper_tag());
// direct computation of the time avoids error propagation happening when using time += dt
// we need clumsy type analysis to get boost units working here
step++;
@@ -102,12 +105,12 @@ template< class Stepper , class System , class State , class Time , class Observ
size_t integrate_const(
Stepper stepper , System system , State &start_state ,
Time start_time , Time end_time , Time dt ,
- Observer observer , dense_output_stepper_tag
+ Observer observer , dense_output_stepper_tag
)
{
typename odeint::unwrap_reference< Observer >::type &obs = observer;
typename odeint::unwrap_reference< Stepper >::type &st = stepper;
-
+
Time time = start_time;
st.initialize( start_state , time , dt );
@@ -117,7 +120,7 @@ size_t integrate_const(
int obs_step( 1 );
int real_step( 0 );
- while( less_with_sign( static_cast<Time>(time+dt) , end_time , dt ) )
+ while( less_eq_with_sign( static_cast<Time>(time+dt) , end_time , dt ) )
{
while( less_eq_with_sign( time , st.current_time() , dt ) )
{
@@ -148,6 +151,7 @@ size_t integrate_const(
}
// last observation, if we are still in observation interval
+ // might happen due to finite precision problems when computing the the time
if( less_eq_with_sign( time , end_time , dt ) )
{
st.calc_state( time , start_state );
diff --git a/boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp b/boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp
index 3c1d171620..2ef490d592 100644
--- a/boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp
+++ b/boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp
@@ -6,7 +6,7 @@
integrate steps implementation
[end_description]
- Copyright 2012 Mario Mulansky
+ Copyright 2012-2015 Mario Mulansky
Copyright 2012 Christoph Koke
Copyright 2012 Karsten Ahnert
@@ -32,10 +32,10 @@ namespace detail {
// forward declaration
template< class Stepper , class System , class State , class Time , class Observer >
-size_t integrate_adaptive(
+size_t integrate_adaptive_checked(
Stepper stepper , System system , State &start_state ,
Time &start_time , Time end_time , Time &dt ,
- Observer observer , controlled_stepper_tag
+ Observer observer, controlled_stepper_tag
);
@@ -66,7 +66,7 @@ Time integrate_n_steps(
/* controlled version */
-template< class Stepper , class System , class State , class Time , class Observer>
+template< class Stepper , class System , class State , class Time , class Observer >
Time integrate_n_steps(
Stepper stepper , System system , State &start_state ,
Time start_time , Time dt , size_t num_of_steps ,
@@ -80,8 +80,9 @@ Time integrate_n_steps(
for( size_t step = 0; step < num_of_steps ; ++step )
{
obs( start_state , time );
- detail::integrate_adaptive( stepper , system , start_state , time , static_cast<Time>(time+time_step) , dt ,
- null_observer() , controlled_stepper_tag() );
+ // integrate_adaptive_checked uses the given checker to throw if an overflow occurs
+ detail::integrate_adaptive(stepper, system, start_state, time, static_cast<Time>(time + time_step), dt,
+ null_observer(), controlled_stepper_tag());
// direct computation of the time avoids error propagation happening when using time += dt
// we need clumsy type analysis to get boost units working here
time = start_time + static_cast< typename unit_value_type<Time>::type >(step+1) * time_step;
@@ -93,7 +94,7 @@ Time integrate_n_steps(
/* dense output version */
-template< class Stepper , class System , class State , class Time , class Observer>
+template< class Stepper , class System , class State , class Time , class Observer >
Time integrate_n_steps(
Stepper stepper , System system , State &start_state ,
Time start_time , Time dt , size_t num_of_steps ,
@@ -135,6 +136,7 @@ Time integrate_n_steps(
}
}
+ // make sure we really end exactly where we should end
while( st.current_time() < end_time )
{
if( less_with_sign( end_time ,
@@ -144,7 +146,7 @@ Time integrate_n_steps(
st.do_step( system );
}
- // observation at end point, only if we ended exactly on the end-point (or above due to finite precision)
+ // observation at final point
obs( st.current_state() , end_time );
return time;
diff --git a/boost/numeric/odeint/integrate/detail/integrate_times.hpp b/boost/numeric/odeint/integrate/detail/integrate_times.hpp
index d5446ba590..2e27990412 100644
--- a/boost/numeric/odeint/integrate/detail/integrate_times.hpp
+++ b/boost/numeric/odeint/integrate/detail/integrate_times.hpp
@@ -6,7 +6,7 @@
Default integrate times implementation.
[end_description]
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Copyright 2012 Karsten Ahnert
Copyright 2012 Christoph Koke
@@ -26,6 +26,7 @@
#include <boost/numeric/odeint/util/unwrap_reference.hpp>
#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
+#include <boost/numeric/odeint/integrate/max_step_checker.hpp>
namespace boost {
@@ -38,15 +39,18 @@ namespace detail {
/*
* integrate_times for simple stepper
*/
-template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
+template<class Stepper, class System, class State, class TimeIterator, class Time, class Observer>
size_t integrate_times(
Stepper stepper , System system , State &start_state ,
TimeIterator start_time , TimeIterator end_time , Time dt ,
Observer observer , stepper_tag
)
{
- typename odeint::unwrap_reference< Observer >::type &obs = observer;
- typename odeint::unwrap_reference< Stepper >::type &st = stepper;
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+
+ stepper_type &st = stepper;
+ observer_type &obs = observer;
typedef typename unit_value_type<Time>::type time_type;
size_t steps = 0;
@@ -82,12 +86,10 @@ size_t integrate_times(
typename odeint::unwrap_reference< Stepper >::type &st = stepper;
typedef typename unit_value_type<Time>::type time_type;
- const size_t max_attempts = 1000;
- const char *error_string = "Integrate adaptive : Maximal number of iterations reached. A step size could not be found.";
+ failed_step_checker fail_checker; // to throw a runtime_error if step size adjustment fails
size_t steps = 0;
while( true )
{
- size_t fail_steps = 0;
Time current_time = *start_time++;
obs( start_state , current_time );
if( start_time == end_time )
@@ -99,15 +101,16 @@ size_t integrate_times(
if( st.try_step( system , start_state , current_time , current_dt ) == success )
{
++steps;
+ // successful step -> reset the fail counter, see #173
+ fail_checker.reset();
// continue with the original step size if dt was reduced due to observation
dt = max_abs( dt , current_dt );
}
else
{
- ++fail_steps;
+ fail_checker(); // check for possible overflow of failed steps in step size adjustment
dt = current_dt;
}
- if( fail_steps == max_attempts ) BOOST_THROW_EXCEPTION( std::overflow_error( error_string ));
}
}
return steps;
@@ -125,6 +128,7 @@ size_t integrate_times(
{
typename odeint::unwrap_reference< Observer >::type &obs = observer;
typename odeint::unwrap_reference< Stepper >::type &st = stepper;
+
typedef typename unit_value_type<Time>::type time_type;
if( start_time == end_time )
diff --git a/boost/numeric/odeint/integrate/integrate_adaptive.hpp b/boost/numeric/odeint/integrate/integrate_adaptive.hpp
index 12bdc8237d..09997142fc 100644
--- a/boost/numeric/odeint/integrate/integrate_adaptive.hpp
+++ b/boost/numeric/odeint/integrate/integrate_adaptive.hpp
@@ -7,7 +7,7 @@
[end_description]
Copyright 2011-2013 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or
diff --git a/boost/numeric/odeint/integrate/integrate_const.hpp b/boost/numeric/odeint/integrate/integrate_const.hpp
index ba2d891e97..fae683f978 100644
--- a/boost/numeric/odeint/integrate/integrate_const.hpp
+++ b/boost/numeric/odeint/integrate/integrate_const.hpp
@@ -8,7 +8,7 @@
[end_description]
Copyright 2011-2013 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or
@@ -23,6 +23,7 @@
#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
#include <boost/numeric/odeint/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/integrate/check_adapter.hpp>
#include <boost/numeric/odeint/integrate/detail/integrate_const.hpp>
#include <boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp>
@@ -31,91 +32,120 @@ namespace numeric {
namespace odeint {
-
-
-
/*
* Integrates with constant time step dt.
*/
-template< class Stepper , class System , class State , class Time , class Observer >
+template<class Stepper, class System, class State, class Time, class Observer, class StepOverflowChecker>
size_t integrate_const(
- Stepper stepper , System system , State &start_state ,
- Time start_time , Time end_time , Time dt ,
- Observer observer
-)
-{
- typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+ Stepper stepper, System system, State &start_state,
+ Time start_time, Time end_time, Time dt,
+ Observer observer, StepOverflowChecker checker
+) {
+ typedef typename odeint::unwrap_reference<Stepper>::type::stepper_category stepper_category;
// we want to get as fast as possible to the end
- if( boost::is_same< null_observer , Observer >::value )
- {
+ // no overflow checks needed
+ if (boost::is_same<null_observer, Observer>::value) {
return detail::integrate_adaptive(
- stepper , system , start_state ,
- start_time , end_time , dt ,
- observer , stepper_category() );
+ stepper, system, start_state,
+ start_time, end_time, dt,
+ observer, stepper_category());
+ }
+ else {
+ // unwrap references
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+ typedef typename odeint::unwrap_reference< StepOverflowChecker >::type checker_type;
+
+ return detail::integrate_const(checked_stepper<stepper_type, checker_type>(stepper, checker),
+ system, start_state,
+ start_time, end_time, dt,
+ checked_observer<observer_type, checker_type>(observer, checker),
+ stepper_category());
}
- else
- {
- return detail::integrate_const( stepper , system , start_state ,
- start_time , end_time , dt ,
- observer , stepper_category() );
- }
}
/**
- * \brief Second version to solve the forwarding problem,
- * can be called with Boost.Range as start_state.
- */
-template< class Stepper , class System , class State , class Time , class Observer >
+* \brief Second version to solve the forwarding problem,
+* can be called with Boost.Range as start_state.
+*/
+template<class Stepper, class System, class State, class Time, class Observer, class StepOverflowChecker >
size_t integrate_const(
- Stepper stepper , System system , const State &start_state ,
- Time start_time , Time end_time , Time dt ,
- Observer observer
-)
-{
- typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+ Stepper stepper, System system, const State &start_state,
+ Time start_time, Time end_time, Time dt,
+ Observer observer, StepOverflowChecker checker
+) {
+ typedef typename odeint::unwrap_reference<Stepper>::type::stepper_category stepper_category;
// we want to get as fast as possible to the end
- if( boost::is_same< null_observer , Observer >::value )
- {
+
+ if (boost::is_same<null_observer, Observer>::value) {
return detail::integrate_adaptive(
- stepper , system , start_state ,
- start_time , end_time , dt ,
- observer , stepper_category() );
+ stepper, system, start_state,
+ start_time, end_time, dt,
+ observer, stepper_category());
}
- else
- {
- return detail::integrate_const( stepper , system , start_state ,
- start_time , end_time , dt ,
- observer , stepper_category() );
+ else {
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+ typedef typename odeint::unwrap_reference< StepOverflowChecker >::type checker_type;
+
+ return detail::integrate_const(checked_stepper<stepper_type, checker_type>(stepper, checker),
+ system, start_state,
+ start_time, end_time, dt,
+ checked_observer<observer_type, checker_type>(observer, checker),
+ stepper_category());
}
}
+/**
+* \brief integrate_const without step overflow checker
+*/
+template<class Stepper, class System, class State, class Time, class Observer>
+size_t integrate_const(
+ Stepper stepper, System system, State &start_state,
+ Time start_time, Time end_time, Time dt, Observer observer)
+{
+ typedef typename odeint::unwrap_reference<Stepper>::type::stepper_category stepper_category;
+ return detail::integrate_const(stepper, system, start_state,
+ start_time, end_time, dt, observer, stepper_category());
+}
+/**
+* \brief Second version to solve the forwarding problem,
+* can be called with Boost.Range as start_state.
+*/
+template<class Stepper, class System, class State, class Time, class Observer>
+size_t integrate_const(
+ Stepper stepper, System system, const State &start_state,
+ Time start_time, Time end_time, Time dt, Observer observer
+) {
+ typedef typename odeint::unwrap_reference<Stepper>::type::stepper_category stepper_category;
+ return detail::integrate_const(stepper, system, start_state,
+ start_time, end_time, dt, observer, stepper_category());
+}
/**
- * \brief integrate_const without observer calls
- */
-template< class Stepper , class System , class State , class Time >
+* \brief integrate_const without observer calls
+*/
+template<class Stepper, class System, class State, class Time>
size_t integrate_const(
- Stepper stepper , System system , State &start_state ,
- Time start_time , Time end_time , Time dt
-)
-{
- return integrate_const( stepper , system , start_state , start_time , end_time , dt , null_observer() );
+ Stepper stepper, System system, State &start_state,
+ Time start_time, Time end_time, Time dt
+) {
+ return integrate_const(stepper, system, start_state, start_time, end_time, dt, null_observer());
}
/**
- * \brief Second version to solve the forwarding problem,
- * can be called with Boost.Range as start_state.
- */
-template< class Stepper , class System , class State , class Time >
+* \brief Second version to solve the forwarding problem,
+* can be called with Boost.Range as start_state.
+*/
+template<class Stepper, class System, class State, class Time>
size_t integrate_const(
- Stepper stepper , System system , const State &start_state ,
- Time start_time , Time end_time , Time dt
-)
-{
- return integrate_const( stepper , system , start_state , start_time , end_time , dt , null_observer() );
+ Stepper stepper, System system, const State &start_state,
+ Time start_time, Time end_time, Time dt
+) {
+ return integrate_const(stepper, system, start_state, start_time, end_time, dt, null_observer());
}
@@ -124,30 +154,37 @@ size_t integrate_const(
/********* DOXYGEN *********/
- /**
- * \fn integrate_const( Stepper stepper , System system , State &start_state , Time start_time , Time end_time , Time dt , Observer observer )
- * \brief Integrates the ODE with constant step size.
- *
- * Integrates the ODE defined by system using the given stepper.
- * This method ensures that the observer is called at constant intervals dt.
- * If the Stepper is a normal stepper without step size control, dt is also
- * used for the numerical scheme. If a ControlledStepper is provided, the
- * algorithm might reduce the step size to meet the error bounds, but it is
- * ensured that the observer is always called at equidistant time points
- * t0 + n*dt. If a DenseOutputStepper is used, the step size also may vary
- * and the dense output is used to call the observer at equidistant time
- * points.
- *
- * \param stepper The stepper to be used for numerical integration.
- * \param system Function/Functor defining the rhs of the ODE.
- * \param start_state The initial condition x0.
- * \param start_time The initial time t0.
- * \param end_time The final integration time tend.
- * \param dt The time step between observer calls, _not_ necessarily the
- * time step of the integration.
- * \param observer Function/Functor called at equidistant time intervals.
- * \return The number of steps performed.
- */
+/**
+ * \fn integrate_const( Stepper stepper , System system , State &start_state , Time start_time ,
+ * Time end_time , Time dt , Observer observer , StepOverflowChecker checker )
+ * \brief Integrates the ODE with constant step size.
+ *
+ * Integrates the ODE defined by system using the given stepper.
+ * This method ensures that the observer is called at constant intervals dt.
+ * If the Stepper is a normal stepper without step size control, dt is also
+ * used for the numerical scheme. If a ControlledStepper is provided, the
+ * algorithm might reduce the step size to meet the error bounds, but it is
+ * ensured that the observer is always called at equidistant time points
+ * t0 + n*dt. If a DenseOutputStepper is used, the step size also may vary
+ * and the dense output is used to call the observer at equidistant time
+ * points.
+ * If a max_step_checker is provided as StepOverflowChecker, a
+ * no_progress_error is thrown if too many steps (default: 500) are performed
+ * without progress, i.e. in between observer calls. If no checker is provided,
+ * no such overflow check is performed.
+ *
+ * \param stepper The stepper to be used for numerical integration.
+ * \param system Function/Functor defining the rhs of the ODE.
+ * \param start_state The initial condition x0.
+ * \param start_time The initial time t0.
+ * \param end_time The final integration time tend.
+ * \param dt The time step between observer calls, _not_ necessarily the
+ * time step of the integration.
+ * \param observer [optional] Function/Functor called at equidistant time intervals.
+ * \param checker [optional] Functor to check for step count overflows, if no
+ * checker is provided, no exception is thrown.
+ * \return The number of steps performed.
+ */
} // namespace odeint
} // namespace numeric
diff --git a/boost/numeric/odeint/integrate/integrate_n_steps.hpp b/boost/numeric/odeint/integrate/integrate_n_steps.hpp
index f85c453bd2..7f3a49bddc 100644
--- a/boost/numeric/odeint/integrate/integrate_n_steps.hpp
+++ b/boost/numeric/odeint/integrate/integrate_n_steps.hpp
@@ -7,7 +7,7 @@
[end_description]
Copyright 2011-2013 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or
@@ -34,35 +34,80 @@ namespace odeint {
*
* the two overloads are needed in order to solve the forwarding problem
*/
-template< class Stepper , class System , class State , class Time , class Observer>
+template< class Stepper , class System , class State , class Time , class Observer , class StepOverflowChecker >
Time integrate_n_steps(
Stepper stepper , System system , State &start_state ,
Time start_time , Time dt , size_t num_of_steps ,
- Observer observer )
+ Observer observer , StepOverflowChecker checker )
{
- typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+ // unwrap references
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+ typedef typename odeint::unwrap_reference< StepOverflowChecker >::type checker_type;
+ typedef typename stepper_type::stepper_category stepper_category;
+
return detail::integrate_n_steps(
- stepper , system , start_state ,
+ checked_stepper<stepper_type, checker_type>(stepper, checker),
+ system , start_state ,
start_time , dt , num_of_steps ,
- observer , stepper_category() );
+ checked_observer<observer_type, checker_type>(observer, checker),
+ stepper_category() );
}
/**
* \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
*/
-template< class Stepper , class System , class State , class Time , class Observer >
+template< class Stepper , class System , class State , class Time , class Observer , class StepOverflowChecker >
Time integrate_n_steps(
Stepper stepper , System system , const State &start_state ,
Time start_time , Time dt , size_t num_of_steps ,
- Observer observer )
+ Observer observer , StepOverflowChecker checker )
+{
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+ typedef typename odeint::unwrap_reference< StepOverflowChecker >::type checker_type;
+ typedef typename stepper_type::stepper_category stepper_category;
+
+ return detail::integrate_n_steps(
+ checked_stepper<stepper_type, checker_type>(stepper, checker),
+ system , start_state ,
+ start_time , dt , num_of_steps ,
+ checked_observer<observer_type, checker_type>(observer, checker),
+ stepper_category() );
+}
+
+
+/**
+* \brief The same function as above, but without checker.
+*/
+template< class Stepper , class System , class State , class Time , class Observer >
+Time integrate_n_steps(
+ Stepper stepper , System system , State &start_state ,
+ Time start_time , Time dt , size_t num_of_steps , Observer observer )
{
- typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+ typedef typename odeint::unwrap_reference<Stepper>::type::stepper_category stepper_category;
+
return detail::integrate_n_steps(
- stepper , system , start_state ,
- start_time , dt , num_of_steps ,
- observer , stepper_category() );
+ stepper , system , start_state ,
+ start_time , dt , num_of_steps ,
+ observer , stepper_category() );
}
+/**
+* \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+*/
+template< class Stepper , class System , class State , class Time , class Observer >
+Time integrate_n_steps(
+ Stepper stepper , System system , const State &start_state ,
+ Time start_time , Time dt , size_t num_of_steps , Observer observer )
+{
+ typedef typename odeint::unwrap_reference<Stepper>::type::stepper_category stepper_category;
+
+ return detail::integrate_n_steps(
+ stepper , system , start_state ,
+ start_time , dt , num_of_steps ,
+ observer , stepper_category() );
+}
/**
* \brief The same function as above, but without observer calls.
@@ -72,7 +117,8 @@ Time integrate_n_steps(
Stepper stepper , System system , State &start_state ,
Time start_time , Time dt , size_t num_of_steps )
{
- return integrate_n_steps( stepper , system , start_state , start_time , dt , num_of_steps , null_observer() );
+ return integrate_n_steps(stepper, system, start_state, start_time,
+ dt, num_of_steps, null_observer());
}
/**
@@ -83,7 +129,8 @@ Time integrate_n_steps(
Stepper stepper , System system , const State &start_state ,
Time start_time , Time dt , size_t num_of_steps )
{
- return integrate_n_steps( stepper , system , start_state , start_time , dt , num_of_steps , null_observer() );
+ return integrate_n_steps(stepper, system, start_state, start_time,
+ dt, num_of_steps, null_observer());
}
@@ -102,6 +149,11 @@ Time integrate_n_steps(
* t0 + n*dt. If a DenseOutputStepper is used, the step size also may vary
* and the dense output is used to call the observer at equidistant time
* points. The final integration time is always t0 + num_of_steps*dt.
+ * If a max_step_checker is provided as StepOverflowChecker, a
+ * no_progress_errror is thrown if too many steps (default: 500) are
+ * performed without progress, i.e. in between observer calls. If no
+ * checker is provided, no such overflow check is performed.
+
*
* \param stepper The stepper to be used for numerical integration.
* \param system Function/Functor defining the rhs of the ODE.
@@ -111,6 +163,8 @@ Time integrate_n_steps(
* time step of the integration.
* \param num_of_steps Number of steps to be performed
* \param observer Function/Functor called at equidistant time intervals.
+ * \param checker [optional] Functor to check for step count overflows, if no
+ * checker is provided, no exception is thrown.
* \return The number of steps performed.
*/
diff --git a/boost/numeric/odeint/integrate/integrate_times.hpp b/boost/numeric/odeint/integrate/integrate_times.hpp
index c0ecda6c6d..79fba4f1b3 100644
--- a/boost/numeric/odeint/integrate/integrate_times.hpp
+++ b/boost/numeric/odeint/integrate/integrate_times.hpp
@@ -7,7 +7,7 @@
[end_description]
Copyright 2011-2013 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or
@@ -24,6 +24,7 @@
#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
#include <boost/numeric/odeint/integrate/null_observer.hpp>
+#include <boost/numeric/odeint/integrate/check_adapter.hpp>
#include <boost/numeric/odeint/integrate/detail/integrate_times.hpp>
namespace boost {
@@ -32,8 +33,91 @@ namespace odeint {
/*
+ * \brief Integrates while calling the observer at the time points given by sequence [times_start, time_end)
* the two overloads are needed in order to solve the forwarding problem
*/
+template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer , class StepOverflowChecker >
+size_t integrate_times(
+ Stepper stepper , System system , State &start_state ,
+ TimeIterator times_start , TimeIterator times_end , Time dt ,
+ Observer observer , StepOverflowChecker checker )
+{
+ // unwrap references
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+ typedef typename odeint::unwrap_reference< StepOverflowChecker >::type checker_type;
+ typedef typename stepper_type::stepper_category stepper_category;
+
+ // pass on checked stepper and observer
+ // checked_stepper/observer use references internally, so passing by value is fine
+ return detail::integrate_times(
+ checked_stepper<stepper_type, checker_type>(stepper, checker) ,
+ system , start_state ,
+ times_start , times_end , dt ,
+ checked_observer<observer_type, checker_type>(observer, checker),
+ stepper_category() );
+}
+
+/**
+ * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer , class StepOverflowChecker >
+size_t integrate_times(
+ Stepper stepper , System system , const State &start_state ,
+ TimeIterator times_start , TimeIterator times_end , Time dt ,
+ Observer observer , StepOverflowChecker checker )
+{
+ typedef typename odeint::unwrap_reference< Stepper >::type stepper_type;
+ typedef typename odeint::unwrap_reference< Observer >::type observer_type;
+ typedef typename odeint::unwrap_reference< StepOverflowChecker >::type checker_type;
+ typedef typename stepper_type::stepper_category stepper_category;
+
+ stepper_type &st = stepper;
+ observer_type &obs = observer;
+ checker_type &chk = checker;
+
+ return detail::integrate_times(
+ checked_stepper<stepper_type, checker_type>(stepper, checker) ,
+ system , start_state ,
+ times_start , times_end , dt ,
+ checked_observer<observer_type, checker_type>(observer, checker),
+ stepper_category() );
+}
+
+/**
+ * \brief The same function as above, but with the observation times given as range.
+ */
+template< class Stepper , class System , class State , class TimeRange , class Time , class Observer , class StepOverflowChecker >
+size_t integrate_times(
+ Stepper stepper , System system , State &start_state ,
+ const TimeRange &times , Time dt ,
+ Observer observer , StepOverflowChecker checker )
+{
+ return integrate_times(
+ stepper , system , start_state ,
+ boost::begin( times ) , boost::end( times ) , dt , observer , checker );
+}
+
+/**
+ * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+ */
+template< class Stepper , class System , class State , class TimeRange , class Time , class Observer , class StepOverflowChecker >
+size_t integrate_times(
+ Stepper stepper , System system , const State &start_state ,
+ const TimeRange &times , Time dt ,
+ Observer observer , StepOverflowChecker checker )
+{
+ return integrate_times(
+ stepper , system , start_state ,
+ boost::begin( times ) , boost::end( times ) , dt , observer , checker );
+}
+
+
+
+
+/*
+* The same functions as above, but without a StepOverflowChecker
+*/
template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
size_t integrate_times(
Stepper stepper , System system , State &start_state ,
@@ -41,6 +125,7 @@ size_t integrate_times(
Observer observer )
{
typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
+ // simply don't use checked_* adapters
return detail::integrate_times(
stepper , system , start_state ,
times_start , times_end , dt ,
@@ -48,8 +133,8 @@ size_t integrate_times(
}
/**
- * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
- */
+* \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+*/
template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
size_t integrate_times(
Stepper stepper , System system , const State &start_state ,
@@ -64,8 +149,8 @@ size_t integrate_times(
}
/**
- * \brief The same function as above, but without observer calls.
- */
+* \brief The same function as above, but with the observation times given as range.
+*/
template< class Stepper , class System , class State , class TimeRange , class Time , class Observer >
size_t integrate_times(
Stepper stepper , System system , State &start_state ,
@@ -78,8 +163,8 @@ size_t integrate_times(
}
/**
- * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
- */
+* \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
+*/
template< class Stepper , class System , class State , class TimeRange , class Time , class Observer >
size_t integrate_times(
Stepper stepper , System system , const State &start_state ,
@@ -88,12 +173,10 @@ size_t integrate_times(
{
return integrate_times(
stepper , system , start_state ,
- boost::begin( times ) , boost::end( times ) , dt , observer );
+ boost::begin( times ) , boost::end( times ) , dt , observer);
}
-
-
/********* DOXYGEN ***********/
/**
@@ -110,6 +193,10 @@ size_t integrate_times(
* If a DenseOutputStepper is provided, the dense output functionality is
* used to call the observer at the given times. The end time of the
* integration is always *(end_time-1).
+ * If a max_step_checker is provided as StepOverflowChecker, a
+ * no_progress_error is thrown if too many steps (default: 500) are
+ * performed without progress, i.e. in between observer calls. If no
+ * checker is provided, no such overflow check is performed.
*
* \param stepper The stepper to be used for numerical integration.
* \param system Function/Functor defining the rhs of the ODE.
@@ -119,6 +206,8 @@ size_t integrate_times(
* \param dt The time step between observer calls, _not_ necessarily the
* time step of the integration.
* \param observer Function/Functor called at equidistant time intervals.
+ * \param checker [optional] Functor to check for step count overflows, if no
+ * checker is provided, no exception is thrown.
* \return The number of steps performed.
*/
diff --git a/boost/numeric/odeint/integrate/max_step_checker.hpp b/boost/numeric/odeint/integrate/max_step_checker.hpp
new file mode 100644
index 0000000000..6808a57bdb
--- /dev/null
+++ b/boost/numeric/odeint/integrate/max_step_checker.hpp
@@ -0,0 +1,114 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/integrate/max_step_checker.hpp
+
+ [begin_description]
+ Throws exception if too many steps are performed.
+ [end_description]
+
+ Copyright 2015 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+
+#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_MAX_STEP_CHECKER_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_INTEGRATE_MAX_STEP_CHECKER_HPP_INCLUDED
+
+#include <stdexcept>
+#include <cstdio>
+
+#include <boost/throw_exception.hpp>
+#include <boost/numeric/odeint/util/odeint_error.hpp>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+/**
+ * \brief A class for performing overflow checks on the step count in integrate functions.
+ *
+ * Provide an instance of this class to integrate functions if you want to throw a runtime error if
+ * too many steps are performed without progress during the integrate routine.
+ */
+class max_step_checker
+{
+public:
+
+protected:
+ const int m_max_steps;
+ int m_steps;
+
+public:
+ /**
+ * \brief Construct the max_step_checker.
+ * max_steps is the maximal number of iterations allowed before runtime_error is thrown.
+ */
+ max_step_checker(const int max_steps = 500)
+ : m_max_steps(max_steps)
+ {
+ reset();
+ }
+
+ /**
+ * \brief Resets the max_step_checker by setting the internal counter to 0.
+ */
+ void reset()
+ {
+ m_steps = 0;
+ }
+
+ /**
+ * \brief Increases the counter and performs the iteration check
+ */
+ void operator()(void)
+ {
+ if( m_steps++ >= m_max_steps )
+ {
+ char error_msg[200];
+ sprintf(error_msg, "Max number of iterations exceeded (%d).", m_max_steps);
+ BOOST_THROW_EXCEPTION( no_progress_error(error_msg) );
+ }
+ }
+};
+
+
+/**
+ * \brief A class for performing overflow checks on the failed step count in step size adjustments.
+ *
+ * Used internally within the dense output stepper and integrate routines.
+ */
+class failed_step_checker : public max_step_checker
+{
+
+public:
+ /**
+ * \brief Construct the failed_step_checker.
+ * max_steps is the maximal number of iterations allowed before runtime_error is thrown.
+ */
+ failed_step_checker(const int max_steps = 500)
+ : max_step_checker(max_steps)
+ {}
+
+ /**
+ * \brief Increases the counter and performs the iteration check
+ */
+ void operator()(void)
+ {
+ if( m_steps++ >= m_max_steps )
+ {
+ char error_msg[200];
+ sprintf(error_msg, "Max number of iterations exceeded (%d). A new step size was not found.", m_max_steps);
+ BOOST_THROW_EXCEPTION( step_adjustment_error(error_msg) );
+ }
+ }
+};
+
+} // namespace odeint
+} // namespace numeric
+} // namespace boost
+
+#endif \ No newline at end of file
diff --git a/boost/numeric/odeint/stepper/bulirsch_stoer.hpp b/boost/numeric/odeint/stepper/bulirsch_stoer.hpp
index e71008a993..4b908333ba 100644
--- a/boost/numeric/odeint/stepper/bulirsch_stoer.hpp
+++ b/boost/numeric/odeint/stepper/bulirsch_stoer.hpp
@@ -90,9 +90,11 @@ public:
bulirsch_stoer(
value_type eps_abs = 1E-6 , value_type eps_rel = 1E-6 ,
- value_type factor_x = 1.0 , value_type factor_dxdt = 1.0 )
+ value_type factor_x = 1.0 , value_type factor_dxdt = 1.0 ,
+ time_type max_dt = static_cast<time_type>(0))
: m_error_checker( eps_abs , eps_rel , factor_x, factor_dxdt ) , m_midpoint() ,
m_last_step_rejected( false ) , m_first( true ) ,
+ m_max_dt(max_dt) ,
m_interval_sequence( m_k_max+1 ) ,
m_coeff( m_k_max+1 ) ,
m_cost( m_k_max+1 ) ,
@@ -189,6 +191,14 @@ public:
template< class System , class StateIn , class DerivIn , class StateOut >
controlled_step_result try_step( System system , const StateIn &in , const DerivIn &dxdt , time_type &t , StateOut &out , time_type &dt )
{
+ if( m_max_dt != static_cast<time_type>(0) && detail::less_with_sign(m_max_dt, dt, dt) )
+ {
+ // given step size is bigger then max_dt
+ // set limit and return fail
+ dt = m_max_dt;
+ return fail;
+ }
+
BOOST_USING_STD_MIN();
BOOST_USING_STD_MAX();
@@ -311,6 +321,11 @@ public:
if( !m_last_step_rejected || boost::numeric::odeint::detail::less_with_sign(new_h, dt, dt) )
{
+ // limit step size
+ if( m_max_dt != static_cast<time_type>(0) )
+ {
+ new_h = detail::min_abs(m_max_dt, new_h);
+ }
m_dt_last = new_h;
dt = new_h;
}
@@ -474,6 +489,7 @@ private:
time_type m_dt_last;
time_type m_t_last;
+ time_type m_max_dt;
size_t m_current_k_opt;
@@ -493,7 +509,7 @@ private:
state_table_type m_table; // sequence of states for extrapolation
- const value_type STEPFAC1 , STEPFAC2 , STEPFAC3 , STEPFAC4 , KFAC1 , KFAC2;
+ value_type STEPFAC1 , STEPFAC2 , STEPFAC3 , STEPFAC4 , KFAC1 , KFAC2;
};
diff --git a/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp b/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp
index 3018524ec9..d876ca3d36 100644
--- a/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp
+++ b/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp
@@ -6,7 +6,7 @@
Implementaiton of the Burlish-Stoer method with dense output
[end_description]
- Copyright 2011-2013 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Copyright 2011-2013 Karsten Ahnert
Copyright 2012 Christoph Koke
@@ -43,6 +43,8 @@
#include <boost/numeric/odeint/util/resizer.hpp>
#include <boost/numeric/odeint/util/unit_helper.hpp>
+#include <boost/numeric/odeint/integrate/max_step_checker.hpp>
+
#include <boost/type_traits.hpp>
@@ -97,8 +99,10 @@ public:
bulirsch_stoer_dense_out(
value_type eps_abs = 1E-6 , value_type eps_rel = 1E-6 ,
value_type factor_x = 1.0 , value_type factor_dxdt = 1.0 ,
+ time_type max_dt = static_cast<time_type>(0) ,
bool control_interpolation = false )
- : m_error_checker( eps_abs , eps_rel , factor_x, factor_dxdt ) ,
+ : m_error_checker( eps_abs , eps_rel , factor_x, factor_dxdt ) ,
+ m_max_dt(max_dt) ,
m_control_interpolation( control_interpolation) ,
m_last_step_rejected( false ) , m_first( true ) ,
m_current_state_x1( true ) ,
@@ -149,6 +153,14 @@ public:
template< class System , class StateIn , class DerivIn , class StateOut , class DerivOut >
controlled_step_result try_step( System system , const StateIn &in , const DerivIn &dxdt , time_type &t , StateOut &out , DerivOut &dxdt_new , time_type &dt )
{
+ if( m_max_dt != static_cast<time_type>(0) && detail::less_with_sign(m_max_dt, dt, dt) )
+ {
+ // given step size is bigger then max_dt
+ // set limit and return fail
+ dt = m_max_dt;
+ return fail;
+ }
+
BOOST_USING_STD_MIN();
BOOST_USING_STD_MAX();
using std::pow;
@@ -275,7 +287,14 @@ public:
}
//set next stepsize
if( !m_last_step_rejected || (new_h < dt) )
+ {
+ // limit step size
+ if( m_max_dt != static_cast<time_type>(0) )
+ {
+ new_h = detail::min_abs(m_max_dt, new_h);
+ }
dt = new_h;
+ }
m_last_step_rejected = reject;
if( reject )
@@ -301,23 +320,20 @@ public:
template< class System >
std::pair< time_type , time_type > do_step( System system )
{
- const size_t max_count = 1000;
-
if( m_first )
{
typename odeint::unwrap_reference< System >::type &sys = system;
sys( get_current_state() , get_current_deriv() , m_t );
}
+ failed_step_checker fail_checker; // to throw a runtime_error if step size adjustment fails
controlled_step_result res = fail;
m_t_last = m_t;
- size_t count = 0;
while( res == fail )
{
res = try_step( system , get_current_state() , get_current_deriv() , m_t , get_old_state() , get_old_deriv() , m_dt );
m_first = false;
- if( count++ == max_count )
- throw std::overflow_error( "bulirsch_stoer : too much iterations!");
+ fail_checker(); // check for overflow of failed steps
}
toggle_current_state();
return std::make_pair( m_t_last , m_t );
@@ -412,15 +428,15 @@ private:
BOOST_USING_STD_MAX();
using std::pow;
- value_type expo=1.0/(m_interval_sequence[k-1]);
+ value_type expo = static_cast<value_type>(1)/(m_interval_sequence[k-1]);
value_type facmin = pow BOOST_PREVENT_MACRO_SUBSTITUTION( STEPFAC3 , expo );
value_type fac;
if (error == 0.0)
- fac=1.0/facmin;
+ fac = static_cast<value_type>(1)/facmin;
else
{
fac = STEPFAC2 / pow BOOST_PREVENT_MACRO_SUBSTITUTION( error / STEPFAC1 , expo );
- fac = max BOOST_PREVENT_MACRO_SUBSTITUTION( facmin/STEPFAC4 , min BOOST_PREVENT_MACRO_SUBSTITUTION( 1.0/facmin , fac ) );
+ fac = max BOOST_PREVENT_MACRO_SUBSTITUTION( static_cast<value_type>( facmin/STEPFAC4 ) , min BOOST_PREVENT_MACRO_SUBSTITUTION( static_cast<value_type>(static_cast<value_type>(1)/facmin) , fac ) );
}
return h*fac;
}
@@ -646,6 +662,8 @@ private:
default_error_checker< value_type, algebra_type , operations_type > m_error_checker;
modified_midpoint_dense_out< state_type , value_type , deriv_type , time_type , algebra_type , operations_type , resizer_type > m_midpoint;
+ time_type m_max_dt;
+
bool m_control_interpolation;
bool m_last_step_rejected;
@@ -684,7 +702,7 @@ private:
//wrapped_state_type m_a1 , m_a2 , m_a3 , m_a4;
- const value_type STEPFAC1 , STEPFAC2 , STEPFAC3 , STEPFAC4 , KFAC1 , KFAC2;
+ value_type STEPFAC1 , STEPFAC2 , STEPFAC3 , STEPFAC4 , KFAC1 , KFAC2;
};
diff --git a/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp b/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp
index 509192482c..8ae627fe1c 100644
--- a/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp
+++ b/boost/numeric/odeint/stepper/controlled_runge_kutta.hpp
@@ -6,7 +6,7 @@
[end_description]
Copyright 2010-2013 Karsten Ahnert
- Copyright 2010-2013 Mario Mulansky
+ Copyright 2010-2015 Mario Mulansky
Copyright 2012 Christoph Koke
Distributed under the Boost Software License, Version 1.0.
@@ -33,6 +33,7 @@
#include <boost/numeric/odeint/util/state_wrapper.hpp>
#include <boost/numeric/odeint/util/is_resizeable.hpp>
#include <boost/numeric/odeint/util/resizer.hpp>
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
#include <boost/numeric/odeint/algebra/range_algebra.hpp>
#include <boost/numeric/odeint/algebra/default_operations.hpp>
@@ -64,23 +65,24 @@ public:
value_type eps_abs = static_cast< value_type >( 1.0e-6 ) ,
value_type eps_rel = static_cast< value_type >( 1.0e-6 ) ,
value_type a_x = static_cast< value_type >( 1 ) ,
- value_type a_dxdt = static_cast< value_type >( 1 ) )
- : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt )
+ value_type a_dxdt = static_cast< value_type >( 1 ))
+ : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt )
{ }
- template< class State , class Deriv , class Err , class Time >
+ template< class State , class Deriv , class Err, class Time >
value_type error( const State &x_old , const Deriv &dxdt_old , Err &x_err , Time dt ) const
{
return error( algebra_type() , x_old , dxdt_old , x_err , dt );
}
- template< class State , class Deriv , class Err , class Time >
+ template< class State , class Deriv , class Err, class Time >
value_type error( algebra_type &algebra , const State &x_old , const Deriv &dxdt_old , Err &x_err , Time dt ) const
{
+ using std::abs;
// this overwrites x_err !
algebra.for_each3( x_err , x_old , dxdt_old ,
- typename operations_type::template rel_error< value_type >( m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt * get_unit_value( dt ) ) );
+ typename operations_type::template rel_error< value_type >( m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt * abs(get_unit_value( dt )) ) );
// value_type res = algebra.reduce( x_err ,
// typename operations_type::template maximum< value_type >() , static_cast< value_type >( 0 ) );
@@ -97,9 +99,73 @@ private:
};
+template< typename Value, typename Time >
+class default_step_adjuster
+{
+public:
+ typedef Time time_type;
+ typedef Value value_type;
+
+ default_step_adjuster(const time_type max_dt=static_cast<time_type>(0))
+ : m_max_dt(max_dt)
+ {}
+ time_type decrease_step(time_type dt, const value_type error, const int error_order) const
+ {
+ // returns the decreased time step
+ BOOST_USING_STD_MIN();
+ BOOST_USING_STD_MAX();
+ using std::pow;
+ dt *= max
+ BOOST_PREVENT_MACRO_SUBSTITUTION(
+ static_cast<value_type>( static_cast<value_type>(9) / static_cast<value_type>(10) *
+ pow(error, static_cast<value_type>(-1) / (error_order - 1))),
+ static_cast<value_type>( static_cast<value_type>(1) / static_cast<value_type> (5)));
+ if(m_max_dt != static_cast<time_type >(0))
+ // limit to maximal stepsize even when decreasing
+ dt = detail::min_abs(dt, m_max_dt);
+ return dt;
+ }
+
+ time_type increase_step(time_type dt, value_type error, const int stepper_order) const
+ {
+ // returns the increased time step
+ BOOST_USING_STD_MIN();
+ BOOST_USING_STD_MAX();
+ using std::pow;
+
+ // adjust the size if dt is smaller than max_dt (providede max_dt is not zero)
+ if(error < 0.5)
+ {
+ // error should be > 0
+ error = max BOOST_PREVENT_MACRO_SUBSTITUTION (
+ static_cast<value_type>( pow( static_cast<value_type>(5.0) , -static_cast<value_type>(stepper_order) ) ) ,
+ error);
+ time_type dt_old = dt;
+ //error too small - increase dt and keep the evolution and limit scaling factor to 5.0
+ dt *= static_cast<value_type>(9)/static_cast<value_type>(10) *
+ pow(error, static_cast<value_type>(-1) / stepper_order);
+ if(m_max_dt != static_cast<time_type >(0))
+ // limit to maximal stepsize
+ dt = detail::min_abs(dt, m_max_dt);
+ }
+ return dt;
+ }
+
+ bool check_step_size_limit(const time_type dt)
+ {
+ if(m_max_dt != static_cast<time_type >(0))
+ return detail::less_eq_with_sign(dt, m_max_dt, dt);
+ return true;
+ }
+
+ time_type get_max_dt() { return m_max_dt; }
+
+private:
+ time_type m_max_dt;
+};
@@ -109,8 +175,10 @@ private:
template<
class ErrorStepper ,
class ErrorChecker = default_error_checker< typename ErrorStepper::value_type ,
-typename ErrorStepper::algebra_type ,
-typename ErrorStepper::operations_type > ,
+ typename ErrorStepper::algebra_type ,
+ typename ErrorStepper::operations_type > ,
+class StepAdjuster = default_step_adjuster< typename ErrorStepper::value_type ,
+ typename ErrorStepper::time_type > ,
class Resizer = typename ErrorStepper::resizer_type ,
class ErrorStepperCategory = typename ErrorStepper::stepper_category
>
@@ -139,11 +207,13 @@ class controlled_runge_kutta ;
* \tparam Resizer The resizer policy type.
*/
template<
-class ErrorStepper ,
-class ErrorChecker ,
+class ErrorStepper,
+class ErrorChecker,
+class StepAdjuster,
class Resizer
>
-class controlled_runge_kutta< ErrorStepper , ErrorChecker , Resizer , explicit_error_stepper_tag >
+class controlled_runge_kutta< ErrorStepper , ErrorChecker , StepAdjuster, Resizer ,
+ explicit_error_stepper_tag >
{
public:
@@ -157,13 +227,15 @@ public:
typedef typename stepper_type::operations_type operations_type;
typedef Resizer resizer_type;
typedef ErrorChecker error_checker_type;
+ typedef StepAdjuster step_adjuster_type;
typedef explicit_controlled_stepper_tag stepper_category;
#ifndef DOXYGEN_SKIP
typedef typename stepper_type::wrapped_state_type wrapped_state_type;
typedef typename stepper_type::wrapped_deriv_type wrapped_deriv_type;
- typedef controlled_runge_kutta< ErrorStepper , ErrorChecker , Resizer , explicit_error_stepper_tag > controlled_stepper_type;
+ typedef controlled_runge_kutta< ErrorStepper , ErrorChecker , StepAdjuster ,
+ Resizer , explicit_error_stepper_tag > controlled_stepper_type;
#endif //DOXYGEN_SKIP
@@ -174,9 +246,10 @@ public:
*/
controlled_runge_kutta(
const error_checker_type &error_checker = error_checker_type( ) ,
+ const step_adjuster_type &step_adjuster = step_adjuster_type() ,
const stepper_type &stepper = stepper_type( )
)
- : m_stepper( stepper ) , m_error_checker( error_checker )
+ : m_stepper(stepper), m_error_checker(error_checker) , m_step_adjuster(step_adjuster)
{ }
@@ -338,59 +411,35 @@ public:
template< class System , class StateIn , class DerivIn , class StateOut >
controlled_step_result try_step( System system , const StateIn &in , const DerivIn &dxdt , time_type &t , StateOut &out , time_type &dt )
{
- BOOST_USING_STD_MIN();
- BOOST_USING_STD_MAX();
- using std::pow;
+ if( !m_step_adjuster.check_step_size_limit(dt) )
+ {
+ // given dt was above step size limit - adjust and return fail;
+ dt = m_step_adjuster.get_max_dt();
+ return fail;
+ }
m_xerr_resizer.adjust_size( in , detail::bind( &controlled_runge_kutta::template resize_m_xerr_impl< StateIn > , detail::ref( *this ) , detail::_1 ) );
// do one step with error calculation
m_stepper.do_step( system , in , dxdt , t , out , dt , m_xerr.m_v );
- m_max_rel_error = m_error_checker.error( m_stepper.algebra() , in , dxdt , m_xerr.m_v , dt );
+ value_type max_rel_err = m_error_checker.error( m_stepper.algebra() , in , dxdt , m_xerr.m_v , dt );
- if( m_max_rel_error > 1.0 )
+ if( max_rel_err > 1.0 )
{
- // error too large - decrease dt ,limit scaling factor to 0.2 and reset state
- dt *= max BOOST_PREVENT_MACRO_SUBSTITUTION ( static_cast<value_type>( static_cast<value_type>(9)/static_cast<value_type>(10) *
- pow( m_max_rel_error , static_cast<value_type>(-1) / ( m_stepper.error_order() - 1 ) ) ) ,
- static_cast<value_type>( static_cast<value_type>(1)/static_cast<value_type> (5) ) );
+ // error too big, decrease step size and reject this step
+ dt = m_step_adjuster.decrease_step(dt, max_rel_err, m_stepper.error_order());
return fail;
- }
- else
+ } else
{
- if( m_max_rel_error < 0.5 )
- {
- // error should be > 0
- m_max_rel_error = max BOOST_PREVENT_MACRO_SUBSTITUTION (
- static_cast<value_type>( pow( static_cast<value_type>(5.0) , -static_cast<value_type>(m_stepper.stepper_order()) ) ) ,
- m_max_rel_error );
- //error too small - increase dt and keep the evolution and limit scaling factor to 5.0
- t += dt;
- dt *= static_cast<value_type>(9)/static_cast<value_type>(10) * pow( m_max_rel_error ,
- static_cast<value_type>(-1) / m_stepper.stepper_order() );
- return success;
- }
- else
- {
- t += dt;
- return success;
- }
+ // otherwise, increase step size and accept
+ t += dt;
+ dt = m_step_adjuster.increase_step(dt, max_rel_err, m_stepper.stepper_order());
+ return success;
}
}
/**
- * \brief Returns the error of the last step.
- *
- * returns The last error of the step.
- */
- value_type last_error( void ) const
- {
- return m_max_rel_error;
- }
-
-
- /**
* \brief Adjust the size of all temporaries in the stepper manually.
* \param x A state from which the size of the temporaries to be resized is deduced.
*/
@@ -455,6 +504,7 @@ private:
stepper_type m_stepper;
error_checker_type m_error_checker;
+ step_adjuster_type m_step_adjuster;
resizer_type m_dxdt_resizer;
resizer_type m_xerr_resizer;
@@ -463,7 +513,6 @@ private:
wrapped_deriv_type m_dxdt;
wrapped_state_type m_xerr;
wrapped_state_type m_xnew;
- value_type m_max_rel_error;
};
@@ -498,9 +547,10 @@ private:
template<
class ErrorStepper ,
class ErrorChecker ,
+class StepAdjuster ,
class Resizer
>
-class controlled_runge_kutta< ErrorStepper , ErrorChecker , Resizer , explicit_error_stepper_fsal_tag >
+class controlled_runge_kutta< ErrorStepper , ErrorChecker , StepAdjuster , Resizer , explicit_error_stepper_fsal_tag >
{
public:
@@ -514,13 +564,14 @@ public:
typedef typename stepper_type::operations_type operations_type;
typedef Resizer resizer_type;
typedef ErrorChecker error_checker_type;
+ typedef StepAdjuster step_adjuster_type;
typedef explicit_controlled_stepper_fsal_tag stepper_category;
#ifndef DOXYGEN_SKIP
typedef typename stepper_type::wrapped_state_type wrapped_state_type;
typedef typename stepper_type::wrapped_deriv_type wrapped_deriv_type;
- typedef controlled_runge_kutta< ErrorStepper , ErrorChecker , Resizer , explicit_error_stepper_tag > controlled_stepper_type;
+ typedef controlled_runge_kutta< ErrorStepper , ErrorChecker , StepAdjuster , Resizer , explicit_error_stepper_tag > controlled_stepper_type;
#endif // DOXYGEN_SKIP
/**
@@ -530,9 +581,10 @@ public:
*/
controlled_runge_kutta(
const error_checker_type &error_checker = error_checker_type() ,
+ const step_adjuster_type &step_adjuster = step_adjuster_type() ,
const stepper_type &stepper = stepper_type()
)
- : m_stepper( stepper ) , m_error_checker( error_checker ) ,
+ : m_stepper( stepper ) , m_error_checker( error_checker ) , m_step_adjuster(step_adjuster) ,
m_first_call( true )
{ }
@@ -699,10 +751,12 @@ public:
controlled_step_result try_step( System system , const StateIn &in , const DerivIn &dxdt_in , time_type &t ,
StateOut &out , DerivOut &dxdt_out , time_type &dt )
{
- BOOST_USING_STD_MIN();
- BOOST_USING_STD_MAX();
-
- using std::pow;
+ if( !m_step_adjuster.check_step_size_limit(dt) )
+ {
+ // given dt was above step size limit - adjust and return fail;
+ dt = m_step_adjuster.get_max_dt();
+ return fail;
+ }
m_xerr_resizer.adjust_size( in , detail::bind( &controlled_runge_kutta::template resize_m_xerr_impl< StateIn > , detail::ref( *this ) , detail::_1 ) );
@@ -715,29 +769,14 @@ public:
if( max_rel_err > 1.0 )
{
- // error too large - decrease dt ,limit scaling factor to 0.2 and reset state
- dt *= max BOOST_PREVENT_MACRO_SUBSTITUTION ( static_cast<value_type>( static_cast<value_type>(9)/static_cast<value_type>(10) *
- pow( max_rel_err , static_cast<value_type>(-1) / ( m_stepper.error_order() - 1 ) ) ) ,
- static_cast<value_type>( static_cast<value_type>(1)/static_cast<value_type> (5)) );
+ // error too big, decrease step size and reject this step
+ dt = m_step_adjuster.decrease_step(dt, max_rel_err, m_stepper.error_order());
return fail;
}
- else
- {
- if( max_rel_err < 0.5 )
- { //error too small - increase dt and keep the evolution and limit scaling factor to 5.0
- // error should be > 0
- max_rel_err = max BOOST_PREVENT_MACRO_SUBSTITUTION ( static_cast<value_type>( pow( static_cast<value_type>(5.0) , -static_cast<value_type>(m_stepper.stepper_order()) ) ) ,
- max_rel_err );
- t += dt;
- dt *= static_cast<value_type>( static_cast<value_type>(9)/static_cast<value_type>(10) * pow( max_rel_err , static_cast<value_type>(-1) / m_stepper.stepper_order() ) );
- return success;
- }
- else
- {
- t += dt;
- return success;
- }
- }
+ // otherwise, increase step size and accept
+ t += dt;
+ dt = m_step_adjuster.increase_step(dt, max_rel_err, m_stepper.stepper_order());
+ return success;
}
@@ -863,6 +902,7 @@ private:
stepper_type m_stepper;
error_checker_type m_error_checker;
+ step_adjuster_type m_step_adjuster;
resizer_type m_dxdt_resizer;
resizer_type m_xerr_resizer;
@@ -890,12 +930,14 @@ private:
* It is used by the controlled_runge_kutta steppers.
*
* \tparam Value The value type.
+ * \tparam Time The time type.
* \tparam Algebra The algebra type.
* \tparam Operations The operations type.
*/
/**
- * \fn default_error_checker( value_type eps_abs , value_type eps_rel , value_type a_x , value_type a_dxdt )
+ * \fn default_error_checker( value_type eps_abs , value_type eps_rel , value_type a_x , value_type a_dxdt ,
+ * time_type max_dt)
* \brief Constructs the error checker.
*
* The error is calculated as follows: ????
@@ -904,10 +946,11 @@ private:
* \param eps_rel Relative tolerance level.
* \param a_x Factor for the weight of the state.
* \param a_dxdt Factor for the weight of the derivative.
+ * \param max_dt Maximum allowed step size.
*/
/**
- * \fn error( const State &x_old , const Deriv &dxdt_old , Err &x_err , Time dt ) const
+ * \fn error( const State &x_old , const Deriv &dxdt_old , Err &x_err , time_type dt ) const
* \brief Calculates the error level.
*
* If the returned error level is greater than 1, the estimated error was
@@ -922,7 +965,7 @@ private:
*/
/**
- * \fn error( algebra_type &algebra , const State &x_old , const Deriv &dxdt_old , Err &x_err , Time dt ) const
+ * \fn error( algebra_type &algebra , const State &x_old , const Deriv &dxdt_old , Err &x_err , time_type dt ) const
* \brief Calculates the error level using a given algebra.
*
* If the returned error level is greater than 1, the estimated error was
@@ -937,6 +980,31 @@ private:
* \return error
*/
+ /**
+ * \fn time_type decrease_step(const time_type dt, const value_type error, const int error_order)
+ * \brief Returns a decreased step size based on the given error and order
+ *
+ * Calculates a new smaller step size based on the given error and its order.
+ *
+ * \param dt The old step size.
+ * \param error The computed error estimate.
+ * \param error_order The error order of the stepper.
+ * \return dt_new The new, reduced step size.
+ */
+
+ /**
+ * \fn time_type increase_step(const time_type dt, const value_type error, const int error_order)
+ * \brief Returns an increased step size based on the given error and order.
+ *
+ * Calculates a new bigger step size based on the given error and its order. If max_dt != 0, the
+ * new step size is limited to max_dt.
+ *
+ * \param dt The old step size.
+ * \param error The computed error estimate.
+ * \param error_order The order of the stepper.
+ * \return dt_new The new, increased step size.
+ */
+
} // odeint
} // numeric
diff --git a/boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp b/boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp
index b685d92bcf..94abc5af99 100644
--- a/boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp
+++ b/boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp
@@ -8,7 +8,7 @@
[end_description]
Copyright 2011-2013 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Copyright 2012 Christoph Koke
Distributed under the Boost Software License, Version 1.0.
@@ -37,6 +37,8 @@
#include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
#include <boost/numeric/odeint/stepper/stepper_categories.hpp>
+#include <boost/numeric/odeint/integrate/max_step_checker.hpp>
+
namespace boost {
namespace numeric {
namespace odeint {
@@ -206,6 +208,15 @@ public:
return m_t_old;
}
+ /**
+ * \brief Returns the current time step.
+ * \return dt.
+ */
+ time_type current_time_step( void ) const
+ {
+ return m_dt;
+ }
+
private:
@@ -312,8 +323,6 @@ public:
template< class System >
std::pair< time_type , time_type > do_step( System system )
{
- const size_t max_count = 1000;
-
if( !m_is_deriv_initialized )
{
typename odeint::unwrap_reference< System >::type &sys = system;
@@ -321,15 +330,14 @@ public:
m_is_deriv_initialized = true;
}
+ failed_step_checker fail_checker; // to throw a runtime_error if step size adjustment fails
controlled_step_result res = fail;
m_t_old = m_t;
- size_t count = 0;
do
{
res = m_stepper.try_step( system , get_current_state() , get_current_deriv() , m_t ,
get_old_state() , get_old_deriv() , m_dt );
- if( count++ == max_count )
- BOOST_THROW_EXCEPTION( std::overflow_error( "dense_output_controlled_explicit : too much iterations!") );
+ fail_checker(); // check for overflow of failed steps
}
while( res == fail );
toggle_current_state();
diff --git a/boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp b/boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp
index 54b7746c6e..bad2bedfef 100644
--- a/boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp
+++ b/boost/numeric/odeint/stepper/generation/generation_controlled_runge_kutta.hpp
@@ -34,15 +34,23 @@ struct controller_factory< Stepper , controlled_runge_kutta< Stepper > >
typedef Stepper stepper_type;
typedef controlled_runge_kutta< stepper_type > controller_type;
typedef typename controller_type::error_checker_type error_checker_type;
+ typedef typename controller_type::step_adjuster_type step_adjuster_type;
typedef typename stepper_type::value_type value_type;
+ typedef typename stepper_type::value_type time_type;
controller_type operator()( value_type abs_error , value_type rel_error , const stepper_type &stepper )
{
- return controller_type( error_checker_type( abs_error , rel_error ) , stepper );
+ return controller_type( error_checker_type( abs_error , rel_error ) ,
+ step_adjuster_type() , stepper );
}
-};
-
+ controller_type operator()( value_type abs_error , value_type rel_error ,
+ time_type max_dt, const stepper_type &stepper )
+ {
+ return controller_type( error_checker_type( abs_error , rel_error ) ,
+ step_adjuster_type(max_dt) , stepper );
+ }
+};
} // odeint
diff --git a/boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp b/boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp
index 214d09c1a4..276358a12e 100644
--- a/boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp
+++ b/boost/numeric/odeint/stepper/generation/generation_dense_output_runge_kutta.hpp
@@ -33,12 +33,23 @@ struct dense_output_factory< Stepper , dense_output_runge_kutta< controlled_rung
typedef Stepper stepper_type;
typedef controlled_runge_kutta< stepper_type > controller_type;
typedef typename controller_type::error_checker_type error_checker_type;
+ typedef typename controller_type::step_adjuster_type step_adjuster_type;
typedef typename stepper_type::value_type value_type;
+ typedef typename stepper_type::time_type time_type;
typedef dense_output_runge_kutta< controller_type > dense_output_type;
dense_output_type operator()( value_type abs_error , value_type rel_error , const stepper_type &stepper )
{
- return dense_output_type( controller_type( error_checker_type( abs_error , rel_error ) , stepper ) );
+ return dense_output_type( controller_type( error_checker_type( abs_error , rel_error ) ,
+ step_adjuster_type() , stepper ) );
+ }
+
+ dense_output_type operator()( value_type abs_error , value_type rel_error ,
+ time_type max_dt , const stepper_type &stepper )
+ {
+ return dense_output_type(
+ controller_type( error_checker_type( abs_error , rel_error) ,
+ step_adjuster_type( max_dt ) , stepper ) );
}
};
diff --git a/boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp b/boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp
index d5322c8d73..366cb5e9c4 100644
--- a/boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp
+++ b/boost/numeric/odeint/stepper/generation/generation_rosenbrock4.hpp
@@ -54,12 +54,19 @@ struct dense_output_factory< Stepper , rosenbrock4_dense_output< rosenbrock4_con
typedef Stepper stepper_type;
typedef rosenbrock4_controller< stepper_type > controller_type;
typedef typename stepper_type::value_type value_type;
+ typedef typename stepper_type::time_type time_type;
typedef rosenbrock4_dense_output< controller_type > dense_output_type;
dense_output_type operator()( value_type abs_error , value_type rel_error , const stepper_type &stepper )
{
return dense_output_type( controller_type( abs_error , rel_error , stepper ) );
}
+
+ dense_output_type operator()( value_type abs_error , value_type rel_error ,
+ time_type max_dt, const stepper_type &stepper )
+ {
+ return dense_output_type( controller_type( abs_error , rel_error , max_dt , stepper ) );
+ }
};
diff --git a/boost/numeric/odeint/stepper/generation/make_controlled.hpp b/boost/numeric/odeint/stepper/generation/make_controlled.hpp
index 603978fec8..61bc8f1920 100644
--- a/boost/numeric/odeint/stepper/generation/make_controlled.hpp
+++ b/boost/numeric/odeint/stepper/generation/make_controlled.hpp
@@ -43,6 +43,15 @@ struct controller_factory
{
return Controller( abs_error , rel_error , stepper );
}
+
+ Controller operator()(
+ typename Stepper::value_type abs_error ,
+ typename Stepper::value_type rel_error ,
+ typename Stepper::time_type max_dt ,
+ const Stepper &stepper )
+ {
+ return Controller( abs_error , rel_error , max_dt, stepper );
+ }
};
@@ -72,6 +81,19 @@ typename result_of::make_controlled< Stepper >::type make_controlled(
}
+template< class Stepper >
+typename result_of::make_controlled< Stepper >::type make_controlled(
+ typename Stepper::value_type abs_error ,
+ typename Stepper::value_type rel_error ,
+ typename Stepper::time_type max_dt ,
+ const Stepper & stepper = Stepper() )
+{
+ typedef Stepper stepper_type;
+ typedef typename result_of::make_controlled< stepper_type >::type controller_type;
+ typedef controller_factory< stepper_type , controller_type > factory_type;
+ factory_type factory;
+ return factory( abs_error , rel_error , max_dt, stepper );
+}
} // odeint
} // numeric
diff --git a/boost/numeric/odeint/stepper/generation/make_dense_output.hpp b/boost/numeric/odeint/stepper/generation/make_dense_output.hpp
index a28e31b5d2..fff3590525 100644
--- a/boost/numeric/odeint/stepper/generation/make_dense_output.hpp
+++ b/boost/numeric/odeint/stepper/generation/make_dense_output.hpp
@@ -39,6 +39,15 @@ struct dense_output_factory
{
return DenseOutput( abs_error , rel_error , stepper );
}
+
+ DenseOutput operator()(
+ typename Stepper::value_type abs_error ,
+ typename Stepper::value_type rel_error ,
+ typename Stepper::time_type max_dt ,
+ const Stepper &stepper )
+ {
+ return DenseOutput( abs_error , rel_error , max_dt , stepper );
+ }
};
@@ -68,6 +77,19 @@ typename result_of::make_dense_output< Stepper >::type make_dense_output(
}
+template< class Stepper >
+typename result_of::make_dense_output< Stepper >::type make_dense_output(
+ typename Stepper::value_type abs_error ,
+ typename Stepper::value_type rel_error ,
+ typename Stepper::time_type max_dt ,
+ const Stepper &stepper = Stepper() )
+{
+ typedef Stepper stepper_type;
+ typedef typename result_of::make_dense_output< stepper_type >::type dense_output_type;
+ typedef dense_output_factory< stepper_type , dense_output_type > factory_type;
+ factory_type factory;
+ return factory( abs_error , rel_error , max_dt, stepper );
+}
} // odeint
diff --git a/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp b/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp
index df4e6c48b6..0e5edd32c0 100644
--- a/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp
+++ b/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp
@@ -27,6 +27,7 @@
#include <boost/numeric/odeint/util/copy.hpp>
#include <boost/numeric/odeint/util/is_resizeable.hpp>
+#include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
#include <boost/numeric/odeint/stepper/rosenbrock4.hpp>
@@ -55,12 +56,20 @@ public:
typedef rosenbrock4_controller< Stepper > controller_type;
- rosenbrock4_controller( value_type atol = 1.0e-6 , value_type rtol = 1.0e-6 , const stepper_type &stepper = stepper_type() )
- : m_stepper( stepper ) , m_atol( atol ) , m_rtol( rtol ) ,
- m_first_step( true ) , m_err_old( 0.0 ) , m_dt_old( 0.0 ) ,
- m_last_rejected( false )
+ rosenbrock4_controller( value_type atol = 1.0e-6 , value_type rtol = 1.0e-6 ,
+ const stepper_type &stepper = stepper_type() )
+ : m_stepper( stepper ) , m_atol( atol ) , m_rtol( rtol ) ,
+ m_max_dt( static_cast<time_type>(0) ) ,
+ m_first_step( true ) , m_err_old( 0.0 ) , m_dt_old( 0.0 ) ,
+ m_last_rejected( false )
{ }
+ rosenbrock4_controller( value_type atol, value_type rtol, time_type max_dt,
+ const stepper_type &stepper = stepper_type() )
+ : m_stepper( stepper ) , m_atol( atol ) , m_rtol( rtol ) , m_max_dt( max_dt ) ,
+ m_first_step( true ) , m_err_old( 0.0 ) , m_dt_old( 0.0 ) ,
+ m_last_rejected( false )
+ { }
value_type error( const state_type &x , const state_type &xold , const state_type &xerr )
{
@@ -104,6 +113,14 @@ public:
boost::numeric::odeint::controlled_step_result
try_step( System sys , const state_type &x , time_type &t , state_type &xout , time_type &dt )
{
+ if( m_max_dt != static_cast<time_type>(0) && detail::less_with_sign(m_max_dt, dt, dt) )
+ {
+ // given step size is bigger then max_dt
+ // set limit and return fail
+ dt = m_max_dt;
+ return fail;
+ }
+
BOOST_USING_STD_MIN();
BOOST_USING_STD_MAX();
using std::pow;
@@ -142,7 +159,11 @@ public:
min BOOST_PREVENT_MACRO_SUBSTITUTION ( dt_new , dt ) :
max BOOST_PREVENT_MACRO_SUBSTITUTION ( dt_new , dt ) );
t += dt;
- dt = dt_new;
+ // limit step size to max_dt
+ if( m_max_dt != static_cast<time_type>(0) )
+ {
+ dt = detail::min_abs(m_max_dt, dt_new);
+ }
m_last_rejected = false;
return success;
}
@@ -198,6 +219,7 @@ private:
wrapped_state_type m_xerr;
wrapped_state_type m_xnew;
value_type m_atol , m_rtol;
+ time_type m_max_dt;
bool m_first_step;
value_type m_err_old , m_dt_old;
bool m_last_rejected;
diff --git a/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp b/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp
index 8a866c562e..6695ba6a97 100644
--- a/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp
+++ b/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp
@@ -7,7 +7,7 @@
[end_description]
Copyright 2011-2012 Karsten Ahnert
- Copyright 2011-2012 Mario Mulansky
+ Copyright 2011-2015 Mario Mulansky
Copyright 2012 Christoph Koke
Distributed under the Boost Software License, Version 1.0.
@@ -27,6 +27,8 @@
#include <boost/numeric/odeint/stepper/rosenbrock4_controller.hpp>
#include <boost/numeric/odeint/util/is_resizeable.hpp>
+#include <boost/numeric/odeint/integrate/max_step_checker.hpp>
+
namespace boost {
namespace numeric {
@@ -73,16 +75,13 @@ public:
template< class System >
std::pair< time_type , time_type > do_step( System system )
{
- const size_t max_count = 1000;
-
+ failed_step_checker fail_checker; // to throw a runtime_error if step size adjustment fails
controlled_step_result res = fail;
m_t_old = m_t;
- size_t count = 0;
do
{
res = m_stepper.try_step( system , get_current_state() , m_t , get_old_state() , m_dt );
- if( count++ == max_count )
- throw std::overflow_error( "rosenbrock4 : too much iterations!");
+ fail_checker(); // check for overflow of failed steps
}
while( res == fail );
m_stepper.stepper().prepare_dense_output();
diff --git a/boost/numeric/odeint/util/detail/less_with_sign.hpp b/boost/numeric/odeint/util/detail/less_with_sign.hpp
index d90e12f7b4..3ffa7ca179 100644
--- a/boost/numeric/odeint/util/detail/less_with_sign.hpp
+++ b/boost/numeric/odeint/util/detail/less_with_sign.hpp
@@ -6,7 +6,7 @@
Helper function to compare times taking into account the sign of dt
[end_description]
- Copyright 2012-2013 Mario Mulansky
+ Copyright 2012-2015 Mario Mulansky
Copyright 2012 Karsten Ahnert
Distributed under the Boost Software License, Version 1.0.
@@ -57,7 +57,7 @@ T min_abs( T t1 , T t2 )
{
BOOST_USING_STD_MIN();
BOOST_USING_STD_MAX();
- if( t1>0 )
+ if( get_unit_value(t1)>0 )
return min BOOST_PREVENT_MACRO_SUBSTITUTION ( t1 , t2 );
else
return max BOOST_PREVENT_MACRO_SUBSTITUTION ( t1 , t2 );
@@ -68,7 +68,7 @@ T max_abs( T t1 , T t2 )
{
BOOST_USING_STD_MIN();
BOOST_USING_STD_MAX();
- if( t1>0 )
+ if( get_unit_value(t1)>0 )
return max BOOST_PREVENT_MACRO_SUBSTITUTION ( t1 , t2 );
else
return min BOOST_PREVENT_MACRO_SUBSTITUTION ( t1 , t2 );
diff --git a/boost/numeric/odeint/util/odeint_error.hpp b/boost/numeric/odeint/util/odeint_error.hpp
new file mode 100644
index 0000000000..312e5b1afa
--- /dev/null
+++ b/boost/numeric/odeint/util/odeint_error.hpp
@@ -0,0 +1,77 @@
+/*
+ [auto_generated]
+ boost/numeric/odeint/util/odeint_error.hpp
+
+ [begin_description]
+ Runtime Exceptions thrown by odeint
+ [end_description]
+
+ Copyright 2015 Mario Mulansky
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or
+ copy at http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+
+#ifndef BOOST_NUMERIC_ODEINT_UTIL_ODEINT_ERROR_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_UTIL_ODEINT_ERROR_HPP_INCLUDED
+
+#include <stdexcept>
+#include <string>
+
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+
+/**
+ * \brief Runtime error thrown by odeint
+ */
+class odeint_error : public std::runtime_error
+{
+public:
+ odeint_error(const std::string &s)
+ : std::runtime_error(s)
+ { }
+};
+
+
+/**
+ * \brief Runtime error thrown from integrate routines
+ *
+ * This Error occures when too many iterations are performed in between two
+ * observer calls in the integrate routines.
+ */
+class no_progress_error : public odeint_error
+{
+public:
+ no_progress_error(const std::string &s)
+ : odeint_error(s)
+ { }
+};
+
+
+/**
+ * \brief Runtime error thrown during stepsize adjustment
+ *
+ * This Error occures when too many iterations are performed without finding
+ * an appropriate new step size. This usually indicates non-continuous points
+ * in the ODE.
+ */
+class step_adjustment_error : public odeint_error
+{
+public:
+ step_adjustment_error(const std::string &s)
+ : odeint_error(s)
+ { }
+};
+
+}
+}
+}
+
+
+
+#endif // BOOST_NUMERIC_ODEINT_UTIL_ODEINT_ERROR_HPP_INCLUDED
diff --git a/boost/numeric/odeint/util/resize.hpp b/boost/numeric/odeint/util/resize.hpp
index 75e9eff448..3645782aee 100644
--- a/boost/numeric/odeint/util/resize.hpp
+++ b/boost/numeric/odeint/util/resize.hpp
@@ -83,7 +83,7 @@ namespace detail {
}
template< class StateOut , class StateIn >
- void resize_op( StateOut &x1 , const StateIn &x2 , boost::false_type ) const
+ void resize_op( StateOut &/*x1*/ , const StateIn &/*x2*/ , boost::false_type ) const
{
}
diff --git a/boost/numeric/odeint/util/resizer.hpp b/boost/numeric/odeint/util/resizer.hpp
index fd969ec3b9..cd27990bda 100644
--- a/boost/numeric/odeint/util/resizer.hpp
+++ b/boost/numeric/odeint/util/resizer.hpp
@@ -79,7 +79,7 @@ struct initially_resizer
struct never_resizer
{
template< class State , class ResizeFunction >
- bool adjust_size( const State &x , ResizeFunction f )
+ bool adjust_size( const State &/*x*/ , ResizeFunction /*f*/ )
{
return false;
}
diff --git a/boost/numeric/odeint/util/same_size.hpp b/boost/numeric/odeint/util/same_size.hpp
index 8fa6c7a3a0..81ae249d1f 100644
--- a/boost/numeric/odeint/util/same_size.hpp
+++ b/boost/numeric/odeint/util/same_size.hpp
@@ -83,7 +83,7 @@ struct same_size_fusion
}
template< class S1 , class S2 >
- bool same_size_op( const S1 &x1 , const S2 &x2 , boost::false_type ) const
+ bool same_size_op( const S1 &/*x1*/ , const S2 &/*x2*/ , boost::false_type ) const
{
return true;
}
diff --git a/boost/numeric/odeint/util/unwrap_reference.hpp b/boost/numeric/odeint/util/unwrap_reference.hpp
index bc7d423a09..e160878391 100644
--- a/boost/numeric/odeint/util/unwrap_reference.hpp
+++ b/boost/numeric/odeint/util/unwrap_reference.hpp
@@ -31,7 +31,7 @@
namespace boost {
#if BOOST_NUMERIC_ODEINT_CXX11
-template<typename T> struct reference_wrapper;
+template<typename T> class reference_wrapper;
template<typename T> struct unwrap_reference;
#endif
diff --git a/boost/operators.hpp b/boost/operators.hpp
index 82c374ebb5..ab203304c7 100644
--- a/boost/operators.hpp
+++ b/boost/operators.hpp
@@ -82,8 +82,10 @@
#ifndef BOOST_OPERATORS_HPP
#define BOOST_OPERATORS_HPP
+#include <cstddef>
+#include <iterator>
+
#include <boost/config.hpp>
-#include <boost/iterator.hpp>
#include <boost/detail/workaround.hpp>
#if defined(__sgi) && !defined(__GNUC__)
@@ -891,13 +893,13 @@ template <class T,
class R = V const &>
struct input_iterator_helper
: input_iteratable<T, P
- , boost::iterator<std::input_iterator_tag, V, D, P, R
+ , std::iterator<std::input_iterator_tag, V, D, P, R
> > {};
template<class T>
struct output_iterator_helper
: output_iteratable<T
- , boost::iterator<std::output_iterator_tag, void, void, void, void
+ , std::iterator<std::output_iterator_tag, void, void, void, void
> >
{
T& operator*() { return static_cast<T&>(*this); }
@@ -911,7 +913,7 @@ template <class T,
class R = V&>
struct forward_iterator_helper
: forward_iteratable<T, P
- , boost::iterator<std::forward_iterator_tag, V, D, P, R
+ , std::iterator<std::forward_iterator_tag, V, D, P, R
> > {};
template <class T,
@@ -921,7 +923,7 @@ template <class T,
class R = V&>
struct bidirectional_iterator_helper
: bidirectional_iteratable<T, P
- , boost::iterator<std::bidirectional_iterator_tag, V, D, P, R
+ , std::iterator<std::bidirectional_iterator_tag, V, D, P, R
> > {};
template <class T,
@@ -931,7 +933,7 @@ template <class T,
class R = V&>
struct random_access_iterator_helper
: random_access_iteratable<T, P, D, R
- , boost::iterator<std::random_access_iterator_tag, V, D, P, R
+ , std::iterator<std::random_access_iterator_tag, V, D, P, R
> >
{
friend D requires_difference_operator(const T& x, const T& y) {
diff --git a/boost/optional/optional_io.hpp b/boost/optional/optional_io.hpp
index 16dbf9509a..ce81b68f8e 100644
--- a/boost/optional/optional_io.hpp
+++ b/boost/optional/optional_io.hpp
@@ -15,7 +15,7 @@
#include <istream>
#include <ostream>
-#include <boost/none.hpp>
+#include "boost/none.hpp"
#include "boost/optional/optional.hpp"
@@ -25,7 +25,7 @@ namespace boost
template<class CharType, class CharTrait>
inline
std::basic_ostream<CharType, CharTrait>&
-operator<<(std::basic_ostream<CharType, CharTrait>& out, none_t const&)
+operator<<(std::basic_ostream<CharType, CharTrait>& out, none_t)
{
if (out.good())
{
diff --git a/boost/phoenix/config.hpp b/boost/phoenix/config.hpp
index d4d78e9c94..9f2138c894 100644
--- a/boost/phoenix/config.hpp
+++ b/boost/phoenix/config.hpp
@@ -1,12 +1,76 @@
/*==============================================================================
Copyright (c) 2001-2010 Joel de Guzman
- Copyright (c) 2010 Eric Niebler
- Copyright (c) 2014 John Fletcher
+ Copyright (c) 2010 Eric Niebler
+ Copyright (c) 2014-2015 John Fletcher
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#ifndef BOOST_PHOENIX_CONFIG_HPP
#define BOOST_PHOENIX_CONFIG_HPP
+
#include <boost/config.hpp>
+
+//////////////////////////////////////////////////////////////////////////
+// This section is to sort out whether hash types or unordered types
+// are available. This depends on whether stdlib or libc++ is being used
+// and also whether C++11 or C++03 is being used.
+//////////////////////////////////////////////////////////////////////////
+// The idea is to set up the configuration without including the actual
+// headers unless that is unavoidable.
+//
+// The client code should contain the following to include headers
+//
+// #ifdef BOOST_PHOENIX_HAS_HASH
+// #include BOOST_PHOENIX_HASH_SET_HEADER
+// #include BOOST_PHOENIX_HASH_MAP_HEADER
+// #endif
+//
+// #ifdef BOOST_PHOENIX_HAS_UNORDERED_SET_AND_MAP
+// #define BOOST_PHOENIX_UNORDERED_SET_HEADER <unordered_set>
+// #define BOOST_PHOENIX_UNORDERED_MAP_HEADER <unordered_map>
+// #endif
+//
+// The client code can then chose the implementation provided.
+// See the example in test/stl/querying_find2.cpp
+//
+//////////////////////////////////////////////////////////////////////////
+//
+// There is no specific thing in Boost Config for libc++
+#ifdef _LIBCPP_VERSION
+#define BOOST_PHOENIX_USING_LIBCPP
+// This may not be true for some very old version of libc++
+// Current libc++ supports unordered_set and unordered_map without C++11.
+#undef BOOST_NO_CXX11_HDR_UNORDERED_MAP
+#undef BOOST_NO_CXX11_HDR_UNORDERED_SET
+#endif
+
+#if (!defined(BOOST_PHOENIX_USING_LIBCPP) \
+ && (defined (BOOST_NO_CXX11_HDR_UNORDERED_MAP) || \
+ defined (BOOST_NO_CXX11_HDR_UNORDERED_SET) ) )
+#ifdef BOOST_HAS_HASH
+// This is to sort out case of Clang when using stdlib from gcc
+// as Clang thinks it is gcc 4.2.1
+// This prevents the failure to include a header with a warning.
+#define _GLIBCXX_PERMIT_BACKWARD_HASH
+#define BOOST_PHOENIX_PERMIT_BACKWARD_HASH
+#define BOOST_PHOENIX_HASH_SET_HEADER BOOST_HASH_SET_HEADER
+#define BOOST_PHOENIX_HASH_MAP_HEADER BOOST_HASH_MAP_HEADER
+#define BOOST_PHOENIX_HAS_HASH
+#define BOOST_PHOENIX_HASH_NAMESPACE BOOST_STD_EXTENSION_NAMESPACE
+
+#elif defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB < 610)
+#define BOOST_PHOENIX_HASH_SET_HEADER <hash_set>
+#define BOOST_PHOENIX_HASH_MAP_HEADER <hash_map>
+#define BOOST_PHOENIX_HAS_HASH
+#define BOOST_PHOENIX_HASH_NAMESPACE stdext
+#endif
+#else
+// This is either libc++ or C++11 or later
+#define BOOST_PHOENIX_HAS_UNORDERED_SET_AND_MAP
+#define BOOST_PHOENIX_UNORDERED_SET_HEADER <unordered_set>
+#define BOOST_PHOENIX_UNORDERED_MAP_HEADER <unordered_map>
+#define BOOST_PHOENIX_UNORDERED_NAMESPACE std
+#endif
+
#endif
diff --git a/boost/phoenix/function/adapt_function.hpp b/boost/phoenix/function/adapt_function.hpp
index b539ae1894..6428e8eaef 100644
--- a/boost/phoenix/function/adapt_function.hpp
+++ b/boost/phoenix/function/adapt_function.hpp
@@ -1,6 +1,7 @@
/*==============================================================================
Copyright (c) 2005-2010 Joel de Guzman
Copyright (c) 2010 Thomas Heller
+ Copyright (c) 2015 John Fletcher
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/phoenix/function/function.hpp b/boost/phoenix/function/function.hpp
index 231af15dcb..e59f592f60 100644
--- a/boost/phoenix/function/function.hpp
+++ b/boost/phoenix/function/function.hpp
@@ -1,6 +1,7 @@
/*==============================================================================
Copyright (c) 2001-2010 Joel de Guzman
Copyright (c) 2010 Eric Niebler
+ Copyright (c) 2015 John Fletcher
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -53,6 +54,80 @@ namespace boost { namespace phoenix
// Bring in the rest
#include <boost/phoenix/function/detail/function_operator.hpp>
+ // Solves the result problem for F(X)
+ template <typename This, typename A0>
+ struct result<This(A0)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type>
+ {};
+ // Solves the result problem for F(X,Y)
+ template <typename This, typename A0, typename A1>
+ struct result<This(A0,A1)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type,
+ typename boost::remove_reference<A1>::type>
+ {};
+ // Solves the result problem for F(X,Y,Z)
+ template <typename This, typename A0, typename A1, typename A2>
+ struct result<This(A0,A1,A2)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type,
+ typename boost::remove_reference<A1>::type,
+ typename boost::remove_reference<A2>::type>
+ {};
+
+ // Solves the result problem for F(W,X,Y,Z)
+ template <typename This, typename A0, typename A1,
+ typename A2, typename A3>
+ struct result<This(A0,A1,A2,A3)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type,
+ typename boost::remove_reference<A1>::type,
+ typename boost::remove_reference<A2>::type,
+ typename boost::remove_reference<A3>::type>
+ {};
+
+ // Solves the result problem for F(V,W,X,Y,Z)
+ template <typename This, typename A0, typename A1,
+ typename A2, typename A3,typename A4>
+ struct result<This(A0,A1,A2,A3,A4)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type,
+ typename boost::remove_reference<A1>::type,
+ typename boost::remove_reference<A2>::type,
+ typename boost::remove_reference<A3>::type,
+ typename boost::remove_reference<A4>::type>
+ {};
+
+ // Solves the result problem for F(U,V,W,X,Y,Z)
+ template <typename This, typename A0, typename A1,
+ typename A2, typename A3,typename A4,
+ typename A5>
+ struct result<This(A0,A1,A2,A3,A4,A5)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type,
+ typename boost::remove_reference<A1>::type,
+ typename boost::remove_reference<A2>::type,
+ typename boost::remove_reference<A3>::type,
+ typename boost::remove_reference<A4>::type,
+ typename boost::remove_reference<A5>::type>
+ {};
+
+ // Solves the result problem for F(T,U,V,W,X,Y,Z)
+ template <typename This, typename A0, typename A1,
+ typename A2, typename A3,typename A4,
+ typename A5, typename A6>
+ struct result<This(A0,A1,A2,A3,A4,A5,A6)>
+ : detail::expression::function_eval<F,
+ typename boost::remove_reference<A0>::type,
+ typename boost::remove_reference<A1>::type,
+ typename boost::remove_reference<A2>::type,
+ typename boost::remove_reference<A3>::type,
+ typename boost::remove_reference<A4>::type,
+ typename boost::remove_reference<A5>::type,
+ typename boost::remove_reference<A6>::type>
+ {};
+
F f;
};
}
diff --git a/boost/phoenix/function/lazy_list.hpp b/boost/phoenix/function/lazy_list.hpp
index 996d34f822..8653125c9b 100644
--- a/boost/phoenix/function/lazy_list.hpp
+++ b/boost/phoenix/function/lazy_list.hpp
@@ -1304,28 +1304,28 @@ bool operator<( a_unique_type_for_nil, const list<T>& b ) {
template <class L, class M, bool b>
struct CatHelp0;
- template <class L>
- struct CatHelp0<L,a_unique_type_for_nil,true> {
- typedef typename result_of::template ListType<L>::LType type;
+ template <class LL>
+ struct CatHelp0<LL,a_unique_type_for_nil,true> {
+ typedef typename result_of::template ListType<LL>::LType type;
};
- template <class L>
- struct CatHelp0<const L &,const a_unique_type_for_nil &,true> {
- typedef typename result_of::template ListType<L>::LType type;
+ template <class LL>
+ struct CatHelp0<const LL &,const a_unique_type_for_nil &,true> {
+ typedef typename result_of::template ListType<LL>::LType type;
//typedef L type;
};
- template <class L>
- struct CatHelp0<L &,a_unique_type_for_nil &,true> {
- typedef typename result_of::template ListType<L>::LType type;
+ template <class LL>
+ struct CatHelp0<LL &,a_unique_type_for_nil &,true> {
+ typedef typename result_of::template ListType<LL>::LType type;
//typedef L type;
};
- template <class L, class M>
- struct CatHelp0<L,M,false> {
+ template <class LL, class MM>
+ struct CatHelp0<LL,MM,false> {
// This removes any references from L for correct return type
// identification.
- typedef typename result_of::template ListType<L>::LType type;
+ typedef typename result_of::template ListType<LL>::LType type;
// typedef typename ConsHelp1<T,LType,
// boost::is_base_and_derived<ListLike,LType>::value>::type type;
};
diff --git a/boost/phoenix/function/lazy_operator.hpp b/boost/phoenix/function/lazy_operator.hpp
index c88b768e3d..fb5d9df299 100644
--- a/boost/phoenix/function/lazy_operator.hpp
+++ b/boost/phoenix/function/lazy_operator.hpp
@@ -10,7 +10,8 @@
// make_pair
// plus minus multiplies divides modulus
// negate equal not_equal greater less
-// greater_equal less_equal logical_and logical_or
+// greater_equal less_equal positive
+// logical_and logical_or
// logical_not min max inc dec
//
// These are not from the FC++ operator.hpp but were made for testing purposes.
@@ -77,7 +78,15 @@ namespace boost {
namespace impl {
- struct Id
+ // Implemented early, moved from lazy_signature.hpp
+ template <class T>
+ struct remove_RC
+ {
+ typedef typename boost::remove_reference<T>::type TT;
+ typedef typename boost::remove_const<TT>::type type;
+ };
+
+ struct XId
{
template <typename Sig>
struct result;
@@ -98,8 +107,7 @@ namespace boost {
}
- //BOOST_PHOENIX_ADAPT_CALLABLE(id, impl::id, 1)
- typedef boost::phoenix::function<impl::Id> Id;
+ typedef boost::phoenix::function<impl::XId> Id;
Id id;
#ifdef BOOST_RESULT_OF_USE_TR1
@@ -115,8 +123,8 @@ namespace boost {
class make_pair
{
public:
- typedef typename boost::remove_reference<Arg1>::type Arg1Type;
- typedef typename boost::remove_reference<Arg2>::type Arg2Type;
+ typedef typename impl::remove_RC<Arg1>::type Arg1Type;
+ typedef typename impl::remove_RC<Arg2>::type Arg2Type;
typedef std::pair<Arg1Type,Arg2Type> type;
typedef std::pair<Arg1Type,Arg2Type> result_type;
};
@@ -126,7 +134,7 @@ namespace boost {
namespace impl
{
- struct make_pair {
+ struct XMake_pair {
#ifdef BOOST_RESULT_OF_USE_TR1
@@ -152,7 +160,7 @@ namespace boost {
template <typename A0, typename A1>
#ifdef BOOST_RESULT_OF_USE_TR1
- typename result<make_pair(A0,A1)>::type
+ typename result<XMake_pair(A0,A1)>::type
#else
std::pair<A0, A1>
#endif
@@ -164,7 +172,8 @@ namespace boost {
};
}
-BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
+ typedef boost::phoenix::function<impl::XMake_pair> Make_pair;
+ Make_pair make_pair;
namespace impl
{
@@ -174,7 +183,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
// mixed types which I have in FC++.
// Also I could look at the case where one of the arguments is
// another functor or a Phoenix placeholder.
- struct Plus
+ struct XPlus
{
template <typename Sig>
struct result;
@@ -204,7 +213,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct Minus
+ struct XMinus
{
template <typename Sig>
struct result;
@@ -222,7 +231,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct multiplies
+ struct XMultiplies
{
template <typename Sig>
struct result;
@@ -240,7 +249,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct divides
+ struct XDivides
{
template <typename Sig>
struct result;
@@ -258,7 +267,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct modulus
+ struct XModulus
{
template <typename Sig>
struct result;
@@ -276,7 +285,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct negate
+ struct XNegate
{
template <typename Sig>
struct result;
@@ -293,7 +302,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct equal
+ struct XEqual
{
template <typename Sig>
struct result;
@@ -311,7 +320,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct not_equal
+ struct XNot_equal
{
template <typename Sig>
struct result;
@@ -329,7 +338,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct greater
+ struct XGreater
{
template <typename Sig>
struct result;
@@ -347,7 +356,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct less
+ struct XLess
{
template <typename Sig>
struct result;
@@ -365,7 +374,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct greater_equal
+ struct XGreater_equal
{
template <typename Sig>
struct result;
@@ -383,7 +392,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct less_equal
+ struct XLess_equal
{
template <typename Sig>
struct result;
@@ -401,7 +410,25 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct logical_and
+ struct XPositive
+ {
+ template <typename Sig>
+ struct result;
+
+ template <typename This, typename A0>
+ struct result<This(A0)>
+ {
+ typedef bool type;
+ };
+
+ template <typename A0>
+ bool operator()(A0 const & a0) const
+ {
+ return a0 >= A0(0);
+ }
+ };
+
+ struct XLogical_and
{
template <typename Sig>
struct result;
@@ -419,7 +446,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct logical_or
+ struct XLogical_or
{
template <typename Sig>
struct result;
@@ -437,7 +464,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct logical_not
+ struct XLogical_not
{
template <typename Sig>
struct result;
@@ -455,7 +482,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- struct min
+ struct XMin
{
template <typename Sig>
struct result;
@@ -473,7 +500,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct max
+ struct XMax
{
template <typename Sig>
struct result;
@@ -491,7 +518,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct Inc
+ struct XInc
{
template <typename Sig>
struct result;
@@ -509,7 +536,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct Dec
+ struct XDec
{
template <typename Sig>
struct result;
@@ -527,7 +554,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
- struct Sin
+ struct XSin
{
template <typename Sig>
struct result;
@@ -572,6 +599,7 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
};
+
template <class Result, class F>
class MonomorphicWrapper0 /* : public c_fun_type<Res> */
{
@@ -584,30 +612,6 @@ BOOST_PHOENIX_ADAPT_CALLABLE(make_pair, impl::make_pair, 2)
}
};
- /* I need the equivalent of this
- template <class Res, class F>
- full0<impl::XMonomorphicWrapper0<Res,F> > monomorphize0( const F& f )
- {
- return make_full0( impl::XMonomorphicWrapper0<Res,F>( f ) );
- }*/
-
-
- // boost::function0<int> res = MonomorphicWrapper0<int,F>(f);
-
-
- template <class Res, class F>
- boost::function<Res()> monomorphize0( const F& f )
- {
- boost::function0<Res> ff = MonomorphicWrapper0<Res,F>( f );
- //BOOST_PHOENIX_ADAPT_FUNCTION_NULLARY(Res,fres,ff)
- return ff;
- }
-
- // This is C++1y
- //template <typename Result>
- //static boost::function1<Result,Result> res = what<Result>();
-
-
}
/////////////////////////////////////////////////////////
// Look at this. How to use Phoenix with a templated
@@ -627,36 +631,47 @@ typedef boost::phoenix::function<fun0_int> What0_arg;
What_arg what_arg(what_int);
What0_arg what0_arg(what0_int);
-//BOOST_PHOENIX_ADAPT_CALLABLE(plus, impl::plus, 2)
-//BOOST_PHOENIX_ADAPT_CALLABLE(plus, impl::plus, 3)
-//BOOST_PHOENIX_ADAPT_CALLABLE(minus, impl::minus, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(multiplies, impl::multiplies, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(divides, impl::divides, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(modulus, impl::modulus, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(negate, impl::negate, 1)
-BOOST_PHOENIX_ADAPT_CALLABLE(equal, impl::equal, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(not_equal, impl::not_equal, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(greater, impl::greater, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(less, impl::less, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(greater_equal, impl::greater_equal, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(less_equal, impl::less_equal, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(logical_and, impl::logical_and, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(logical_or, impl::logical_or, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(logical_not, impl::logical_not, 1)
-BOOST_PHOENIX_ADAPT_CALLABLE(min, impl::min, 2)
-BOOST_PHOENIX_ADAPT_CALLABLE(max, impl::max, 2)
-//BOOST_PHOENIX_ADAPT_CALLABLE(inc, impl::inc, 1)
-//BOOST_PHOENIX_ADAPT_CALLABLE(dec, impl::dec, 1)
-//BOOST_PHOENIX_ADAPT_CALLABLE(sin, impl::sin, 1)
// To use these as arguments they have to be defined like this.
- typedef boost::phoenix::function<impl::Plus> Plus;
- typedef boost::phoenix::function<impl::Minus> Minus;
- typedef boost::phoenix::function<impl::Inc> Inc;
- typedef boost::phoenix::function<impl::Dec> Dec;
- typedef boost::phoenix::function<impl::Sin> Sin;
+ typedef boost::phoenix::function<impl::XPlus> Plus;
+ typedef boost::phoenix::function<impl::XMinus> Minus;
+ typedef boost::phoenix::function<impl::XMultiplies> Multiplies;
+ typedef boost::phoenix::function<impl::XDivides> Divides;
+ typedef boost::phoenix::function<impl::XModulus> Modulus;
+ typedef boost::phoenix::function<impl::XNegate> Negate;
+ typedef boost::phoenix::function<impl::XEqual> Equal;
+ typedef boost::phoenix::function<impl::XNot_equal> Not_equal;
+ typedef boost::phoenix::function<impl::XGreater> Greater;
+ typedef boost::phoenix::function<impl::XLess> Less;
+ typedef boost::phoenix::function<impl::XGreater_equal> Greater_equal;
+ typedef boost::phoenix::function<impl::XLess_equal> Less_equal;
+ typedef boost::phoenix::function<impl::XPositive> Positive;
+ typedef boost::phoenix::function<impl::XLogical_and> Logical_and;
+ typedef boost::phoenix::function<impl::XLogical_or> Logical_or;
+ typedef boost::phoenix::function<impl::XLogical_not> Logical_not;
+ typedef boost::phoenix::function<impl::XMax> Max;
+ typedef boost::phoenix::function<impl::XMin> Min;
+ typedef boost::phoenix::function<impl::XInc> Inc;
+ typedef boost::phoenix::function<impl::XDec> Dec;
+ typedef boost::phoenix::function<impl::XSin> Sin;
Plus plus;
Minus minus;
+ Multiplies multiplies;
+ Divides divides;
+ Modulus modulus;
+ Negate negate;
+ Equal equal;
+ Not_equal not_equal;
+ Greater greater;
+ Less less;
+ Greater_equal greater_equal;
+ Less_equal less_equal;
+ Positive positive;
+ Logical_and logical_and;
+ Logical_or logical_or;
+ Logical_not logical_not;
+ Max max;
+ Min min;
Inc inc;
Dec dec;
Sin sin;
@@ -665,6 +680,4 @@ BOOST_PHOENIX_ADAPT_CALLABLE(max, impl::max, 2)
}
-
-
#endif
diff --git a/boost/phoenix/function/lazy_reuse.hpp b/boost/phoenix/function/lazy_reuse.hpp
index cef2ded820..845cc1c90b 100644
--- a/boost/phoenix/function/lazy_reuse.hpp
+++ b/boost/phoenix/function/lazy_reuse.hpp
@@ -7,9 +7,10 @@
//
// Implemented so far:
//
-// reuser1 (not yet tested)
-// reuser2 (not yet tested)
+// reuser1
+// reuser2
// reuser3
+// reuser4 (not yet tested)
//
// NOTE: It has been possible to simplify the operation of this code.
// It now makes no use of boost::function or old FC++ code.
@@ -233,6 +234,59 @@ struct reuser3 {
if( ref ) ref->init(f,x,y,z);
}
};
+//////////////////////////////////////////////////////////////////////
+// reuser4
+//////////////////////////////////////////////////////////////////////
+
+ template <class V1, class V2, class V3, class V4, class V5,
+ class F, class W, class X, class Y, class Z>
+struct reuser4;
+
+ template <class V1, class V2, class V3, class V4, class V5,
+ class F, class W, class X, class Y, class Z, class R>
+struct Thunk4 : public ThunkImpl<R> {
+ mutable F f;
+ mutable W w;
+ mutable X x;
+ mutable Y y;
+ mutable Z z;
+ Thunk4( const F& ff, const W& ww, const X& xx, const Y& yy, const Z& zz )
+ : f(ff), w(ww), x(xx), y(yy), z(zz) {}
+ void init( const F& ff, const W& ww, const X& xx, const Y& yy, const Z& zz ) const {
+ Maybe_Var_Inv<V1,F>::remake( f, ff );
+ Maybe_Var_Inv<V2,W>::remake( w, ww );
+ Maybe_Var_Inv<V3,X>::remake( x, xx );
+ Maybe_Var_Inv<V4,Y>::remake( y, yy );
+ Maybe_Var_Inv<V5,Z>::remake( z, zz );
+ }
+ R operator()() const {
+ return Maybe_Var_Inv<V1,F>::clone(f)(
+ Maybe_Var_Inv<V2,W>::clone(w),
+ Maybe_Var_Inv<V3,X>::clone(x),
+ Maybe_Var_Inv<V4,Y>::clone(y),
+ Maybe_Var_Inv<V5,Z>::clone(z),
+ reuser4<V1,V2,V3,V4,V5,F,W,X,Y,Z>(this) );
+ }
+};
+
+ template <class V1, class V2, class V3, class V4, class V5,
+ class F, class W, class X, class Y, class Z>
+ struct reuser4 {
+ typedef typename F::template result<F(W,X,Y,Z)>::type R;
+ typedef Thunk4<V1,V2,V3,V4,V5,F,W,X,Y,Z,R> M;
+ typedef M result_type;
+ boost::intrusive_ptr<const M> ref;
+ reuser4(a_unique_type_for_nil) {}
+ reuser4(const M* m) : ref(m) {}
+ M operator()( const F& f, const W& w, const X& x, const Y& y, const Z& z ) {
+ if( !ref ) ref = boost::intrusive_ptr<const M>( new M(f,w,x,y,z) );
+ else ref->init(f,w,x,y,z);
+ return *ref;
+ }
+ void iter( const F& f, const W& w, const X& x, const Y& y, const Z& z ) {
+ if( ref ) ref->init(f,w,x,y,z);
+ }
+ };
}
diff --git a/boost/phoenix/function/lazy_signature.hpp b/boost/phoenix/function/lazy_signature.hpp
new file mode 100644
index 0000000000..1be6a88694
--- /dev/null
+++ b/boost/phoenix/function/lazy_signature.hpp
@@ -0,0 +1,335 @@
+////////////////////////////////////////////////////////////////////////////
+// lazy_signature.hpp
+//
+// Build signature structs for Phoenix equivalents for FC++
+// which are located in lazy_prelude.hpp
+//
+// These are not direct equivalents of the Boost FC++ structs.
+// This file has to be included after lazy_list.hpp
+//
+// Implemented so far:
+//
+// RTEFH == ReturnTypeEnumFromHelper (used in enum_from, enum_from_to)
+// RTFD == ReturnTypeFunctionDelay (used in repeat)
+// RTFFX == ReturnTypeFunctoidFwithX (used in thunk1)
+// RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2)
+// RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3)
+// RTF == ReturnTypeF (used in ptr_to_fun0)
+// RTFX == ReturnTypeFwithX (used in ptr_to_fun, ptr_to_mem_fun)
+// RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun, ptr_to_mem_fun)
+// RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun, ptr_to_mem_fun)
+// RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun)
+// RTFGHX == ReturnTypeFandGandHwithX (used in compose)
+// RTFGHXY == ReturnTypeFandGandHwithXY (used in compose)
+// RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose)
+// RTFGX == ReturnTypeFandGwithX (used in compose)
+// RTFGXY == ReturnTypeFandGwithXY (used in compose)
+// RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose)
+// RTFL == ReturnTypeFunctionList (used in map)
+// RTAB == ReturnTypeListAListB (used in zip)
+// RTZAB == ReturnTypeZipListAListB (used in zip_with)
+//
+////////////////////////////////////////////////////////////////////////////
+/*=============================================================================
+ Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2015 John Fletcher
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE
+#define BOOST_PHOENIX_FUNCTION_LAZY_SIGNATURE
+
+namespace boost {
+
+ namespace phoenix {
+
+ namespace impl {
+
+ //template <class T> struct remove_RC; in lazy_operator.hpp
+
+ // RTEFH == ReturnTypeEnumFromHelper
+ template <class T>
+ struct RTEFH
+ {
+ typedef typename UseList::template List<T>::type LType;
+ typedef typename result_of::ListType<LType>::
+ delay_result_type type;
+ };
+
+ // RTFD == ReturnTypeFunctionDelay (used in repeat)
+ template <class T>
+ struct RTFD {
+ typedef typename remove_RC<T>::type TTT;
+ typedef typename UseList::template List<TTT>::type LType;
+ typedef typename result_of::ListType<LType>::
+ delay_result_type type;
+ };
+
+
+ // RTFFX == ReturnTypeFunctoidFwithX (used in thunk1)
+ template <class F,class X>
+ struct RTFFX {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename boost::result_of<FType(XType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFFXY == ReturnTypeFunctoidFwithXandY (used in thunk2)
+ template <class F,class X,class Y>
+ struct RTFFXY {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename boost::result_of<FType(XType,YType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFFXYZ == ReturnTypeFunctoidFwithXandYandZ (used in thunk3)
+ template <class F,class X,class Y,class Z>
+ struct RTFFXYZ {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename remove_RC<Z>::type ZType;
+ typedef typename boost::result_of<FType(XType,YType,ZType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTF == ReturnTypeF (used in ptr_to_fun0)
+ template <class F>
+ struct RTF {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename boost::result_of<FType()>::type FR;
+ typedef typename remove_RC<FR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFX == ReturnTypeFwithX (used in ptr_to_fun)
+ template <class F,class X>
+ struct RTFX {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename boost::result_of<FType(XType)>::type FR;
+ typedef typename remove_RC<FR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFXY == ReturnTypeFwithXandY (used in ptr_to_fun)
+ template <class F,class X,class Y>
+ struct RTFXY {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename boost::result_of<FType(XType,YType)>::type FR;
+ typedef typename remove_RC<FR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFXYZ == ReturnTypeFwithXandYandZ (used in ptr_to_fun)
+ template <class F,class X,class Y,class Z>
+ struct RTFXYZ {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename remove_RC<Z>::type ZType;
+ typedef typename boost::result_of<FType(XType,YType,ZType)>::type FR;
+ typedef typename remove_RC<FR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFWXYZ == ReturnTypeFwithWandXandYandZ (used in ptr_to_fun)
+ template <class F,class W,class X,class Y,class Z>
+ struct RTFWXYZ {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<W>::type WType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename remove_RC<Z>::type ZType;
+ typedef typename boost::result_of<FType(WType,XType,YType,ZType)>::
+ type FR;
+ typedef typename remove_RC<FR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFGHX == ReturnTypeFandGandHwithX (used in compose)
+ template <class F,class G,class H,class X>
+ struct RTFGHX {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<G>::type GType;
+ typedef typename remove_RC<H>::type HType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename boost::result_of<GType(XType)>::type GR;
+ typedef typename boost::result_of<GR()>::type GRR;
+ typedef typename remove_RC<GRR>::type GRType;
+ typedef typename boost::result_of<HType(XType)>::type HR;
+ typedef typename boost::result_of<HR()>::type HRR;
+ typedef typename remove_RC<HRR>::type HRType;
+ typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFGHXY == ReturnTypeFandGandHwithXY (used in compose)
+ template <class F,class G,class H,class X,class Y>
+ struct RTFGHXY {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<G>::type GType;
+ typedef typename remove_RC<H>::type HType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename boost::result_of<GType(XType,YType)>::type GR;
+ typedef typename boost::result_of<GR()>::type GRR;
+ typedef typename remove_RC<GRR>::type GRType;
+ typedef typename boost::result_of<HType(XType,YType)>::type HR;
+ typedef typename boost::result_of<HR()>::type HRR;
+ typedef typename remove_RC<HRR>::type HRType;
+ typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFGHXYZ == ReturnTypeFandGandHwithXYZ (used in compose)
+ template <class F,class G,class H,class X,class Y,class Z>
+ struct RTFGHXYZ {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<G>::type GType;
+ typedef typename remove_RC<H>::type HType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename remove_RC<Z>::type ZType;
+ typedef typename boost::result_of<GType(XType,YType,ZType)>::type GR;
+ typedef typename boost::result_of<GR()>::type GRR;
+ typedef typename remove_RC<GRR>::type GRType;
+ typedef typename boost::result_of<HType(XType,YType,ZType)>::type HR;
+ typedef typename boost::result_of<HR()>::type HRR;
+ typedef typename remove_RC<HRR>::type HRType;
+ typedef typename boost::result_of<FType(GRType,HRType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFGX == ReturnTypeFandGwithX (used in compose)
+ template <class F,class G,class X>
+ struct RTFGX {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<G>::type GType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename boost::result_of<GType(XType)>::type GR;
+ typedef typename boost::result_of<GR()>::type GRR;
+ typedef typename remove_RC<GRR>::type GRType;
+ typedef typename boost::result_of<FType(GRType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFGXY == ReturnTypeFandGwithXY (used in compose)
+ template <class F,class G,class X,class Y>
+ struct RTFGXY {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<G>::type GType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename boost::result_of<GType(XType,YType)>::type GR;
+ typedef typename boost::result_of<GR()>::type GRR;
+ typedef typename remove_RC<GRR>::type GRType;
+ typedef typename boost::result_of<FType(GRType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // RTFGXYZ == ReturnTypeFandGwithXYZ (used in compose)
+ template <class F,class G,class X,class Y,class Z>
+ struct RTFGXYZ {
+ typedef typename remove_RC<F>::type FType;
+ typedef typename remove_RC<G>::type GType;
+ typedef typename remove_RC<X>::type XType;
+ typedef typename remove_RC<Y>::type YType;
+ typedef typename remove_RC<Z>::type ZType;
+ typedef typename boost::result_of<GType(XType,YType,ZType)>::type GR;
+ typedef typename boost::result_of<GR()>::type GRR;
+ typedef typename remove_RC<GRR>::type GRType;
+ typedef typename boost::result_of<FType(GRType)>::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type RType;
+ typedef RType type;
+ };
+
+ // This is the way to make the return type for
+ // map(f,l). It is used four times in the code
+ // so I have made it a separate struct.
+ // RTFL == ReturnTypeFunctionList
+ template <class F,class L>
+ struct RTFL {
+ typedef typename remove_RC<F>::type Ftype;
+ typedef typename result_of::ListType<L>::tail_result_type
+ Ttype;
+ typedef typename result_of::ListType<L>::value_type Vtype;
+ // NOTE: FR is the type of the functor.
+ typedef typename boost::result_of<Ftype(Vtype)>::type FR;
+ // NOTE: RR is the type returned, which then needs
+ // reference and const removal.
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type Rtype;
+ typedef typename boost::remove_reference<L>::type LL;
+ typedef typename LL::template cons_rebind<Rtype>::delay_type
+ type;
+ };
+
+ // RTAB == ReturnTypeListAListB
+ template <typename LA, typename LB>
+ struct RTAB {
+ typedef typename result_of::ListType<LA>::tail_result_type
+ LAtype;
+ typedef typename result_of::ListType<LB>::tail_result_type
+ LBtype;
+ typedef typename result_of::ListType<LA>::value_type VAA;
+ typedef typename boost::remove_const<VAA>::type VAtype;
+ typedef typename result_of::ListType<LB>::value_type VBB;
+ typedef typename boost::remove_const<VBB>::type VBtype;
+ typedef typename boost::result_of<Make_pair(VAtype,VBtype)>
+ ::type FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type Rtype;
+ typedef typename boost::remove_reference<LA>::type LLA;
+ typedef typename LLA::template cons_rebind<Rtype>::type type;
+ };
+
+
+ // RTZAB == ReturnTypeZipListAListB
+ template <typename Z, typename LA, typename LB>
+ struct RTZAB {
+ typedef typename remove_RC<Z>::type Ztype;
+ typedef typename result_of::ListType<LA>::tail_result_type
+ LAtype;
+ typedef typename result_of::ListType<LB>::tail_result_type
+ LBtype;
+ typedef typename result_of::ListType<LA>::value_type VAtype;
+ typedef typename result_of::ListType<LB>::value_type VBtype;
+ typedef typename boost::result_of<Ztype(VAtype,VBtype)>::type
+ FR;
+ typedef typename boost::result_of<FR()>::type RR;
+ typedef typename remove_RC<RR>::type Rtype;
+ typedef typename boost::remove_reference<LA>::type LLA;
+ typedef typename LLA::template cons_rebind<Rtype>::type type;
+ };
+
+ }
+ }
+}
+
+#endif
diff --git a/boost/phoenix/function/lazy_smart.hpp b/boost/phoenix/function/lazy_smart.hpp
new file mode 100644
index 0000000000..17e142997f
--- /dev/null
+++ b/boost/phoenix/function/lazy_smart.hpp
@@ -0,0 +1,153 @@
+////////////////////////////////////////////////////////////////////////////
+// lazy smart.hpp
+//
+// Build lazy functoid traits for Phoenix equivalents for FC++
+//
+// These are equivalents of the Boost FC++ functoid traits in smart.hpp
+//
+// I have copied the versions for zero, one, two and three arguments.
+//
+/*=============================================================================
+ Copyright (c) 2000-2003 Brian McNamara and Yannis Smaragdakis
+ Copyright (c) 2001-2007 Joel de Guzman
+ Copyright (c) 2015 John Fletcher
+
+ Distributed under the Boost Software License, Version 1.0. (See accompanying
+ file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_PHOENIX_FUNCTION_LAZY_SMART
+#define BOOST_PHOENIX_FUNCTION_LAZY_SMART
+
+namespace boost {
+ namespace phoenix {
+ namespace fcpp {
+
+//////////////////////////////////////////////////////////////////////
+// Feature: Smartness
+//////////////////////////////////////////////////////////////////////
+// If F is smart, then we can refer to these entities:
+//
+// functoid_traits<F>::template accepts<N>::args
+// A bool which says whether F can accept N arguments
+//
+// functoid_traits<F>::max_args
+// An int which says what the most arguments F can accept is
+//
+// functoid_traits<F>::template ensure_accepts<N>::args()
+// A no-op call that compiles only if F can accept N args
+//
+// We use traits so that if you happen to ask a non-smart functoid these
+// questions, you will hopefully get a literate error message.
+
+struct SmartFunctoid {};
+
+// We add crazy identifiers to ensure that users don't accidentally talk
+// to functoids directly; they should always be going through the traits
+// class to ask for info.
+struct smart_functoid0 : public SmartFunctoid {
+ template <class Dummy, int i> struct crazy_accepts {
+ static const bool args = false;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,0> {
+ static const bool args = true;
+ };
+ static const int crazy_max_args = 0;
+};
+
+struct smart_functoid1 : public SmartFunctoid {
+ template <class Dummy, int i> struct crazy_accepts {
+ static const bool args = false;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,1> {
+ static const bool args = true;
+ };
+ static const int crazy_max_args = 1;
+};
+
+struct smart_functoid2 : public SmartFunctoid {
+ template <class Dummy, int i> struct crazy_accepts {
+ static const bool args = false;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,1> {
+ static const bool args = true;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,2> {
+ static const bool args = true;
+ };
+ static const int crazy_max_args = 2;
+};
+
+struct smart_functoid3 : public SmartFunctoid {
+ template <class Dummy, int i> struct crazy_accepts {
+ static const bool args = false;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,1> {
+ static const bool args = true;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,2> {
+ static const bool args = true;
+ };
+ template <class Dummy> struct crazy_accepts<Dummy,3> {
+ static const bool args = true;
+ };
+ static const int crazy_max_args = 3;
+};
+
+
+namespace impl {
+ template <class F, bool b> struct NeededASmartFunctoidButInsteadGot {};
+ template <class F> struct NeededASmartFunctoidButInsteadGot<F,true> {
+ typedef F type;
+ };
+ template <bool b> struct Ensure;
+ template <> struct Ensure<true> {};
+} // end namespace impl
+
+template <class MaybeASmartFunctoid>
+struct functoid_traits {
+ typedef typename boost::remove_reference<MaybeASmartFunctoid>::type MaybeASmartFunctoidT;
+ typedef
+ typename impl::NeededASmartFunctoidButInsteadGot<MaybeASmartFunctoidT,
+ boost::is_base_and_derived<SmartFunctoid,
+ MaybeASmartFunctoidT>::value>::type F;
+ template <int i> struct accepts {
+ static const bool args = F::template crazy_accepts<int,i>::args;
+ };
+ template <int i> struct ensure_accepts {
+ static const bool ok = F::template crazy_accepts<int,i>::args;
+ inline static void args() { (void) impl::Ensure<ok>(); }
+ };
+ static const int max_args = F::crazy_max_args;
+};
+
+// These can be used to make functoids smart without having to alter
+// code elsewhere. These are used instead of boost::phoenix::function
+// to declare the object.
+template <typename F>
+struct smart_function0 : public smart_functoid0,
+ public boost::phoenix::function<F>
+{ };
+
+template <typename F>
+struct smart_function1 : public smart_functoid1,
+ public boost::phoenix::function<F>
+{
+ typedef F type;
+};
+
+template <typename F>
+struct smart_function2 : public smart_functoid2,
+ public boost::phoenix::function<F>
+{ };
+
+template <typename F>
+struct smart_function3 : public smart_functoid3,
+ public boost::phoenix::function<F>
+{ };
+ }
+ }
+}
+
+
+#endif
diff --git a/boost/phoenix/statement/detail/catch_push_back.hpp b/boost/phoenix/statement/detail/catch_push_back.hpp
index 3ea13585d7..198c33fb91 100644
--- a/boost/phoenix/statement/detail/catch_push_back.hpp
+++ b/boost/phoenix/statement/detail/catch_push_back.hpp
@@ -54,8 +54,48 @@
#endif
#else
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, BOOST_PHOENIX_ITERATION>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+
+ typedef phoenix::expression::try_catch<
+ BOOST_PP_REPEAT(BOOST_PHOENIX_ITERATION, BOOST_PHOENIX_CATCH_PUSH_BACK_R0, _)
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ BOOST_PP_REPEAT(
+ BOOST_PHOENIX_ITERATION
+ , BOOST_PHOENIX_CATCH_PUSH_BACK_R1
+ , _
+ )
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
+
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, BOOST_PHOENIX_ITERATION>
+ struct catch_push_back<TryCatch, Exception, void, Expr, BOOST_PHOENIX_ITERATION>
{
typedef
typename proto::result_of::make_expr<
@@ -91,7 +131,7 @@
);
}
};
-
+
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, BOOST_PHOENIX_ITERATION>
{
diff --git a/boost/phoenix/statement/detail/preprocessed/catch_push_back_10.hpp b/boost/phoenix/statement/detail/preprocessed/catch_push_back_10.hpp
index 1006f3c613..864260ebd0 100644
--- a/boost/phoenix/statement/detail/preprocessed/catch_push_back_10.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/catch_push_back_10.hpp
@@ -12,8 +12,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 2>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 2>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 2>
{
typedef
typename proto::result_of::make_expr<
@@ -43,7 +76,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 2>
{
@@ -81,8 +113,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 3>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 3>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 3>
{
typedef
typename proto::result_of::make_expr<
@@ -112,7 +177,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 3>
{
@@ -150,8 +214,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 4>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 4>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 4>
{
typedef
typename proto::result_of::make_expr<
@@ -181,7 +278,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 4>
{
@@ -219,8 +315,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 5>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 5>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 5>
{
typedef
typename proto::result_of::make_expr<
@@ -250,7 +379,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 5>
{
@@ -288,8 +416,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 6>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 6>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 6>
{
typedef
typename proto::result_of::make_expr<
@@ -319,7 +480,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 6>
{
@@ -357,8 +517,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 7>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 7>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 7>
{
typedef
typename proto::result_of::make_expr<
@@ -388,7 +581,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 7>
{
@@ -426,8 +618,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 8>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 8>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 8>
{
typedef
typename proto::result_of::make_expr<
@@ -457,7 +682,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 8>
{
@@ -495,8 +719,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 9>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 9>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 9>
{
typedef
typename proto::result_of::make_expr<
@@ -526,7 +783,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 9>
{
@@ -564,8 +820,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 10>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 10>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 10>
{
typedef
typename proto::result_of::make_expr<
@@ -595,7 +884,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 10>
{
diff --git a/boost/phoenix/statement/detail/preprocessed/catch_push_back_20.hpp b/boost/phoenix/statement/detail/preprocessed/catch_push_back_20.hpp
index f7d4b3937b..67cf74556d 100644
--- a/boost/phoenix/statement/detail/preprocessed/catch_push_back_20.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/catch_push_back_20.hpp
@@ -12,8 +12,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 2>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 2>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 2>
{
typedef
typename proto::result_of::make_expr<
@@ -43,7 +76,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 2>
{
@@ -81,8 +113,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 3>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 3>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 3>
{
typedef
typename proto::result_of::make_expr<
@@ -112,7 +177,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 3>
{
@@ -150,8 +214,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 4>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 4>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 4>
{
typedef
typename proto::result_of::make_expr<
@@ -181,7 +278,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 4>
{
@@ -219,8 +315,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 5>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 5>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 5>
{
typedef
typename proto::result_of::make_expr<
@@ -250,7 +379,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 5>
{
@@ -288,8 +416,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 6>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 6>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 6>
{
typedef
typename proto::result_of::make_expr<
@@ -319,7 +480,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 6>
{
@@ -357,8 +517,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 7>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 7>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 7>
{
typedef
typename proto::result_of::make_expr<
@@ -388,7 +581,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 7>
{
@@ -426,8 +618,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 8>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 8>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 8>
{
typedef
typename proto::result_of::make_expr<
@@ -457,7 +682,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 8>
{
@@ -495,8 +719,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 9>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 9>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 9>
{
typedef
typename proto::result_of::make_expr<
@@ -526,7 +783,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 9>
{
@@ -564,8 +820,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 10>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 10>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 10>
{
typedef
typename proto::result_of::make_expr<
@@ -595,7 +884,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 10>
{
@@ -633,8 +921,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 11>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 11>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 11>
{
typedef
typename proto::result_of::make_expr<
@@ -664,7 +985,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 11>
{
@@ -702,8 +1022,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 12>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 12>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 12>
{
typedef
typename proto::result_of::make_expr<
@@ -733,7 +1086,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 12>
{
@@ -771,8 +1123,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 13>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 13>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 13>
{
typedef
typename proto::result_of::make_expr<
@@ -802,7 +1187,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 13>
{
@@ -840,8 +1224,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 14>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 14>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 14>
{
typedef
typename proto::result_of::make_expr<
@@ -871,7 +1288,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 14>
{
@@ -909,8 +1325,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 15>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 15>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 15>
{
typedef
typename proto::result_of::make_expr<
@@ -940,7 +1389,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 15>
{
@@ -978,8 +1426,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 16>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 16>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 16>
{
typedef
typename proto::result_of::make_expr<
@@ -1009,7 +1490,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 16>
{
@@ -1047,8 +1527,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 17>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 17>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 17>
{
typedef
typename proto::result_of::make_expr<
@@ -1078,7 +1591,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 17>
{
@@ -1116,8 +1628,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 18>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 18>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 18>
{
typedef
typename proto::result_of::make_expr<
@@ -1147,7 +1692,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 18>
{
@@ -1185,8 +1729,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 19>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 19>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 19>
{
typedef
typename proto::result_of::make_expr<
@@ -1216,7 +1793,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 19>
{
@@ -1254,8 +1830,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 20>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 20>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 20>
{
typedef
typename proto::result_of::make_expr<
@@ -1285,7 +1894,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 20>
{
diff --git a/boost/phoenix/statement/detail/preprocessed/catch_push_back_30.hpp b/boost/phoenix/statement/detail/preprocessed/catch_push_back_30.hpp
index 79f671559a..372e563da3 100644
--- a/boost/phoenix/statement/detail/preprocessed/catch_push_back_30.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/catch_push_back_30.hpp
@@ -12,8 +12,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 2>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 2>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 2>
{
typedef
typename proto::result_of::make_expr<
@@ -43,7 +76,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 2>
{
@@ -81,8 +113,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 3>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 3>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 3>
{
typedef
typename proto::result_of::make_expr<
@@ -112,7 +177,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 3>
{
@@ -150,8 +214,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 4>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 4>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 4>
{
typedef
typename proto::result_of::make_expr<
@@ -181,7 +278,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 4>
{
@@ -219,8 +315,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 5>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 5>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 5>
{
typedef
typename proto::result_of::make_expr<
@@ -250,7 +379,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 5>
{
@@ -288,8 +416,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 6>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 6>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 6>
{
typedef
typename proto::result_of::make_expr<
@@ -319,7 +480,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 6>
{
@@ -357,8 +517,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 7>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 7>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 7>
{
typedef
typename proto::result_of::make_expr<
@@ -388,7 +581,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 7>
{
@@ -426,8 +618,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 8>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 8>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 8>
{
typedef
typename proto::result_of::make_expr<
@@ -457,7 +682,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 8>
{
@@ -495,8 +719,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 9>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 9>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 9>
{
typedef
typename proto::result_of::make_expr<
@@ -526,7 +783,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 9>
{
@@ -564,8 +820,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 10>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 10>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 10>
{
typedef
typename proto::result_of::make_expr<
@@ -595,7 +884,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 10>
{
@@ -633,8 +921,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 11>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 11>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 11>
{
typedef
typename proto::result_of::make_expr<
@@ -664,7 +985,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 11>
{
@@ -702,8 +1022,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 12>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 12>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 12>
{
typedef
typename proto::result_of::make_expr<
@@ -733,7 +1086,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 12>
{
@@ -771,8 +1123,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 13>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 13>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 13>
{
typedef
typename proto::result_of::make_expr<
@@ -802,7 +1187,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 13>
{
@@ -840,8 +1224,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 14>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 14>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 14>
{
typedef
typename proto::result_of::make_expr<
@@ -871,7 +1288,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 14>
{
@@ -909,8 +1325,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 15>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 15>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 15>
{
typedef
typename proto::result_of::make_expr<
@@ -940,7 +1389,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 15>
{
@@ -978,8 +1426,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 16>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 16>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 16>
{
typedef
typename proto::result_of::make_expr<
@@ -1009,7 +1490,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 16>
{
@@ -1047,8 +1527,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 17>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 17>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 17>
{
typedef
typename proto::result_of::make_expr<
@@ -1078,7 +1591,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 17>
{
@@ -1116,8 +1628,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 18>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 18>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 18>
{
typedef
typename proto::result_of::make_expr<
@@ -1147,7 +1692,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 18>
{
@@ -1185,8 +1729,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 19>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 19>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 19>
{
typedef
typename proto::result_of::make_expr<
@@ -1216,7 +1793,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 19>
{
@@ -1254,8 +1830,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 20>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 20>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 20>
{
typedef
typename proto::result_of::make_expr<
@@ -1285,7 +1894,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 20>
{
@@ -1323,8 +1931,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 21>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 21>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 21>
{
typedef
typename proto::result_of::make_expr<
@@ -1354,7 +1995,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 21>
{
@@ -1392,8 +2032,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 22>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 22>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 22>
{
typedef
typename proto::result_of::make_expr<
@@ -1423,7 +2096,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 22>
{
@@ -1461,8 +2133,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 23>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 23>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 23>
{
typedef
typename proto::result_of::make_expr<
@@ -1492,7 +2197,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 23>
{
@@ -1530,8 +2234,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 24>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 24>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 24>
{
typedef
typename proto::result_of::make_expr<
@@ -1561,7 +2298,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 24>
{
@@ -1599,8 +2335,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 25>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 25>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 25>
{
typedef
typename proto::result_of::make_expr<
@@ -1630,7 +2399,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 25>
{
@@ -1668,8 +2436,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 26>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 26>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 26>
{
typedef
typename proto::result_of::make_expr<
@@ -1699,7 +2500,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 26>
{
@@ -1737,8 +2537,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 27>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 27>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 27>
{
typedef
typename proto::result_of::make_expr<
@@ -1768,7 +2601,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 27>
{
@@ -1806,8 +2638,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 28>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 28>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 28>
{
typedef
typename proto::result_of::make_expr<
@@ -1837,7 +2702,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 28>
{
@@ -1875,8 +2739,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 29>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 29>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 29>
{
typedef
typename proto::result_of::make_expr<
@@ -1906,7 +2803,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 29>
{
@@ -1944,8 +2840,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 30>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 30>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 30>
{
typedef
typename proto::result_of::make_expr<
@@ -1975,7 +2904,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 30>
{
diff --git a/boost/phoenix/statement/detail/preprocessed/catch_push_back_40.hpp b/boost/phoenix/statement/detail/preprocessed/catch_push_back_40.hpp
index 32f67c69d7..8809fee660 100644
--- a/boost/phoenix/statement/detail/preprocessed/catch_push_back_40.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/catch_push_back_40.hpp
@@ -12,8 +12,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 2>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 2>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 2>
{
typedef
typename proto::result_of::make_expr<
@@ -43,7 +76,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 2>
{
@@ -81,8 +113,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 3>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 3>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 3>
{
typedef
typename proto::result_of::make_expr<
@@ -112,7 +177,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 3>
{
@@ -150,8 +214,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 4>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 4>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 4>
{
typedef
typename proto::result_of::make_expr<
@@ -181,7 +278,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 4>
{
@@ -219,8 +315,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 5>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 5>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 5>
{
typedef
typename proto::result_of::make_expr<
@@ -250,7 +379,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 5>
{
@@ -288,8 +416,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 6>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 6>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 6>
{
typedef
typename proto::result_of::make_expr<
@@ -319,7 +480,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 6>
{
@@ -357,8 +517,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 7>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 7>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 7>
{
typedef
typename proto::result_of::make_expr<
@@ -388,7 +581,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 7>
{
@@ -426,8 +618,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 8>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 8>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 8>
{
typedef
typename proto::result_of::make_expr<
@@ -457,7 +682,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 8>
{
@@ -495,8 +719,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 9>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 9>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 9>
{
typedef
typename proto::result_of::make_expr<
@@ -526,7 +783,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 9>
{
@@ -564,8 +820,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 10>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 10>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 10>
{
typedef
typename proto::result_of::make_expr<
@@ -595,7 +884,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 10>
{
@@ -633,8 +921,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 11>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 11>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 11>
{
typedef
typename proto::result_of::make_expr<
@@ -664,7 +985,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 11>
{
@@ -702,8 +1022,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 12>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 12>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 12>
{
typedef
typename proto::result_of::make_expr<
@@ -733,7 +1086,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 12>
{
@@ -771,8 +1123,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 13>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 13>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 13>
{
typedef
typename proto::result_of::make_expr<
@@ -802,7 +1187,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 13>
{
@@ -840,8 +1224,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 14>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 14>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 14>
{
typedef
typename proto::result_of::make_expr<
@@ -871,7 +1288,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 14>
{
@@ -909,8 +1325,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 15>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 15>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 15>
{
typedef
typename proto::result_of::make_expr<
@@ -940,7 +1389,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 15>
{
@@ -978,8 +1426,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 16>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 16>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 16>
{
typedef
typename proto::result_of::make_expr<
@@ -1009,7 +1490,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 16>
{
@@ -1047,8 +1527,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 17>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 17>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 17>
{
typedef
typename proto::result_of::make_expr<
@@ -1078,7 +1591,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 17>
{
@@ -1116,8 +1628,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 18>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 18>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 18>
{
typedef
typename proto::result_of::make_expr<
@@ -1147,7 +1692,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 18>
{
@@ -1185,8 +1729,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 19>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 19>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 19>
{
typedef
typename proto::result_of::make_expr<
@@ -1216,7 +1793,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 19>
{
@@ -1254,8 +1830,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 20>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 20>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 20>
{
typedef
typename proto::result_of::make_expr<
@@ -1285,7 +1894,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 20>
{
@@ -1323,8 +1931,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 21>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 21>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 21>
{
typedef
typename proto::result_of::make_expr<
@@ -1354,7 +1995,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 21>
{
@@ -1392,8 +2032,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 22>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 22>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 22>
{
typedef
typename proto::result_of::make_expr<
@@ -1423,7 +2096,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 22>
{
@@ -1461,8 +2133,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 23>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 23>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 23>
{
typedef
typename proto::result_of::make_expr<
@@ -1492,7 +2197,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 23>
{
@@ -1530,8 +2234,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 24>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 24>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 24>
{
typedef
typename proto::result_of::make_expr<
@@ -1561,7 +2298,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 24>
{
@@ -1599,8 +2335,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 25>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 25>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 25>
{
typedef
typename proto::result_of::make_expr<
@@ -1630,7 +2399,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 25>
{
@@ -1668,8 +2436,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 26>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 26>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 26>
{
typedef
typename proto::result_of::make_expr<
@@ -1699,7 +2500,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 26>
{
@@ -1737,8 +2537,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 27>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 27>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 27>
{
typedef
typename proto::result_of::make_expr<
@@ -1768,7 +2601,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 27>
{
@@ -1806,8 +2638,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 28>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 28>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 28>
{
typedef
typename proto::result_of::make_expr<
@@ -1837,7 +2702,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 28>
{
@@ -1875,8 +2739,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 29>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 29>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 29>
{
typedef
typename proto::result_of::make_expr<
@@ -1906,7 +2803,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 29>
{
@@ -1944,8 +2840,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 30>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 30>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 30>
{
typedef
typename proto::result_of::make_expr<
@@ -1975,7 +2904,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 30>
{
@@ -2013,8 +2941,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 31>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 31>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 31>
{
typedef
typename proto::result_of::make_expr<
@@ -2044,7 +3005,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 31>
{
@@ -2082,8 +3042,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 32>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 32>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 32>
{
typedef
typename proto::result_of::make_expr<
@@ -2113,7 +3106,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 32>
{
@@ -2151,8 +3143,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 33>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 33>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 33>
{
typedef
typename proto::result_of::make_expr<
@@ -2182,7 +3207,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 33>
{
@@ -2220,8 +3244,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 34>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 34>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 34>
{
typedef
typename proto::result_of::make_expr<
@@ -2251,7 +3308,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 34>
{
@@ -2289,8 +3345,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 35>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 35>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 35>
{
typedef
typename proto::result_of::make_expr<
@@ -2320,7 +3409,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 35>
{
@@ -2358,8 +3446,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 36>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 36>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 36>
{
typedef
typename proto::result_of::make_expr<
@@ -2389,7 +3510,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 36>
{
@@ -2427,8 +3547,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 37>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 37>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 37>
{
typedef
typename proto::result_of::make_expr<
@@ -2458,7 +3611,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 37>
{
@@ -2496,8 +3648,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 38>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 38>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 38>
{
typedef
typename proto::result_of::make_expr<
@@ -2527,7 +3712,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 38>
{
@@ -2565,8 +3749,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 39>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 39>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 39>
{
typedef
typename proto::result_of::make_expr<
@@ -2596,7 +3813,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 39>
{
@@ -2634,8 +3850,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 40>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 40>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 40>
{
typedef
typename proto::result_of::make_expr<
@@ -2665,7 +3914,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 40>
{
diff --git a/boost/phoenix/statement/detail/preprocessed/catch_push_back_50.hpp b/boost/phoenix/statement/detail/preprocessed/catch_push_back_50.hpp
index c19023d186..2561c400c0 100644
--- a/boost/phoenix/statement/detail/preprocessed/catch_push_back_50.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/catch_push_back_50.hpp
@@ -12,8 +12,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 2>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 2>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 2>
{
typedef
typename proto::result_of::make_expr<
@@ -43,7 +76,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 2>
{
@@ -81,8 +113,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 3>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 3>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 3>
{
typedef
typename proto::result_of::make_expr<
@@ -112,7 +177,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 3>
{
@@ -150,8 +214,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 4>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 4>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 4>
{
typedef
typename proto::result_of::make_expr<
@@ -181,7 +278,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 4>
{
@@ -219,8 +315,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 5>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 5>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 5>
{
typedef
typename proto::result_of::make_expr<
@@ -250,7 +379,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 5>
{
@@ -288,8 +416,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 6>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 6>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 6>
{
typedef
typename proto::result_of::make_expr<
@@ -319,7 +480,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 6>
{
@@ -357,8 +517,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 7>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 7>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 7>
{
typedef
typename proto::result_of::make_expr<
@@ -388,7 +581,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 7>
{
@@ -426,8 +618,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 8>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 8>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 8>
{
typedef
typename proto::result_of::make_expr<
@@ -457,7 +682,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 8>
{
@@ -495,8 +719,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 9>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 9>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 9>
{
typedef
typename proto::result_of::make_expr<
@@ -526,7 +783,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 9>
{
@@ -564,8 +820,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 10>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 10>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 10>
{
typedef
typename proto::result_of::make_expr<
@@ -595,7 +884,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 10>
{
@@ -633,8 +921,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 11>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 11>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 11>
{
typedef
typename proto::result_of::make_expr<
@@ -664,7 +985,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 11>
{
@@ -702,8 +1022,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 12>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 12>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 12>
{
typedef
typename proto::result_of::make_expr<
@@ -733,7 +1086,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 12>
{
@@ -771,8 +1123,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 13>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 13>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 13>
{
typedef
typename proto::result_of::make_expr<
@@ -802,7 +1187,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 13>
{
@@ -840,8 +1224,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 14>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 14>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 14>
{
typedef
typename proto::result_of::make_expr<
@@ -871,7 +1288,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 14>
{
@@ -909,8 +1325,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 15>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 15>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 15>
{
typedef
typename proto::result_of::make_expr<
@@ -940,7 +1389,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 15>
{
@@ -978,8 +1426,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 16>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 16>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 16>
{
typedef
typename proto::result_of::make_expr<
@@ -1009,7 +1490,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 16>
{
@@ -1047,8 +1527,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 17>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 17>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 17>
{
typedef
typename proto::result_of::make_expr<
@@ -1078,7 +1591,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 17>
{
@@ -1116,8 +1628,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 18>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 18>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 18>
{
typedef
typename proto::result_of::make_expr<
@@ -1147,7 +1692,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 18>
{
@@ -1185,8 +1729,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 19>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 19>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 19>
{
typedef
typename proto::result_of::make_expr<
@@ -1216,7 +1793,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 19>
{
@@ -1254,8 +1830,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 20>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 20>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 20>
{
typedef
typename proto::result_of::make_expr<
@@ -1285,7 +1894,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 20>
{
@@ -1323,8 +1931,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 21>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 21>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 21>
{
typedef
typename proto::result_of::make_expr<
@@ -1354,7 +1995,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 21>
{
@@ -1392,8 +2032,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 22>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 22>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 22>
{
typedef
typename proto::result_of::make_expr<
@@ -1423,7 +2096,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 22>
{
@@ -1461,8 +2133,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 23>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 23>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 23>
{
typedef
typename proto::result_of::make_expr<
@@ -1492,7 +2197,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 23>
{
@@ -1530,8 +2234,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 24>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 24>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 24>
{
typedef
typename proto::result_of::make_expr<
@@ -1561,7 +2298,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 24>
{
@@ -1599,8 +2335,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 25>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 25>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 25>
{
typedef
typename proto::result_of::make_expr<
@@ -1630,7 +2399,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 25>
{
@@ -1668,8 +2436,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 26>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 26>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 26>
{
typedef
typename proto::result_of::make_expr<
@@ -1699,7 +2500,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 26>
{
@@ -1737,8 +2537,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 27>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 27>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 27>
{
typedef
typename proto::result_of::make_expr<
@@ -1768,7 +2601,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 27>
{
@@ -1806,8 +2638,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 28>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 28>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 28>
{
typedef
typename proto::result_of::make_expr<
@@ -1837,7 +2702,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 28>
{
@@ -1875,8 +2739,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 29>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 29>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 29>
{
typedef
typename proto::result_of::make_expr<
@@ -1906,7 +2803,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 29>
{
@@ -1944,8 +2840,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 30>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 30>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 30>
{
typedef
typename proto::result_of::make_expr<
@@ -1975,7 +2904,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 30>
{
@@ -2013,8 +2941,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 31>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 31>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 31>
{
typedef
typename proto::result_of::make_expr<
@@ -2044,7 +3005,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 31>
{
@@ -2082,8 +3042,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 32>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 32>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 32>
{
typedef
typename proto::result_of::make_expr<
@@ -2113,7 +3106,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 32>
{
@@ -2151,8 +3143,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 33>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 33>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 33>
{
typedef
typename proto::result_of::make_expr<
@@ -2182,7 +3207,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 33>
{
@@ -2220,8 +3244,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 34>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 34>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 34>
{
typedef
typename proto::result_of::make_expr<
@@ -2251,7 +3308,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 34>
{
@@ -2289,8 +3345,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 35>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 35>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 35>
{
typedef
typename proto::result_of::make_expr<
@@ -2320,7 +3409,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 35>
{
@@ -2358,8 +3446,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 36>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 36>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 36>
{
typedef
typename proto::result_of::make_expr<
@@ -2389,7 +3510,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 36>
{
@@ -2427,8 +3547,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 37>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 37>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 37>
{
typedef
typename proto::result_of::make_expr<
@@ -2458,7 +3611,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 37>
{
@@ -2496,8 +3648,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 38>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 38>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 38>
{
typedef
typename proto::result_of::make_expr<
@@ -2527,7 +3712,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 38>
{
@@ -2565,8 +3749,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 39>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 39>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 39>
{
typedef
typename proto::result_of::make_expr<
@@ -2596,7 +3813,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 39>
{
@@ -2634,8 +3850,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 40>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 40>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 40>
{
typedef
typename proto::result_of::make_expr<
@@ -2665,7 +3914,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 40>
{
@@ -2703,8 +3951,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 41>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 41>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 41>
{
typedef
typename proto::result_of::make_expr<
@@ -2734,7 +4015,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 41>
{
@@ -2772,8 +4052,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 42>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 42>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 42>
{
typedef
typename proto::result_of::make_expr<
@@ -2803,7 +4116,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 42>
{
@@ -2841,8 +4153,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 43>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 43>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 43>
{
typedef
typename proto::result_of::make_expr<
@@ -2872,7 +4217,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 43>
{
@@ -2910,8 +4254,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 44>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 44>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 44>
{
typedef
typename proto::result_of::make_expr<
@@ -2941,7 +4318,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 44>
{
@@ -2979,8 +4355,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 45>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type , typename proto::result_of::child_c<TryCatch, 44>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch) , proto::child_c< 44>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 45>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 45>
{
typedef
typename proto::result_of::make_expr<
@@ -3010,7 +4419,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 45>
{
@@ -3048,8 +4456,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 46>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type , typename proto::result_of::child_c<TryCatch, 44>::type , typename proto::result_of::child_c<TryCatch, 45>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch) , proto::child_c< 44>(try_catch) , proto::child_c< 45>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 46>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 46>
{
typedef
typename proto::result_of::make_expr<
@@ -3079,7 +4520,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 46>
{
@@ -3117,8 +4557,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 47>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type , typename proto::result_of::child_c<TryCatch, 44>::type , typename proto::result_of::child_c<TryCatch, 45>::type , typename proto::result_of::child_c<TryCatch, 46>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch) , proto::child_c< 44>(try_catch) , proto::child_c< 45>(try_catch) , proto::child_c< 46>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 47>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 47>
{
typedef
typename proto::result_of::make_expr<
@@ -3148,7 +4621,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 47>
{
@@ -3186,8 +4658,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 48>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type , typename proto::result_of::child_c<TryCatch, 44>::type , typename proto::result_of::child_c<TryCatch, 45>::type , typename proto::result_of::child_c<TryCatch, 46>::type , typename proto::result_of::child_c<TryCatch, 47>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch) , proto::child_c< 44>(try_catch) , proto::child_c< 45>(try_catch) , proto::child_c< 46>(try_catch) , proto::child_c< 47>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 48>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 48>
{
typedef
typename proto::result_of::make_expr<
@@ -3217,7 +4722,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 48>
{
@@ -3255,8 +4759,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 49>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type , typename proto::result_of::child_c<TryCatch, 44>::type , typename proto::result_of::child_c<TryCatch, 45>::type , typename proto::result_of::child_c<TryCatch, 46>::type , typename proto::result_of::child_c<TryCatch, 47>::type , typename proto::result_of::child_c<TryCatch, 48>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch) , proto::child_c< 44>(try_catch) , proto::child_c< 45>(try_catch) , proto::child_c< 46>(try_catch) , proto::child_c< 47>(try_catch) , proto::child_c< 48>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 49>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 49>
{
typedef
typename proto::result_of::make_expr<
@@ -3286,7 +4823,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 49>
{
@@ -3324,8 +4860,41 @@
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 50>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+ typedef phoenix::expression::try_catch<
+ typename proto::result_of::child_c<TryCatch, 0>::type , typename proto::result_of::child_c<TryCatch, 1>::type , typename proto::result_of::child_c<TryCatch, 2>::type , typename proto::result_of::child_c<TryCatch, 3>::type , typename proto::result_of::child_c<TryCatch, 4>::type , typename proto::result_of::child_c<TryCatch, 5>::type , typename proto::result_of::child_c<TryCatch, 6>::type , typename proto::result_of::child_c<TryCatch, 7>::type , typename proto::result_of::child_c<TryCatch, 8>::type , typename proto::result_of::child_c<TryCatch, 9>::type , typename proto::result_of::child_c<TryCatch, 10>::type , typename proto::result_of::child_c<TryCatch, 11>::type , typename proto::result_of::child_c<TryCatch, 12>::type , typename proto::result_of::child_c<TryCatch, 13>::type , typename proto::result_of::child_c<TryCatch, 14>::type , typename proto::result_of::child_c<TryCatch, 15>::type , typename proto::result_of::child_c<TryCatch, 16>::type , typename proto::result_of::child_c<TryCatch, 17>::type , typename proto::result_of::child_c<TryCatch, 18>::type , typename proto::result_of::child_c<TryCatch, 19>::type , typename proto::result_of::child_c<TryCatch, 20>::type , typename proto::result_of::child_c<TryCatch, 21>::type , typename proto::result_of::child_c<TryCatch, 22>::type , typename proto::result_of::child_c<TryCatch, 23>::type , typename proto::result_of::child_c<TryCatch, 24>::type , typename proto::result_of::child_c<TryCatch, 25>::type , typename proto::result_of::child_c<TryCatch, 26>::type , typename proto::result_of::child_c<TryCatch, 27>::type , typename proto::result_of::child_c<TryCatch, 28>::type , typename proto::result_of::child_c<TryCatch, 29>::type , typename proto::result_of::child_c<TryCatch, 30>::type , typename proto::result_of::child_c<TryCatch, 31>::type , typename proto::result_of::child_c<TryCatch, 32>::type , typename proto::result_of::child_c<TryCatch, 33>::type , typename proto::result_of::child_c<TryCatch, 34>::type , typename proto::result_of::child_c<TryCatch, 35>::type , typename proto::result_of::child_c<TryCatch, 36>::type , typename proto::result_of::child_c<TryCatch, 37>::type , typename proto::result_of::child_c<TryCatch, 38>::type , typename proto::result_of::child_c<TryCatch, 39>::type , typename proto::result_of::child_c<TryCatch, 40>::type , typename proto::result_of::child_c<TryCatch, 41>::type , typename proto::result_of::child_c<TryCatch, 42>::type , typename proto::result_of::child_c<TryCatch, 43>::type , typename proto::result_of::child_c<TryCatch, 44>::type , typename proto::result_of::child_c<TryCatch, 45>::type , typename proto::result_of::child_c<TryCatch, 46>::type , typename proto::result_of::child_c<TryCatch, 47>::type , typename proto::result_of::child_c<TryCatch, 48>::type , typename proto::result_of::child_c<TryCatch, 49>::type
+ , catch_expr> gen_type;
+ typedef typename gen_type::type type;
+ static type
+ make(
+ TryCatch const& try_catch
+ , Capture const& capture
+ , Expr const& catch_
+ )
+ {
+ return
+ gen_type::make(
+ proto::child_c< 0>(try_catch) , proto::child_c< 1>(try_catch) , proto::child_c< 2>(try_catch) , proto::child_c< 3>(try_catch) , proto::child_c< 4>(try_catch) , proto::child_c< 5>(try_catch) , proto::child_c< 6>(try_catch) , proto::child_c< 7>(try_catch) , proto::child_c< 8>(try_catch) , proto::child_c< 9>(try_catch) , proto::child_c< 10>(try_catch) , proto::child_c< 11>(try_catch) , proto::child_c< 12>(try_catch) , proto::child_c< 13>(try_catch) , proto::child_c< 14>(try_catch) , proto::child_c< 15>(try_catch) , proto::child_c< 16>(try_catch) , proto::child_c< 17>(try_catch) , proto::child_c< 18>(try_catch) , proto::child_c< 19>(try_catch) , proto::child_c< 20>(try_catch) , proto::child_c< 21>(try_catch) , proto::child_c< 22>(try_catch) , proto::child_c< 23>(try_catch) , proto::child_c< 24>(try_catch) , proto::child_c< 25>(try_catch) , proto::child_c< 26>(try_catch) , proto::child_c< 27>(try_catch) , proto::child_c< 28>(try_catch) , proto::child_c< 29>(try_catch) , proto::child_c< 30>(try_catch) , proto::child_c< 31>(try_catch) , proto::child_c< 32>(try_catch) , proto::child_c< 33>(try_catch) , proto::child_c< 34>(try_catch) , proto::child_c< 35>(try_catch) , proto::child_c< 36>(try_catch) , proto::child_c< 37>(try_catch) , proto::child_c< 38>(try_catch) , proto::child_c< 39>(try_catch) , proto::child_c< 40>(try_catch) , proto::child_c< 41>(try_catch) , proto::child_c< 42>(try_catch) , proto::child_c< 43>(try_catch) , proto::child_c< 44>(try_catch) , proto::child_c< 45>(try_catch) , proto::child_c< 46>(try_catch) , proto::child_c< 47>(try_catch) , proto::child_c< 48>(try_catch) , proto::child_c< 49>(try_catch)
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 50>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 50>
{
typedef
typename proto::result_of::make_expr<
@@ -3355,7 +4924,6 @@
);
}
};
-
template <typename TryCatch, typename Expr>
struct catch_all_push_back<TryCatch, Expr, 50>
{
diff --git a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_10.hpp b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_10.hpp
index 473f3962a9..9ee0ba1ec9 100644
--- a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_10.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_10.hpp
@@ -26,7 +26,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
}
template <typename Try, typename A0, typename Context>
typename boost::disable_if<
@@ -73,7 +73,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
}
template <typename Try, typename A0 , typename A1, typename Context>
typename boost::disable_if<
@@ -89,7 +89,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -120,7 +120,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2, typename Context>
typename boost::disable_if<
@@ -136,7 +136,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -167,7 +167,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3, typename Context>
typename boost::disable_if<
@@ -183,7 +183,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -214,7 +214,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename Context>
typename boost::disable_if<
@@ -230,7 +230,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -261,7 +261,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename Context>
typename boost::disable_if<
@@ -277,7 +277,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -308,7 +308,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename Context>
typename boost::disable_if<
@@ -324,7 +324,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -355,7 +355,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename Context>
typename boost::disable_if<
@@ -371,7 +371,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -402,7 +402,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename Context>
typename boost::disable_if<
@@ -418,7 +418,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -449,7 +449,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9, typename Context>
typename boost::disable_if<
@@ -465,7 +465,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
catch(...)
{
boost::phoenix::eval(
diff --git a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_20.hpp b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_20.hpp
index 711e36ac8a..2bee76b79a 100644
--- a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_20.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_20.hpp
@@ -26,7 +26,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
}
template <typename Try, typename A0, typename Context>
typename boost::disable_if<
@@ -73,7 +73,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
}
template <typename Try, typename A0 , typename A1, typename Context>
typename boost::disable_if<
@@ -89,7 +89,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -120,7 +120,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2, typename Context>
typename boost::disable_if<
@@ -136,7 +136,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -167,7 +167,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3, typename Context>
typename boost::disable_if<
@@ -183,7 +183,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -214,7 +214,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename Context>
typename boost::disable_if<
@@ -230,7 +230,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -261,7 +261,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename Context>
typename boost::disable_if<
@@ -277,7 +277,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -308,7 +308,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename Context>
typename boost::disable_if<
@@ -324,7 +324,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -355,7 +355,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename Context>
typename boost::disable_if<
@@ -371,7 +371,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -402,7 +402,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename Context>
typename boost::disable_if<
@@ -418,7 +418,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -449,7 +449,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9, typename Context>
typename boost::disable_if<
@@ -465,7 +465,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -496,7 +496,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10, typename Context>
typename boost::disable_if<
@@ -512,7 +512,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -543,7 +543,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11, typename Context>
typename boost::disable_if<
@@ -559,7 +559,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -590,7 +590,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12, typename Context>
typename boost::disable_if<
@@ -606,7 +606,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -637,7 +637,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13, typename Context>
typename boost::disable_if<
@@ -653,7 +653,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -684,7 +684,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14, typename Context>
typename boost::disable_if<
@@ -700,7 +700,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -731,7 +731,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15, typename Context>
typename boost::disable_if<
@@ -747,7 +747,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -778,7 +778,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16, typename Context>
typename boost::disable_if<
@@ -794,7 +794,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -825,7 +825,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17, typename Context>
typename boost::disable_if<
@@ -841,7 +841,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -872,7 +872,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18, typename Context>
typename boost::disable_if<
@@ -888,7 +888,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -919,7 +919,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19, typename Context>
typename boost::disable_if<
@@ -935,7 +935,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
catch(...)
{
boost::phoenix::eval(
diff --git a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_30.hpp b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_30.hpp
index 54028f31f2..daefcae674 100644
--- a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_30.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_30.hpp
@@ -26,7 +26,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
}
template <typename Try, typename A0, typename Context>
typename boost::disable_if<
@@ -73,7 +73,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
}
template <typename Try, typename A0 , typename A1, typename Context>
typename boost::disable_if<
@@ -89,7 +89,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -120,7 +120,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2, typename Context>
typename boost::disable_if<
@@ -136,7 +136,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -167,7 +167,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3, typename Context>
typename boost::disable_if<
@@ -183,7 +183,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -214,7 +214,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename Context>
typename boost::disable_if<
@@ -230,7 +230,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -261,7 +261,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename Context>
typename boost::disable_if<
@@ -277,7 +277,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -308,7 +308,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename Context>
typename boost::disable_if<
@@ -324,7 +324,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -355,7 +355,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename Context>
typename boost::disable_if<
@@ -371,7 +371,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -402,7 +402,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename Context>
typename boost::disable_if<
@@ -418,7 +418,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -449,7 +449,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9, typename Context>
typename boost::disable_if<
@@ -465,7 +465,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -496,7 +496,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10, typename Context>
typename boost::disable_if<
@@ -512,7 +512,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -543,7 +543,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11, typename Context>
typename boost::disable_if<
@@ -559,7 +559,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -590,7 +590,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12, typename Context>
typename boost::disable_if<
@@ -606,7 +606,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -637,7 +637,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13, typename Context>
typename boost::disable_if<
@@ -653,7 +653,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -684,7 +684,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14, typename Context>
typename boost::disable_if<
@@ -700,7 +700,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -731,7 +731,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15, typename Context>
typename boost::disable_if<
@@ -747,7 +747,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -778,7 +778,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16, typename Context>
typename boost::disable_if<
@@ -794,7 +794,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -825,7 +825,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17, typename Context>
typename boost::disable_if<
@@ -841,7 +841,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -872,7 +872,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18, typename Context>
typename boost::disable_if<
@@ -888,7 +888,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -919,7 +919,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19, typename Context>
typename boost::disable_if<
@@ -935,7 +935,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -966,7 +966,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20, typename Context>
typename boost::disable_if<
@@ -982,7 +982,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1013,7 +1013,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21, typename Context>
typename boost::disable_if<
@@ -1029,7 +1029,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1060,7 +1060,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22, typename Context>
typename boost::disable_if<
@@ -1076,7 +1076,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1107,7 +1107,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23, typename Context>
typename boost::disable_if<
@@ -1123,7 +1123,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1154,7 +1154,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24, typename Context>
typename boost::disable_if<
@@ -1170,7 +1170,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1201,7 +1201,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25, typename Context>
typename boost::disable_if<
@@ -1217,7 +1217,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1248,7 +1248,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26, typename Context>
typename boost::disable_if<
@@ -1264,7 +1264,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1295,7 +1295,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27, typename Context>
typename boost::disable_if<
@@ -1311,7 +1311,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1342,7 +1342,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28, typename Context>
typename boost::disable_if<
@@ -1358,7 +1358,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1389,7 +1389,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29, typename Context>
typename boost::disable_if<
@@ -1405,7 +1405,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); }
catch(...)
{
boost::phoenix::eval(
diff --git a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_40.hpp b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_40.hpp
index 28f303eaf2..3fb0e9adfb 100644
--- a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_40.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_40.hpp
@@ -26,7 +26,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
}
template <typename Try, typename A0, typename Context>
typename boost::disable_if<
@@ -73,7 +73,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
}
template <typename Try, typename A0 , typename A1, typename Context>
typename boost::disable_if<
@@ -89,7 +89,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -120,7 +120,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2, typename Context>
typename boost::disable_if<
@@ -136,7 +136,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -167,7 +167,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3, typename Context>
typename boost::disable_if<
@@ -183,7 +183,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -214,7 +214,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename Context>
typename boost::disable_if<
@@ -230,7 +230,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -261,7 +261,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename Context>
typename boost::disable_if<
@@ -277,7 +277,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -308,7 +308,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename Context>
typename boost::disable_if<
@@ -324,7 +324,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -355,7 +355,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename Context>
typename boost::disable_if<
@@ -371,7 +371,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -402,7 +402,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename Context>
typename boost::disable_if<
@@ -418,7 +418,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -449,7 +449,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9, typename Context>
typename boost::disable_if<
@@ -465,7 +465,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -496,7 +496,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10, typename Context>
typename boost::disable_if<
@@ -512,7 +512,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -543,7 +543,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11, typename Context>
typename boost::disable_if<
@@ -559,7 +559,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -590,7 +590,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12, typename Context>
typename boost::disable_if<
@@ -606,7 +606,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -637,7 +637,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13, typename Context>
typename boost::disable_if<
@@ -653,7 +653,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -684,7 +684,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14, typename Context>
typename boost::disable_if<
@@ -700,7 +700,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -731,7 +731,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15, typename Context>
typename boost::disable_if<
@@ -747,7 +747,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -778,7 +778,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16, typename Context>
typename boost::disable_if<
@@ -794,7 +794,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -825,7 +825,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17, typename Context>
typename boost::disable_if<
@@ -841,7 +841,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -872,7 +872,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18, typename Context>
typename boost::disable_if<
@@ -888,7 +888,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -919,7 +919,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19, typename Context>
typename boost::disable_if<
@@ -935,7 +935,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -966,7 +966,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20, typename Context>
typename boost::disable_if<
@@ -982,7 +982,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1013,7 +1013,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21, typename Context>
typename boost::disable_if<
@@ -1029,7 +1029,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1060,7 +1060,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22, typename Context>
typename boost::disable_if<
@@ -1076,7 +1076,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1107,7 +1107,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23, typename Context>
typename boost::disable_if<
@@ -1123,7 +1123,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1154,7 +1154,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24, typename Context>
typename boost::disable_if<
@@ -1170,7 +1170,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1201,7 +1201,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25, typename Context>
typename boost::disable_if<
@@ -1217,7 +1217,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1248,7 +1248,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26, typename Context>
typename boost::disable_if<
@@ -1264,7 +1264,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1295,7 +1295,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27, typename Context>
typename boost::disable_if<
@@ -1311,7 +1311,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1342,7 +1342,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28, typename Context>
typename boost::disable_if<
@@ -1358,7 +1358,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1389,7 +1389,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29, typename Context>
typename boost::disable_if<
@@ -1405,7 +1405,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1436,7 +1436,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30, typename Context>
typename boost::disable_if<
@@ -1452,7 +1452,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1483,7 +1483,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31, typename Context>
typename boost::disable_if<
@@ -1499,7 +1499,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1530,7 +1530,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32, typename Context>
typename boost::disable_if<
@@ -1546,7 +1546,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1577,7 +1577,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33, typename Context>
typename boost::disable_if<
@@ -1593,7 +1593,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1624,7 +1624,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34, typename Context>
typename boost::disable_if<
@@ -1640,7 +1640,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1671,7 +1671,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35, typename Context>
typename boost::disable_if<
@@ -1687,7 +1687,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1718,7 +1718,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36, typename Context>
typename boost::disable_if<
@@ -1734,7 +1734,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1765,7 +1765,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37, typename Context>
typename boost::disable_if<
@@ -1781,7 +1781,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1812,7 +1812,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38, typename Context>
typename boost::disable_if<
@@ -1828,7 +1828,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1859,7 +1859,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39, typename Context>
typename boost::disable_if<
@@ -1875,7 +1875,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); }
catch(...)
{
boost::phoenix::eval(
diff --git a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_50.hpp b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_50.hpp
index b6acd62d9a..a8119bd579 100644
--- a/boost/phoenix/statement/detail/preprocessed/try_catch_eval_50.hpp
+++ b/boost/phoenix/statement/detail/preprocessed/try_catch_eval_50.hpp
@@ -26,7 +26,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
}
template <typename Try, typename A0, typename Context>
typename boost::disable_if<
@@ -73,7 +73,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
}
template <typename Try, typename A0 , typename A1, typename Context>
typename boost::disable_if<
@@ -89,7 +89,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -120,7 +120,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2, typename Context>
typename boost::disable_if<
@@ -136,7 +136,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -167,7 +167,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3, typename Context>
typename boost::disable_if<
@@ -183,7 +183,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -214,7 +214,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4, typename Context>
typename boost::disable_if<
@@ -230,7 +230,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -261,7 +261,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5, typename Context>
typename boost::disable_if<
@@ -277,7 +277,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -308,7 +308,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6, typename Context>
typename boost::disable_if<
@@ -324,7 +324,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -355,7 +355,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7, typename Context>
typename boost::disable_if<
@@ -371,7 +371,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -402,7 +402,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8, typename Context>
typename boost::disable_if<
@@ -418,7 +418,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -449,7 +449,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9, typename Context>
typename boost::disable_if<
@@ -465,7 +465,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -496,7 +496,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10, typename Context>
typename boost::disable_if<
@@ -512,7 +512,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -543,7 +543,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11, typename Context>
typename boost::disable_if<
@@ -559,7 +559,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -590,7 +590,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12, typename Context>
typename boost::disable_if<
@@ -606,7 +606,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -637,7 +637,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13, typename Context>
typename boost::disable_if<
@@ -653,7 +653,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -684,7 +684,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14, typename Context>
typename boost::disable_if<
@@ -700,7 +700,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -731,7 +731,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15, typename Context>
typename boost::disable_if<
@@ -747,7 +747,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -778,7 +778,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16, typename Context>
typename boost::disable_if<
@@ -794,7 +794,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -825,7 +825,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17, typename Context>
typename boost::disable_if<
@@ -841,7 +841,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -872,7 +872,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18, typename Context>
typename boost::disable_if<
@@ -888,7 +888,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -919,7 +919,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19, typename Context>
typename boost::disable_if<
@@ -935,7 +935,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -966,7 +966,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20, typename Context>
typename boost::disable_if<
@@ -982,7 +982,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1013,7 +1013,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21, typename Context>
typename boost::disable_if<
@@ -1029,7 +1029,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1060,7 +1060,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22, typename Context>
typename boost::disable_if<
@@ -1076,7 +1076,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1107,7 +1107,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23, typename Context>
typename boost::disable_if<
@@ -1123,7 +1123,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1154,7 +1154,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24, typename Context>
typename boost::disable_if<
@@ -1170,7 +1170,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1201,7 +1201,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25, typename Context>
typename boost::disable_if<
@@ -1217,7 +1217,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1248,7 +1248,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26, typename Context>
typename boost::disable_if<
@@ -1264,7 +1264,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1295,7 +1295,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27, typename Context>
typename boost::disable_if<
@@ -1311,7 +1311,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1342,7 +1342,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28, typename Context>
typename boost::disable_if<
@@ -1358,7 +1358,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1389,7 +1389,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29, typename Context>
typename boost::disable_if<
@@ -1405,7 +1405,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1436,7 +1436,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30, typename Context>
typename boost::disable_if<
@@ -1452,7 +1452,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1483,7 +1483,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31, typename Context>
typename boost::disable_if<
@@ -1499,7 +1499,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1530,7 +1530,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32, typename Context>
typename boost::disable_if<
@@ -1546,7 +1546,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1577,7 +1577,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33, typename Context>
typename boost::disable_if<
@@ -1593,7 +1593,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1624,7 +1624,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34, typename Context>
typename boost::disable_if<
@@ -1640,7 +1640,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1671,7 +1671,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35, typename Context>
typename boost::disable_if<
@@ -1687,7 +1687,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1718,7 +1718,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36, typename Context>
typename boost::disable_if<
@@ -1734,7 +1734,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1765,7 +1765,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37, typename Context>
typename boost::disable_if<
@@ -1781,7 +1781,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1812,7 +1812,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38, typename Context>
typename boost::disable_if<
@@ -1828,7 +1828,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1859,7 +1859,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39, typename Context>
typename boost::disable_if<
@@ -1875,7 +1875,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1906,7 +1906,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40, typename Context>
typename boost::disable_if<
@@ -1922,7 +1922,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -1953,7 +1953,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41, typename Context>
typename boost::disable_if<
@@ -1969,7 +1969,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2000,7 +2000,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42, typename Context>
typename boost::disable_if<
@@ -2016,7 +2016,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2047,7 +2047,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43, typename Context>
typename boost::disable_if<
@@ -2063,7 +2063,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2094,7 +2094,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43 , typename A44, typename Context>
typename boost::disable_if<
@@ -2110,7 +2110,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2141,7 +2141,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43 , typename A44 , typename A45, typename Context>
typename boost::disable_if<
@@ -2157,7 +2157,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2188,7 +2188,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43 , typename A44 , typename A45 , typename A46, typename Context>
typename boost::disable_if<
@@ -2204,7 +2204,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2235,7 +2235,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a47), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type &e ) { eval_catch_body(a47, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43 , typename A44 , typename A45 , typename A46 , typename A47, typename Context>
typename boost::disable_if<
@@ -2251,7 +2251,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2282,7 +2282,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a47), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A48 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a48), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type &e ) { eval_catch_body(a47, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A48 , 0 >::type >::type::type &e ) { eval_catch_body(a48, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43 , typename A44 , typename A45 , typename A46 , typename A47 , typename A48, typename Context>
typename boost::disable_if<
@@ -2298,7 +2298,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a47), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type &e ) { eval_catch_body(a47, e, ctx); }
catch(...)
{
boost::phoenix::eval(
@@ -2329,7 +2329,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a47), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A48 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a48), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A49 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a49), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type &e ) { eval_catch_body(a47, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A48 , 0 >::type >::type::type &e ) { eval_catch_body(a48, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A49 , 0 >::type >::type::type &e ) { eval_catch_body(a49, e, ctx); }
}
template <typename Try, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 , typename A11 , typename A12 , typename A13 , typename A14 , typename A15 , typename A16 , typename A17 , typename A18 , typename A19 , typename A20 , typename A21 , typename A22 , typename A23 , typename A24 , typename A25 , typename A26 , typename A27 , typename A28 , typename A29 , typename A30 , typename A31 , typename A32 , typename A33 , typename A34 , typename A35 , typename A36 , typename A37 , typename A38 , typename A39 , typename A40 , typename A41 , typename A42 , typename A43 , typename A44 , typename A45 , typename A46 , typename A47 , typename A48 , typename A49, typename Context>
typename boost::disable_if<
@@ -2345,7 +2345,7 @@
{
boost::phoenix::eval(proto::child_c<0>(try_), ctx);
}
- catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a0), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a1), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a2), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a3), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a4), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a5), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a6), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a7), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a8), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a9), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a10), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a11), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a12), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a13), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a14), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a15), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a16), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a17), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a18), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a19), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a20), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a21), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a22), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a23), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a24), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a25), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a26), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a27), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a28), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a29), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a30), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a31), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a32), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a33), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a34), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a35), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a36), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a37), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a38), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a39), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a40), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a41), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a42), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a43), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a44), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a45), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a46), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a47), ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A48 , 0 >::type >::type::type & ) { boost::phoenix::eval(proto::child_c<1>(a48), ctx); }
+ catch( typename proto::result_of::value< typename proto::result_of::child_c< A0 , 0 >::type >::type::type &e ) { eval_catch_body(a0, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A1 , 0 >::type >::type::type &e ) { eval_catch_body(a1, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A2 , 0 >::type >::type::type &e ) { eval_catch_body(a2, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A3 , 0 >::type >::type::type &e ) { eval_catch_body(a3, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A4 , 0 >::type >::type::type &e ) { eval_catch_body(a4, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A5 , 0 >::type >::type::type &e ) { eval_catch_body(a5, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A6 , 0 >::type >::type::type &e ) { eval_catch_body(a6, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A7 , 0 >::type >::type::type &e ) { eval_catch_body(a7, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A8 , 0 >::type >::type::type &e ) { eval_catch_body(a8, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A9 , 0 >::type >::type::type &e ) { eval_catch_body(a9, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A10 , 0 >::type >::type::type &e ) { eval_catch_body(a10, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A11 , 0 >::type >::type::type &e ) { eval_catch_body(a11, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A12 , 0 >::type >::type::type &e ) { eval_catch_body(a12, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A13 , 0 >::type >::type::type &e ) { eval_catch_body(a13, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A14 , 0 >::type >::type::type &e ) { eval_catch_body(a14, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A15 , 0 >::type >::type::type &e ) { eval_catch_body(a15, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A16 , 0 >::type >::type::type &e ) { eval_catch_body(a16, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A17 , 0 >::type >::type::type &e ) { eval_catch_body(a17, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A18 , 0 >::type >::type::type &e ) { eval_catch_body(a18, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A19 , 0 >::type >::type::type &e ) { eval_catch_body(a19, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A20 , 0 >::type >::type::type &e ) { eval_catch_body(a20, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A21 , 0 >::type >::type::type &e ) { eval_catch_body(a21, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A22 , 0 >::type >::type::type &e ) { eval_catch_body(a22, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A23 , 0 >::type >::type::type &e ) { eval_catch_body(a23, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A24 , 0 >::type >::type::type &e ) { eval_catch_body(a24, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A25 , 0 >::type >::type::type &e ) { eval_catch_body(a25, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A26 , 0 >::type >::type::type &e ) { eval_catch_body(a26, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A27 , 0 >::type >::type::type &e ) { eval_catch_body(a27, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A28 , 0 >::type >::type::type &e ) { eval_catch_body(a28, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A29 , 0 >::type >::type::type &e ) { eval_catch_body(a29, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A30 , 0 >::type >::type::type &e ) { eval_catch_body(a30, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A31 , 0 >::type >::type::type &e ) { eval_catch_body(a31, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A32 , 0 >::type >::type::type &e ) { eval_catch_body(a32, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A33 , 0 >::type >::type::type &e ) { eval_catch_body(a33, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A34 , 0 >::type >::type::type &e ) { eval_catch_body(a34, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A35 , 0 >::type >::type::type &e ) { eval_catch_body(a35, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A36 , 0 >::type >::type::type &e ) { eval_catch_body(a36, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A37 , 0 >::type >::type::type &e ) { eval_catch_body(a37, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A38 , 0 >::type >::type::type &e ) { eval_catch_body(a38, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A39 , 0 >::type >::type::type &e ) { eval_catch_body(a39, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A40 , 0 >::type >::type::type &e ) { eval_catch_body(a40, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A41 , 0 >::type >::type::type &e ) { eval_catch_body(a41, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A42 , 0 >::type >::type::type &e ) { eval_catch_body(a42, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A43 , 0 >::type >::type::type &e ) { eval_catch_body(a43, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A44 , 0 >::type >::type::type &e ) { eval_catch_body(a44, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A45 , 0 >::type >::type::type &e ) { eval_catch_body(a45, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A46 , 0 >::type >::type::type &e ) { eval_catch_body(a46, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A47 , 0 >::type >::type::type &e ) { eval_catch_body(a47, e, ctx); } catch( typename proto::result_of::value< typename proto::result_of::child_c< A48 , 0 >::type >::type::type &e ) { eval_catch_body(a48, e, ctx); }
catch(...)
{
boost::phoenix::eval(
diff --git a/boost/phoenix/statement/detail/try_catch_eval.hpp b/boost/phoenix/statement/detail/try_catch_eval.hpp
index 07cbf69ca7..7dcbbfb86b 100644
--- a/boost/phoenix/statement/detail/try_catch_eval.hpp
+++ b/boost/phoenix/statement/detail/try_catch_eval.hpp
@@ -40,10 +40,10 @@
BOOST_PP_CAT(A, N) \
, 0 \
>::type \
- >::type::type & \
+ >::type::type &e \
) \
{ \
- boost::phoenix::eval(proto::child_c<1>(BOOST_PP_CAT(a, N)), ctx); \
+ eval_catch_body(BOOST_PP_CAT(a, N), e, ctx); \
} \
/**/
diff --git a/boost/phoenix/statement/try_catch.hpp b/boost/phoenix/statement/try_catch.hpp
index a7ea8bf4b3..eb75e2aa63 100644
--- a/boost/phoenix/statement/try_catch.hpp
+++ b/boost/phoenix/statement/try_catch.hpp
@@ -15,7 +15,10 @@
#include <boost/phoenix/core/expression.hpp>
#include <boost/phoenix/core/meta_grammar.hpp>
#include <boost/phoenix/core/is_nullary.hpp>
+#include <boost/phoenix/scope/local_variable.hpp>
+#include <boost/phoenix/scope/scoped_environment.hpp>
#include <boost/proto/functional/fusion/pop_front.hpp>
+#include <boost/core/enable_if.hpp>
#ifdef _MSC_VER
#pragma warning(push)
@@ -52,8 +55,13 @@ namespace boost { namespace phoenix
// bring in the expression definitions
#include <boost/phoenix/statement/detail/try_catch_expression.hpp>
- template <typename A0, typename A1>
+ template <typename A0, typename A1, typename A2 = void>
struct catch_
+ : proto::nary_expr<tag::catch_, A0, A1, A2>
+ {};
+
+ template <typename A0, typename A1>
+ struct catch_<A0, A1, void>
: proto::binary_expr<tag::catch_, A0, A1>
{};
@@ -65,11 +73,26 @@ namespace boost { namespace phoenix
namespace rule
{
- struct catch_
- : expression::catch_<
+ typedef
+ expression::catch_<
proto::terminal<catch_exception<proto::_> >
+ , local_variable
, meta_grammar
>
+ captured_catch;
+
+ typedef
+ expression::catch_<
+ proto::terminal<catch_exception<proto::_> >
+ , meta_grammar
+ >
+ non_captured_catch;
+
+ struct catch_
+ : proto::or_<
+ captured_catch
+ , non_captured_catch
+ >
{};
struct catch_all
@@ -110,6 +133,48 @@ namespace boost { namespace phoenix
void operator()(Try const &, Context const &) const
{}
+ template <typename Catch, typename Exception, typename Context>
+ typename enable_if<proto::matches<Catch, rule::non_captured_catch> >::type
+ eval_catch_body(Catch const &c, Exception & /*unused*/, Context const &ctx) const
+ {
+ phoenix::eval(proto::child_c<1>(c), ctx);
+ }
+
+ template <typename Catch, typename Exception, typename Context>
+ typename enable_if<proto::matches<Catch, rule::captured_catch> >::type
+ eval_catch_body(Catch const &c, Exception &e, Context const &ctx) const
+ {
+ typedef
+ typename proto::detail::uncvref<
+ typename proto::result_of::value<
+ typename proto::result_of::child_c<Catch, 1>::type
+ >::type
+ >::type
+ capture_type;
+ typedef
+ typename proto::detail::uncvref<
+ typename result_of::env<Context>::type
+ >::type
+ env_type;
+ typedef vector1<Exception &> local_type;
+ typedef detail::map_local_index_to_tuple<capture_type> map_type;
+
+ typedef
+ phoenix::scoped_environment<
+ env_type
+ , env_type
+ , local_type
+ , map_type
+ >
+ scoped_env_tpe;
+
+ local_type local = {e};
+
+ scoped_env_tpe env(phoenix::env(ctx), phoenix::env(ctx), local);
+
+ phoenix::eval(proto::child_c<2>(c), phoenix::context(env, phoenix::actions(ctx)));
+ }
+
// bring in the operator overloads
#include <boost/phoenix/statement/detail/try_catch_eval.hpp>
};
@@ -135,12 +200,31 @@ namespace boost { namespace phoenix
>
, proto::when<
phoenix::rule::catch_
- , proto::call<
- evaluator(
- proto::_child_c<1>
- , proto::_data
- , proto::make<proto::empty_env()>
- )
+ , proto::or_<
+ proto::when<
+ phoenix::rule::captured_catch
+ , proto::call<
+ evaluator(
+ proto::_child_c<2>
+ , proto::call<
+ phoenix::functional::context(
+ proto::make<mpl::true_()>
+ , proto::make<detail::scope_is_nullary_actions()>
+ )
+ >
+ , proto::make<proto::empty_env()>
+ )
+ >
+ >
+ , proto::otherwise<
+ proto::call<
+ evaluator(
+ proto::_child_c<1>
+ , proto::_data
+ , proto::make<proto::empty_env()>
+ )
+ >
+ >
>
>
, proto::when<
@@ -181,13 +265,48 @@ namespace boost { namespace phoenix
template <
typename TryCatch
, typename Exception
+ , typename Capture
, typename Expr
, long Arity = proto::arity_of<TryCatch>::value
>
struct catch_push_back;
+ template <typename TryCatch, typename Exception, typename Capture, typename Expr>
+ struct catch_push_back<TryCatch, Exception, Capture, Expr, 1>
+ {
+ typedef
+ typename proto::result_of::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ , catch_exception<Exception>
+ , Capture
+ , Expr
+ >::type
+ catch_expr;
+
+ typedef
+ phoenix::expression::try_catch<
+ TryCatch
+ , catch_expr
+ >
+ gen_type;
+ typedef typename gen_type::type type;
+
+ static type make(TryCatch const & try_catch, Capture const & capture, Expr const & catch_)
+ {
+ return
+ gen_type::make(
+ try_catch
+ , proto::make_expr<
+ phoenix::tag::catch_
+ , proto::basic_default_domain
+ >(catch_exception<Exception>(), capture, catch_)
+ );
+ }
+ };
+
template <typename TryCatch, typename Exception, typename Expr>
- struct catch_push_back<TryCatch, Exception, Expr, 1>
+ struct catch_push_back<TryCatch, Exception, void, Expr, 1>
{
typedef
typename proto::result_of::make_expr<
@@ -271,9 +390,39 @@ namespace boost { namespace phoenix
>
{};
- template <typename TryCatch, typename Exception>
+ template <typename TryCatch, typename Exception, typename Capture = void>
struct catch_gen
{
+ catch_gen(TryCatch const& try_catch_, Capture const& capture)
+ : try_catch(try_catch_)
+ , capture(capture) {}
+
+ template <typename Expr>
+ typename boost::disable_if<
+ proto::matches<
+ typename proto::result_of::child_c<
+ TryCatch
+ , proto::arity_of<TryCatch>::value - 1
+ >::type
+ , rule::catch_all
+ >
+ , typename detail::catch_push_back<TryCatch, Exception, Capture, Expr>::type
+ >::type
+ operator[](Expr const& expr) const
+ {
+ return
+ detail::catch_push_back<TryCatch, Exception, Capture, Expr>::make(
+ try_catch, capture, expr
+ );
+ }
+
+ TryCatch const & try_catch;
+ Capture const & capture;
+ };
+
+ template <typename TryCatch, typename Exception>
+ struct catch_gen<TryCatch, Exception, void>
+ {
catch_gen(TryCatch const& try_catch_) : try_catch(try_catch_) {}
template <typename Expr>
@@ -285,12 +434,12 @@ namespace boost { namespace phoenix
>::type
, rule::catch_all
>
- , typename detail::catch_push_back<TryCatch, Exception, Expr>::type
+ , typename detail::catch_push_back<TryCatch, Exception, void, Expr>::type
>::type
operator[](Expr const& expr) const
{
return
- detail::catch_push_back<TryCatch, Exception, Expr>::make(
+ detail::catch_push_back<TryCatch, Exception, void, Expr>::make(
try_catch, expr
);
}
@@ -349,6 +498,13 @@ namespace boost { namespace phoenix
return catch_gen<that_type, Exception>(*this);
}
+ template <typename Exception, typename Capture>
+ catch_gen<that_type, Exception, Capture> const
+ catch_(Capture const &expr) const
+ {
+ return catch_gen<that_type, Exception, Capture>(*this, expr);
+ }
+
catch_all_gen<that_type> const catch_all;
};
diff --git a/boost/phoenix/stl/algorithm/detail/begin.hpp b/boost/phoenix/stl/algorithm/detail/begin.hpp
index 40102d7e14..12fb314a90 100644
--- a/boost/phoenix/stl/algorithm/detail/begin.hpp
+++ b/boost/phoenix/stl/algorithm/detail/begin.hpp
@@ -1,7 +1,8 @@
-// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Daniel Wallin.
// Copyright 2005 Joel de Guzman.
+// Copyright 2015 John Fletcher.
//
-// Use, modification and distribution is subject to the Boost Software
+// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
@@ -10,14 +11,15 @@
#ifndef BOOST_PHOENIX_ALGORITHM_DETAIL_BEGIN_HPP
#define BOOST_PHOENIX_ALGORITHM_DETAIL_BEGIN_HPP
-#include <boost/range/result_iterator.hpp>
+//#include <boost/range/result_iterator.hpp> is deprecated
+#include <boost/range/iterator.hpp>
#include <boost/range/begin.hpp>
namespace boost { namespace phoenix {
namespace detail
{
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
begin_(R& r)
{
return boost::begin(r);
diff --git a/boost/phoenix/stl/algorithm/detail/end.hpp b/boost/phoenix/stl/algorithm/detail/end.hpp
index 939e12eabb..26d18801b2 100644
--- a/boost/phoenix/stl/algorithm/detail/end.hpp
+++ b/boost/phoenix/stl/algorithm/detail/end.hpp
@@ -1,7 +1,8 @@
-// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Daniel Wallin.
// Copyright 2005 Joel de Guzman.
+// Copyright 2015 John Fletcher.
//
-// Use, modification and distribution is subject to the Boost Software
+// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
@@ -10,14 +11,15 @@
#ifndef BOOST_PHOENIX_ALGORITHM_DETAIL_END_HPP
#define BOOST_PHOENIX_ALGORITHM_DETAIL_END_HPP
-#include <boost/range/result_iterator.hpp>
+//#include <boost/range/result_iterator.hpp> is deprecated
+#include <boost/range/iterator.hpp>
#include <boost/range/end.hpp>
namespace boost { namespace phoenix {
namespace detail
-{
+{
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
end_(R& r)
{
return boost::end(r);
diff --git a/boost/phoenix/stl/algorithm/detail/has_find.hpp b/boost/phoenix/stl/algorithm/detail/has_find.hpp
index cc6cf90960..b089305bac 100644
--- a/boost/phoenix/stl/algorithm/detail/has_find.hpp
+++ b/boost/phoenix/stl/algorithm/detail/has_find.hpp
@@ -1,5 +1,7 @@
+///////////////////////////////////////////////////////////////////////////////
// Copyright 2005 Daniel Wallin.
// Copyright 2005 Joel de Guzman.
+// Copyright 2015 John Fletcher
//
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -44,4 +46,7 @@ namespace boost
};
}
+// Bring in unordered_set and unordered_map stuff.
+#include "./is_unordered_set_or_map.hpp"
+
#endif
diff --git a/boost/phoenix/stl/algorithm/detail/is_unordered_set_or_map.hpp b/boost/phoenix/stl/algorithm/detail/is_unordered_set_or_map.hpp
new file mode 100644
index 0000000000..34d8230c55
--- /dev/null
+++ b/boost/phoenix/stl/algorithm/detail/is_unordered_set_or_map.hpp
@@ -0,0 +1,144 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+// Copyright 2015 John Fletcher
+//
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// This is based on is_std_hash_map.hpp which was
+// modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// is_unordered_set_or_map.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+// Definitions of overloads for the use of find with unordered types.
+
+#ifndef BOOST_PHOENIX_IS_STD_UNORDERED_SET_OR_MAP
+#define BOOST_PHOENIX_IS_STD_UNORDERED_SET_OR_MAP
+
+#include <boost/mpl/bool.hpp>
+#include "./std_unordered_set_or_map_fwd.hpp"
+
+#ifdef BOOST_PHOENIX_HAS_UNORDERED_SET_AND_MAP
+
+namespace boost
+{
+ template<class T>
+ struct is_std_unordered_set
+ : boost::mpl::false_
+ {};
+
+ template<class T>
+ struct is_std_unordered_multiset
+ : boost::mpl::false_
+ {};
+
+ template<class T>
+ struct is_std_unordered_map
+ : boost::mpl::false_
+ {};
+
+ template<class T>
+ struct is_std_unordered_multimap
+ : boost::mpl::false_
+ {};
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_unordered_set< std::unordered_set<Kty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_unordered_multiset< std::unordered_multiset<Kty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_unordered_map< std::unordered_map<Kty,Ty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct is_std_unordered_multimap< std::unordered_multimap<Kty,Ty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {};
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct has_find< std::unordered_set<Kty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {
+ };
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct has_find< std::unordered_multiset<Kty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {
+ };
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct has_find< std::unordered_map<Kty,Ty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {
+ };
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ struct has_find< std::unordered_multimap<Kty,Ty,Hash,Cmp,Alloc> >
+ : boost::mpl::true_
+ {
+ };
+
+
+}
+
+#endif
+
+
+#endif
diff --git a/boost/phoenix/stl/algorithm/detail/std_unordered_set_or_map_fwd.hpp b/boost/phoenix/stl/algorithm/detail/std_unordered_set_or_map_fwd.hpp
new file mode 100644
index 0000000000..251309a435
--- /dev/null
+++ b/boost/phoenix/stl/algorithm/detail/std_unordered_set_or_map_fwd.hpp
@@ -0,0 +1,73 @@
+/////////////////////////////////////////////////////////////////////////////
+// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Joel de Guzman.
+// Copyright 2015 John Fletcher
+//
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// Modeled after range_ex, Copyright 2004 Eric Niebler
+///////////////////////////////////////////////////////////////////////////////
+//
+// std_unordered_set_or_map_fwd.hpp
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_PHOENIX_STD_UNORDERED_SET_OR_MAP_FWD
+#define BOOST_PHOENIX_STD_UNORDERED_SET_OR_MAP_FWD
+
+#include <boost/phoenix/config.hpp>
+
+#ifdef BOOST_PHOENIX_HAS_UNORDERED_SET_AND_MAP
+#ifdef BOOST_PHOENIX_USING_LIBCPP
+// Advance declaration not working for libc++
+#include <unordered_set>
+#include <unordered_map>
+#else
+
+
+
+namespace std {
+
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class unordered_set;
+
+ template<
+ class Kty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class unordered_multiset;
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class unordered_map;
+
+ template<
+ class Kty
+ , class Ty
+ , class Hash
+ , class Cmp
+ , class Alloc
+ >
+ class unordered_multimap;
+}
+#endif
+
+
+#endif
+
+#endif
diff --git a/boost/phoenix/stl/algorithm/querying.hpp b/boost/phoenix/stl/algorithm/querying.hpp
index 08c308974a..12a3bb72dc 100644
--- a/boost/phoenix/stl/algorithm/querying.hpp
+++ b/boost/phoenix/stl/algorithm/querying.hpp
@@ -1,9 +1,10 @@
-// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Daniel Wallin.
// Copyright 2005 Joel de Guzman.
-// Copyright 2005 Dan Marsden.
-// Copyright 2008 Hartmut Kaiser.
+// Copyright 2005 Dan Marsden.
+// Copyright 2008 Hartmut Kaiser.
+// Copyright 2015 John Fletcher.
//
-// Use, modification and distribution is subject to the Boost Software
+// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
@@ -26,7 +27,8 @@
#include <boost/phoenix/function/adapt_callable.hpp>
-#include <boost/range/result_iterator.hpp>
+//#include <boost/range/result_iterator.hpp> is deprecated
+#include <boost/range/iterator.hpp>
#include <boost/range/difference_type.hpp>
namespace boost { namespace phoenix {
@@ -39,25 +41,25 @@ namespace boost { namespace phoenix {
template <typename This, class R, class T>
struct result<This(R&, T const&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& x, mpl::true_) const
{
return r.find(x);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& x, mpl::false_) const
{
return std::find(detail::begin_(r), detail::end_(r), x);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, T const& x) const
{
return execute(r, x, has_find<R>());
@@ -71,11 +73,11 @@ namespace boost { namespace phoenix {
template <typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return std::find_if(detail::begin_(r), detail::end_(r), p);
@@ -89,16 +91,16 @@ namespace boost { namespace phoenix {
template<typename This, class R, class R2>
struct result<This(R&, R2&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<typename This, class R, class R2, class P>
struct result<This(R&, R2&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class R2>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, R2& r2) const
{
return std::find_end(
@@ -110,7 +112,7 @@ namespace boost { namespace phoenix {
}
template<class R, class R2, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, R2& r2, P p) const
{
return std::find_end(
@@ -130,16 +132,16 @@ namespace boost { namespace phoenix {
template<typename This, class R, class R2>
struct result<This(R&, R2&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<typename This, class R, class R2, class P>
struct result<This(R&, R2&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class R2>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, R2& r2) const
{
return std::find_first_of(
@@ -151,7 +153,7 @@ namespace boost { namespace phoenix {
}
template<class R, class R2, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, R2& r2, P p) const
{
return std::find_first_of(
@@ -171,23 +173,23 @@ namespace boost { namespace phoenix {
template <typename This, class R>
struct result<This(R&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template <typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r) const
{
return std::adjacent_find(detail::begin_(r), detail::end_(r));
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return std::adjacent_find(detail::begin_(r), detail::end_(r), p);
@@ -272,16 +274,16 @@ namespace boost { namespace phoenix {
template <typename This, class R, typename R2>
struct result<This(R&, R2&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template <typename This, class R, typename R2, class P>
struct result<This(R&, R2&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class R2>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, R2& r2) const
{
return std::search(
@@ -293,7 +295,7 @@ namespace boost { namespace phoenix {
}
template<class R, class R2, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, R2& r2, P p) const
{
return std::search(
@@ -313,37 +315,37 @@ namespace boost { namespace phoenix {
template <typename This, class R, class T>
struct result<This(R&, T const&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template <typename This, class R, class T, class C>
struct result<This(R&, T const&, C)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& val, mpl::true_) const
{
return r.lower_bound(val);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& val, mpl::false_) const
{
return std::lower_bound(detail::begin_(r), detail::end_(r), val);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, T const& val) const
{
return execute(r, val, has_lower_bound<R>());
}
template<class R, class T, class C>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, T const& val, C c) const
{
return std::lower_bound(detail::begin_(r), detail::end_(r), val, c);
@@ -357,37 +359,37 @@ namespace boost { namespace phoenix {
template <typename This, class R, class T>
struct result<This(R&, T const&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template <typename This, class R, class T, class C>
struct result<This(R&, T const&, C)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& val, mpl::true_) const
{
return r.upper_bound(val);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& val, mpl::false_) const
{
return std::upper_bound(detail::begin_(r), detail::end_(r), val);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, T const& val) const
{
return execute(r, val, has_upper_bound<R>());
}
template<class R, class T, class C>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, T const& val, C c) const
{
return std::upper_bound(detail::begin_(r), detail::end_(r), val, c);
@@ -400,8 +402,8 @@ namespace boost { namespace phoenix {
struct equal_range
{
typedef std::pair<
- typename range_result_iterator<R>::type
- , typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
+ , typename range_iterator<R>::type
> type;
};
}
@@ -456,7 +458,7 @@ namespace boost { namespace phoenix {
struct mismatch
{
typedef std::pair<
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
, typename detail::decay_array<I>::type
> type;
};
@@ -540,23 +542,23 @@ namespace boost { namespace phoenix {
template <typename This, class R>
struct result<This(R&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template <typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r) const
{
return std::min_element(detail::begin_(r), detail::end_(r));
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return std::min_element(detail::begin_(r), detail::end_(r), p);
@@ -570,23 +572,23 @@ namespace boost { namespace phoenix {
template <typename This, class R>
struct result<This(R&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template <typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r) const
{
return std::max_element(detail::begin_(r), detail::end_(r));
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return std::max_element(detail::begin_(r), detail::end_(r), p);
diff --git a/boost/phoenix/stl/algorithm/transformation.hpp b/boost/phoenix/stl/algorithm/transformation.hpp
index 8d46d34b1e..ee232327d2 100644
--- a/boost/phoenix/stl/algorithm/transformation.hpp
+++ b/boost/phoenix/stl/algorithm/transformation.hpp
@@ -1,8 +1,9 @@
-// Copyright 2005 Daniel Wallin.
+// Copyright 2005 Daniel Wallin.
// Copyright 2005 Joel de Guzman.
-// Copyright 2005 Dan Marsden.
+// Copyright 2005 Dan Marsden.
+// Copyright 2015 John Fletcher.
//
-// Use, modification and distribution is subject to the Boost Software
+// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
@@ -28,7 +29,8 @@
#include <boost/phoenix/function/adapt_callable.hpp>
-#include <boost/range/result_iterator.hpp>
+//#include <boost/range/result_iterator.hpp> is deprecated
+#include <boost/range/iterator.hpp>
#include <boost/range/difference_type.hpp>
#include <boost/mpl/if.hpp>
@@ -237,12 +239,12 @@ namespace boost { namespace phoenix { namespace impl
template<typename This, class R, class T>
struct result<This(R&, T const&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{
};
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& x, mpl::true_) const
{
r.remove(x);
@@ -250,14 +252,14 @@ namespace boost { namespace phoenix { namespace impl
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, T const& x, mpl::false_) const
{
return std::remove(detail::begin_(r), detail::end_(r), x);
}
template<class R, class T>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, T const& x) const
{
return execute(r, x, has_remove<R>());
@@ -271,12 +273,12 @@ namespace boost { namespace phoenix { namespace impl
template <typename This, class R, class P>
struct result<This(R&,P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{
};
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, P p, mpl::true_) const
{
r.remove_if(p);
@@ -284,14 +286,14 @@ namespace boost { namespace phoenix { namespace impl
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, P p, mpl::false_) const
{
return std::remove_if(detail::begin_(r), detail::end_(r), p);
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return execute(r, p, has_remove_if<R>());
@@ -341,16 +343,16 @@ namespace boost { namespace phoenix { namespace impl
template<typename This, class R>
struct result<This(R&)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, mpl::true_) const
{
r.unique();
@@ -358,14 +360,14 @@ namespace boost { namespace phoenix { namespace impl
}
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, mpl::false_) const
{
return std::unique(detail::begin_(r), detail::end_(r));
}
template<class R>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r) const
{
return execute(r, has_unique<R>());
@@ -373,7 +375,7 @@ namespace boost { namespace phoenix { namespace impl
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, P p, mpl::true_) const
{
r.unique(p);
@@ -381,14 +383,14 @@ namespace boost { namespace phoenix { namespace impl
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
execute(R& r, P p, mpl::false_) const
{
return std::unique(detail::begin_(r), detail::end_(r), p);
}
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return execute(r, p, has_unique<R>());
@@ -537,11 +539,11 @@ namespace boost { namespace phoenix { namespace impl
template <typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return std::partition(detail::begin_(r), detail::end_(r), p);
@@ -555,11 +557,11 @@ namespace boost { namespace phoenix { namespace impl
template <typename This, class R, class P>
struct result<This(R&, P)>
- : range_result_iterator<R>
+ : range_iterator<R>
{};
template<class R, class P>
- typename range_result_iterator<R>::type
+ typename range_iterator<R>::type
operator()(R& r, P p) const
{
return std::stable_partition(detail::begin_(r), detail::end_(r), p);
@@ -648,16 +650,16 @@ namespace boost { namespace phoenix { namespace impl
template <typename This, class R1, class R2>
struct result<This(R1&, R2&)>
- : range_result_iterator<R2>
+ : range_iterator<R2>
{};
template <typename This, class R1, class R2, class C>
struct result<This(R1&, R2&, C)>
- : range_result_iterator<R2>
+ : range_iterator<R2>
{};
template <class R1, class R2>
- typename range_result_iterator<R2>::type
+ typename range_iterator<R2>::type
operator()(R1& r1, R2& r2) const
{
return std::partial_sort_copy(
@@ -667,7 +669,7 @@ namespace boost { namespace phoenix { namespace impl
}
template <class R1, class R2, class C>
- typename range_result_iterator<R2>::type
+ typename range_iterator<R2>::type
operator()(R1& r1, R2& r2, C c) const
{
return std::partial_sort_copy(
diff --git a/boost/polygon/detail/boolean_op.hpp b/boost/polygon/detail/boolean_op.hpp
index d3e3614fe5..0c674a22b3 100644
--- a/boost/polygon/detail/boolean_op.hpp
+++ b/boost/polygon/detail/boolean_op.hpp
@@ -380,12 +380,6 @@ namespace boolean_op {
inputOutput.insert(inputOutput.end(), output.begin(), output.end());
}
- template <typename Unit>
- inline void applyUnaryXOr(std::vector<std::pair<Unit, std::pair<Unit, int> > >& input) {
- BooleanOp<UnaryCount, Unit> booleanXOr;
-
- }
-
template <typename count_type = int>
struct default_arg_workaround {
template <typename Unit>
diff --git a/boost/polygon/detail/boolean_op_45.hpp b/boost/polygon/detail/boolean_op_45.hpp
index b2130ce857..bfc6e2f78b 100644
--- a/boost/polygon/detail/boolean_op_45.hpp
+++ b/boost/polygon/detail/boolean_op_45.hpp
@@ -272,13 +272,9 @@ namespace boost { namespace polygon{
inline Vertex45T(const Vertex45T& vertex) : pt(vertex.pt), rise(vertex.rise), count(vertex.count) {}
inline Vertex45T& operator=(const Vertex45T& vertex){
pt = vertex.pt; rise = vertex.rise; count = vertex.count; return *this; }
- inline Vertex45T(const std::pair<Point, Point>& vertex) : pt(), rise(), count() {}
- inline Vertex45T& operator=(const std::pair<Point, Point>& vertex){ return *this; }
inline bool operator==(const Vertex45T& vertex) const {
return pt == vertex.pt && rise == vertex.rise && count == vertex.count; }
inline bool operator!=(const Vertex45T& vertex) const { return !((*this) == vertex); }
- inline bool operator==(const std::pair<Point, Point>& vertex) const { return false; }
- inline bool operator!=(const std::pair<Point, Point>& vertex) const { return !((*this) == vertex); }
inline bool operator<(const Vertex45T& vertex) const {
if(pt.x() < vertex.pt.x()) return true;
if(pt.x() == vertex.pt.x()) {
diff --git a/boost/polygon/detail/polygon_45_formation.hpp b/boost/polygon/detail/polygon_45_formation.hpp
index 2e16570137..7034986938 100644
--- a/boost/polygon/detail/polygon_45_formation.hpp
+++ b/boost/polygon/detail/polygon_45_formation.hpp
@@ -506,8 +506,6 @@ namespace boost { namespace polygon{
inline bool operator==(const Vertex45CompactT& vertex) const {
return pt == vertex.pt && count == vertex.count; }
inline bool operator!=(const Vertex45CompactT& vertex) const { return !((*this) == vertex); }
- inline bool operator==(const std::pair<Point, Point>& vertex) const { return false; }
- inline bool operator!=(const std::pair<Point, Point>& vertex) const { return !((*this) == vertex); }
inline bool operator<(const Vertex45CompactT& vertex) const {
if(pt.x() < vertex.pt.x()) return true;
if(pt.x() == vertex.pt.x()) {
@@ -2152,10 +2150,6 @@ namespace boost { namespace polygon{
inline iterator begin() const { return p_->getTail()->begin(); }
inline iterator end() const { return p_->getTail()->end(); }
inline std::size_t size() const { return 0; }
- template<class iT>
- inline PolyLine45HoleData& set(iT inputBegin, iT inputEnd) {
- return *this;
- }
private:
ActiveTail45* p_;
};
@@ -2221,17 +2215,6 @@ namespace boost { namespace polygon{
//stub out these four required functions that will not be used but are needed for the interface
inline std::size_t size_holes() const { return 0; }
inline std::size_t size() const { return 0; }
- template<class iT>
- inline PolyLine45PolygonData& set(iT inputBegin, iT inputEnd) {
- return *this;
- }
-
- // initialize a polygon from x,y values, it is assumed that the first is an x
- // and that the input is a well behaved polygon
- template<class iT>
- inline PolyLine45PolygonData& set_holes(iT inputBegin, iT inputEnd) {
- return *this;
- }
private:
ActiveTail45* p_;
};
diff --git a/boost/polygon/detail/polygon_90_set_view.hpp b/boost/polygon/detail/polygon_90_set_view.hpp
index f6ee36c5b6..7e93b0343f 100644
--- a/boost/polygon/detail/polygon_90_set_view.hpp
+++ b/boost/polygon/detail/polygon_90_set_view.hpp
@@ -201,11 +201,11 @@ namespace boost { namespace polygon{
template <typename ltype, typename rtype, typename op_type>
bool polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >::
clean(const polygon_90_set_view<ltype, rtype, op_type>& polygon_set) {
- return true; }
+ return !polygon_set.dirty(); }
template <typename ltype, typename rtype, typename op_type>
bool polygon_90_set_traits<polygon_90_set_view<ltype, rtype, op_type> >::
sorted(const polygon_90_set_view<ltype, rtype, op_type>& polygon_set) {
- return true; }
+ return polygon_set.sorted(); }
template <typename value_type, typename arg_type>
inline void insert_into_view_arg(value_type& dest, const arg_type& arg, orientation_2d orient) {
diff --git a/boost/polygon/detail/polygon_arbitrary_formation.hpp b/boost/polygon/detail/polygon_arbitrary_formation.hpp
index 6f9eb7394f..a5a63833b1 100644
--- a/boost/polygon/detail/polygon_arbitrary_formation.hpp
+++ b/boost/polygon/detail/polygon_arbitrary_formation.hpp
@@ -338,12 +338,6 @@ namespace boost { namespace polygon{
};
template <typename unsigned_product_type>
- static inline void unsigned_mod(unsigned_product_type& result, int& result_sign, unsigned_product_type a, int a_sign, unsigned_product_type b, int b_sign) {
- result = a % b;
- result_sign = a_sign;
- }
-
- template <typename unsigned_product_type>
static inline void unsigned_add(unsigned_product_type& result, int& result_sign, unsigned_product_type a, int a_sign, unsigned_product_type b, int b_sign) {
int switcher = 0;
if(a_sign < 0) switcher += 1;
@@ -739,13 +733,9 @@ namespace boost { namespace polygon{
inline vertex_half_edge(const vertex_half_edge& vertex) : pt(vertex.pt), other_pt(vertex.other_pt), count(vertex.count) {}
inline vertex_half_edge& operator=(const vertex_half_edge& vertex){
pt = vertex.pt; other_pt = vertex.other_pt; count = vertex.count; return *this; }
- inline vertex_half_edge(const std::pair<Point, Point>& vertex) : pt(), other_pt(), count() {}
- inline vertex_half_edge& operator=(const std::pair<Point, Point>& vertex){ return *this; }
inline bool operator==(const vertex_half_edge& vertex) const {
return pt == vertex.pt && other_pt == vertex.other_pt && count == vertex.count; }
inline bool operator!=(const vertex_half_edge& vertex) const { return !((*this) == vertex); }
- inline bool operator==(const std::pair<Point, Point>& vertex) const { return false; }
- inline bool operator!=(const std::pair<Point, Point>& vertex) const { return !((*this) == vertex); }
inline bool operator<(const vertex_half_edge& vertex) const {
if(pt.get(HORIZONTAL) < vertex.pt.get(HORIZONTAL)) return true;
if(pt.get(HORIZONTAL) == vertex.pt.get(HORIZONTAL)) {
@@ -1283,13 +1273,9 @@ namespace boost { namespace polygon{
inline vertex_arbitrary_compact(const vertex_arbitrary_compact& vertex) : pt(vertex.pt), count(vertex.count) {}
inline vertex_arbitrary_compact& operator=(const vertex_arbitrary_compact& vertex){
pt = vertex.pt; count = vertex.count; return *this; }
- //inline vertex_arbitrary_compact(const std::pair<Point, Point>& vertex) {}
- inline vertex_arbitrary_compact& operator=(const std::pair<Point, Point>& vertex){ return *this; }
inline bool operator==(const vertex_arbitrary_compact& vertex) const {
return pt == vertex.pt && count == vertex.count; }
inline bool operator!=(const vertex_arbitrary_compact& vertex) const { return !((*this) == vertex); }
- inline bool operator==(const std::pair<Point, Point>& vertex) const { return false; }
- inline bool operator!=(const std::pair<Point, Point>& vertex) const { return !((*this) == vertex); }
inline bool operator<(const vertex_arbitrary_compact& vertex) const {
if(pt.get(HORIZONTAL) < vertex.pt.get(HORIZONTAL)) return true;
if(pt.get(HORIZONTAL) == vertex.pt.get(HORIZONTAL)) {
@@ -2140,19 +2126,7 @@ namespace boost { namespace polygon{
//use default copy and assign
inline iterator begin() const { return p_->getTail()->begin(); }
inline iterator end() const { return p_->getTail()->end(); }
- //inline compact_iterator_type begin_compact() const { return compact_iterator_type(begin()); }
- //inline compact_iterator_type end_compact() const { return compact_iterator_type(end()); }
inline std::size_t size() const { return 0; }
- template<class iT>
- inline poly_line_arbitrary_hole_data& set(iT inputBegin, iT inputEnd) {
- //assert this is not called
- return *this;
- }
- template<class iT>
- inline poly_line_arbitrary_hole_data& set_compact(iT inputBegin, iT inputEnd) {
- //assert this is not called
- return *this;
- }
};
template <typename Unit>
@@ -2219,18 +2193,6 @@ namespace boost { namespace polygon{
//stub out these four required functions that will not be used but are needed for the interface
inline std::size_t size_holes() const { return 0; }
inline std::size_t size() const { return 0; }
- template<class iT>
- inline poly_line_arbitrary_polygon_data& set(iT inputBegin, iT inputEnd) {
- return *this;
- }
- template<class iT>
- inline poly_line_arbitrary_polygon_data& set_compact(iT inputBegin, iT inputEnd) {
- return *this;
- }
- template<class iT>
- inline poly_line_arbitrary_polygon_data& set_holes(iT inputBegin, iT inputEnd) {
- return *this;
- }
};
template <typename Unit>
diff --git a/boost/polygon/detail/polygon_formation.hpp b/boost/polygon/detail/polygon_formation.hpp
index be2f54351d..f4c0d70d9c 100644
--- a/boost/polygon/detail/polygon_formation.hpp
+++ b/boost/polygon/detail/polygon_formation.hpp
@@ -1,6 +1,6 @@
/*
Copyright 2008 Intel Corporation
-
+
Use, modification and distribution are subject to the Boost Software License,
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt).
@@ -27,24 +27,24 @@ namespace polygon_formation {
* TAIL End is represented by true because TAIL comes after head and 1 after 0
*/
const End TAIL = true;
-
+
/*
* 2D turning direction, left and right sides (is a boolean value since it has two states.)
*/
typedef bool Side;
-
+
/*
* LEFT Side is 0 because we inuitively think left to right; left < right
*/
const Side LEFT = false;
-
+
/*
* RIGHT Side is 1 so that right > left
*/
const Side RIGHT = true;
/*
- * The PolyLine class is data storage and services for building and representing partial polygons.
+ * The PolyLine class is data storage and services for building and representing partial polygons.
* As the polyline is added to it extends its storage to accomodate the data.
* PolyLines can be joined head-to-head/head-to-tail when it is determined that two polylines are
* part of the same polygon.
@@ -61,14 +61,14 @@ namespace polygon_formation {
class PolyLine {
private:
//data
-
+
/*
* ptdata_ a vector of coordiantes
* if VERTICAL_HEAD, first coordiante is an X
* else first coordinate is a Y
*/
std::vector<Unit> ptdata_;
-
+
/*
* head and tail points to other polylines before and after this in a chain
*/
@@ -89,18 +89,18 @@ namespace polygon_formation {
* default constructor (for preallocation)
*/
PolyLine();
-
+
/*
* constructor that takes the orientation, coordiante and side to which there is solid
*/
PolyLine(orientation_2d orient, Unit coord, Side side);
-
+
//copy constructor
PolyLine(const PolyLine& pline);
-
+
//destructor
~PolyLine();
-
+
//assignment operator
PolyLine& operator=(const PolyLine& that);
@@ -120,18 +120,18 @@ namespace polygon_formation {
/*
* returns true if first coordinate is an X value (first segment is vertical)
*/
- bool verticalHead() const;
+ bool verticalHead() const;
/*
* returns the orientation_2d fo the tail
*/
orientation_2d tailOrient() const;
-
+
/*
* returns true if last coordinate is an X value (last segment is vertical)
*/
bool verticalTail() const;
-
+
/*
* retrun true if PolyLine has odd number of coordiantes
*/
@@ -159,7 +159,7 @@ namespace polygon_formation {
* retrun true if the tail of this polyline is connect to the head of a polyline
*/
bool tailToHead() const;
-
+
/*
* retrun the side on which there is solid for this polyline
*/
@@ -179,12 +179,12 @@ namespace polygon_formation {
* adds a coordinate value to the end of the polyline changing the tail orientation
*/
PolyLine& pushCoordinate(Unit coord);
-
+
/*
* removes a coordinate value at the end of the polyline changing the tail orientation
*/
PolyLine& popCoordinate();
-
+
/*
* extends the tail of the polyline to include the point, changing orientation if needed
*/
@@ -301,7 +301,7 @@ namespace polygon_formation {
* that edge is supposed to be solid or space. Any incomplete polygon will have two active tails. Active tails
* may be joined together to merge two incomplete polygons into a larger incomplete polygon. If two active tails
* that are to be merged are the oppositve ends of the same incomplete polygon that indicates that the polygon
- * has been closed and is complete. The active tail keeps a pointer to the other active tail of its incomplete
+ * has been closed and is complete. The active tail keeps a pointer to the other active tail of its incomplete
* polygon so that it is easy to check this condition. These pointers are updated when active tails are joined.
* The active tail also keeps a list of pointers to active tail objects that serve as handles to closed holes. In
* this way a hole can be associated to another incomplete polygon, which will eventually be its enclosing shell,
@@ -316,11 +316,11 @@ namespace polygon_formation {
class ActiveTail {
private:
//data
- PolyLine<Unit>* tailp_;
+ PolyLine<Unit>* tailp_;
ActiveTail *otherTailp_;
std::list<ActiveTail*> holesList_;
//Sum of all the polylines which constitute the active tail (including holes)//
- size_t polyLineSize_;
+ size_t polyLineSize_;
public:
inline size_t getPolyLineSize(){
@@ -334,7 +334,7 @@ namespace polygon_formation {
inline void addPolyLineSize(int delta){
polyLineSize_ += delta;
}
-
+
/*
* iterator over coordinates of the figure
*/
@@ -347,7 +347,7 @@ namespace polygon_formation {
End startEnd_;
public:
inline iterator() : pLine_(), pLineEnd_(), index_(), indexEnd_(), startEnd_() {}
- inline iterator(const ActiveTail* at, bool isHole, orientation_2d orient) :
+ inline iterator(const ActiveTail* at, bool isHole, orientation_2d orient) :
pLine_(), pLineEnd_(), index_(), indexEnd_(), startEnd_() {
//if it is a hole and orientation is vertical or it is not a hole and orientation is horizontal
//we want to use this active tail, otherwise we want to use the other active tail
@@ -391,11 +391,11 @@ namespace polygon_formation {
while(currLine != pLineEnd_){
ops++;
count += currLine->numSegments();
- currLine = currLine->next(dir == HEAD ? TAIL : HEAD);
- dir = currLine->endConnectivity(dir == HEAD ? TAIL : HEAD);
+ currLine = currLine->next(dir == HEAD ? TAIL : HEAD);
+ dir = currLine->endConnectivity(dir == HEAD ? TAIL : HEAD);
}
count += pLineEnd_->numSegments();
- return count; //no. of vertices
+ return count; //no. of vertices
}
//use bitwise copy and assign provided by the compiler
@@ -596,7 +596,7 @@ namespace polygon_formation {
/* deallocate an activetail object */
template <typename Unit>
void destroyActiveTail(ActiveTail<Unit>* aTail);
-
+
template<bool orientT, typename Unit>
class PolyLineHoleData {
private:
@@ -612,19 +612,10 @@ namespace polygon_formation {
inline compact_iterator_type end_compact() const { return p_->end(); }
inline iterator_type begin() const { return iterator_type(begin_compact(), end_compact()); }
inline iterator_type end() const { return iterator_type(end_compact(), end_compact()); }
- inline std::size_t size() const {
+ inline std::size_t size() const {
return p_->getPolyLineSize();
}
inline ActiveTail<Unit>* yield() { return p_; }
- template<class iT>
- inline PolyLineHoleData& set(iT inputBegin, iT inputEnd) {
- return *this;
- }
- template<class iT>
- inline PolyLineHoleData& set_compact(iT inputBegin, iT inputEnd) {
- return *this;
- }
-
};
template<bool orientT, typename Unit>
@@ -676,21 +667,6 @@ namespace polygon_formation {
//stub out these four required functions that will not be used but are needed for the interface
inline std::size_t size_holes() const { return 0; }
inline std::size_t size() const { return 0; }
- template<class iT>
- inline PolyLinePolygonWithHolesData& set(iT inputBegin, iT inputEnd) {
- return *this;
- }
- template<class iT>
- inline PolyLinePolygonWithHolesData& set_compact(iT inputBegin, iT inputEnd) {
- return *this;
- }
-
- // initialize a polygon from x,y values, it is assumed that the first is an x
- // and that the input is a well behaved polygon
- template<class iT>
- inline PolyLinePolygonWithHolesData& set_holes(iT inputBegin, iT inputEnd) {
- return *this;
- }
};
@@ -717,34 +693,34 @@ namespace polygon_formation {
std::vector<PolyLinePolygonData> outputPolygons_;
bool fractureHoles_;
public:
- typedef typename std::vector<PolyLinePolygonData>::iterator iterator;
+ typedef typename std::vector<PolyLinePolygonData>::iterator iterator;
inline ScanLineToPolygonItrs() : tailMap_(), outputPolygons_(), fractureHoles_(false) {}
/* construct a scanline with the proper offsets, protocol and options */
inline ScanLineToPolygonItrs(bool fractureHoles) : tailMap_(), outputPolygons_(), fractureHoles_(fractureHoles) {}
-
+
~ScanLineToPolygonItrs() { clearOutput_(); }
-
+
/* process all vertical edges, left and right, at a unique x coordinate, edges must be sorted low to high */
- void processEdges(iterator& beginOutput, iterator& endOutput,
- Unit currentX, std::vector<interval_data<Unit> >& leftEdges,
+ void processEdges(iterator& beginOutput, iterator& endOutput,
+ Unit currentX, std::vector<interval_data<Unit> >& leftEdges,
std::vector<interval_data<Unit> >& rightEdges,
size_t vertexThreshold=(std::numeric_limits<size_t>::max)() );
-
+
/**********************************************************************
- *methods implementing new polygon formation code
+ *methods implementing new polygon formation code
*
**********************************************************************/
- void updatePartialSimplePolygonsWithRightEdges(Unit currentX,
+ void updatePartialSimplePolygonsWithRightEdges(Unit currentX,
const std::vector<interval_data<Unit> >& leftEdges, size_t threshold);
- void updatePartialSimplePolygonsWithLeftEdges(Unit currentX,
+ void updatePartialSimplePolygonsWithLeftEdges(Unit currentX,
const std::vector<interval_data<Unit> >& leftEdges, size_t threshold);
void closePartialSimplePolygon(Unit, ActiveTail<Unit>*, ActiveTail<Unit>*);
void maintainPartialSimplePolygonInvariant(iterator& ,iterator& ,Unit,
- const std::vector<interval_data<Unit> >&,
- const std::vector<interval_data<Unit> >&,
+ const std::vector<interval_data<Unit> >&,
+ const std::vector<interval_data<Unit> >&,
size_t vertexThreshold=(std::numeric_limits<size_t>::max)());
void insertNewLeftEdgeIntoTailMap(Unit, Unit, Unit,
@@ -769,7 +745,7 @@ namespace polygon_formation {
ActiveTail<Unit> const *t = (itr->second);
PolyLine<Unit> const *pBegin = t->getTail();
PolyLine<Unit> const *pEnd = t->getOtherActiveTail()->getTail();
- std::string sorient = pBegin->solidToRight() ? "RIGHT" : "LEFT";
+ std::string sorient = pBegin->solidToRight() ? "RIGHT" : "LEFT";
std::cout<< " ActiveTail.tailp_ (solid= " << sorient ;
End dir = TAIL;
while(pBegin!=pEnd){
@@ -793,7 +769,7 @@ namespace polygon_formation {
std::cout << " end= " << pEnd << std::endl;
}
}
-
+
private:
void clearOutput_();
};
@@ -809,9 +785,9 @@ namespace polygon_formation {
// inline ScanLineToPolygons() : scanline_() {}
// /* construct a scanline with the proper offsets, protocol and options */
// inline ScanLineToPolygons(bool fractureHoles) : scanline_(fractureHoles) {}
-
+
// /* process all vertical edges, left and right, at a unique x coordinate, edges must be sorted low to high */
-// inline void processEdges(std::vector<Unit>& outBufferTmp, Unit currentX, std::vector<interval_data<Unit> >& leftEdges,
+// inline void processEdges(std::vector<Unit>& outBufferTmp, Unit currentX, std::vector<interval_data<Unit> >& leftEdges,
// std::vector<interval_data<Unit> >& rightEdges) {
// typename ScanLineToPolygonItrs<true, Unit>::iterator itr, endItr;
// scanline_.processEdges(itr, endItr, currentX, leftEdges, rightEdges);
@@ -857,7 +833,7 @@ namespace polygon_formation {
//constructor
template <typename Unit>
- inline PolyLine<Unit>::PolyLine(orientation_2d orient, Unit coord, Side side) :
+ inline PolyLine<Unit>::PolyLine(orientation_2d orient, Unit coord, Side side) :
ptdata_(1, coord),
headp_(0),
tailp_(0),
@@ -899,7 +875,7 @@ namespace polygon_formation {
//valid PolyLine
template <typename Unit>
- inline bool PolyLine<Unit>::isValid() const {
+ inline bool PolyLine<Unit>::isValid() const {
return state_ > -1; }
//first coordinate is an X value
@@ -921,7 +897,7 @@ namespace polygon_formation {
inline bool PolyLine<Unit>::verticalTail() const {
return to_bool(verticalHead() ^ oddLength());
}
-
+
template <typename Unit>
inline orientation_2d PolyLine<Unit>::tailOrient() const {
return (verticalTail() ? VERTICAL : HORIZONTAL);
@@ -953,16 +929,16 @@ namespace polygon_formation {
inline bool PolyLine<Unit>::tailToHead() const {
return to_bool(!tailToTail());
}
-
+
template <typename Unit>
inline bool PolyLine<Unit>::tailToTail() const {
return to_bool(state_ & TAIL_TO_TAIL);
}
template <typename Unit>
- inline Side PolyLine<Unit>::solidSide() const {
+ inline Side PolyLine<Unit>::solidSide() const {
return solidToRight(); }
-
+
template <typename Unit>
inline bool PolyLine<Unit>::solidToRight() const {
return to_bool(state_ & SOLID_TO_RIGHT) != 0;
@@ -1112,11 +1088,11 @@ namespace polygon_formation {
}
template <typename Unit>
- inline ActiveTail<Unit>::ActiveTail() : tailp_(0), otherTailp_(0), holesList_(),
+ inline ActiveTail<Unit>::ActiveTail() : tailp_(0), otherTailp_(0), holesList_(),
polyLineSize_(0) {}
template <typename Unit>
- inline ActiveTail<Unit>::ActiveTail(orientation_2d orient, Unit coord, Side solidToRight, ActiveTail* otherTailp) :
+ inline ActiveTail<Unit>::ActiveTail(orientation_2d orient, Unit coord, Side solidToRight, ActiveTail* otherTailp) :
tailp_(0), otherTailp_(0), holesList_(), polyLineSize_(0) {
tailp_ = createPolyLine(orient, coord, solidToRight);
otherTailp_ = otherTailp;
@@ -1124,8 +1100,8 @@ namespace polygon_formation {
}
template <typename Unit>
- inline ActiveTail<Unit>::ActiveTail(PolyLine<Unit>* active, ActiveTail<Unit>* otherTailp) :
- tailp_(active), otherTailp_(otherTailp), holesList_(),
+ inline ActiveTail<Unit>::ActiveTail(PolyLine<Unit>* active, ActiveTail<Unit>* otherTailp) :
+ tailp_(active), otherTailp_(otherTailp), holesList_(),
polyLineSize_(0) {}
//copy constructor
@@ -1134,9 +1110,9 @@ namespace polygon_formation {
//destructor
template <typename Unit>
- inline ActiveTail<Unit>::~ActiveTail() {
+ inline ActiveTail<Unit>::~ActiveTail() {
//clear them in case the memory is read later
- tailp_ = 0; otherTailp_ = 0;
+ tailp_ = 0; otherTailp_ = 0;
}
template <typename Unit>
@@ -1159,33 +1135,33 @@ namespace polygon_formation {
}
template <typename Unit>
- inline bool ActiveTail<Unit>::operator<=(const ActiveTail<Unit>& b) const {
+ inline bool ActiveTail<Unit>::operator<=(const ActiveTail<Unit>& b) const {
return !(*this > b); }
-
+
template <typename Unit>
- inline bool ActiveTail<Unit>::operator>(const ActiveTail<Unit>& b) const {
+ inline bool ActiveTail<Unit>::operator>(const ActiveTail<Unit>& b) const {
return b < (*this); }
-
+
template <typename Unit>
- inline bool ActiveTail<Unit>::operator>=(const ActiveTail<Unit>& b) const {
+ inline bool ActiveTail<Unit>::operator>=(const ActiveTail<Unit>& b) const {
return !(*this < b); }
template <typename Unit>
- inline PolyLine<Unit>* ActiveTail<Unit>::getTail() const {
+ inline PolyLine<Unit>* ActiveTail<Unit>::getTail() const {
return tailp_; }
template <typename Unit>
- inline PolyLine<Unit>* ActiveTail<Unit>::getOtherTail() const {
+ inline PolyLine<Unit>* ActiveTail<Unit>::getOtherTail() const {
return otherTailp_->tailp_; }
template <typename Unit>
- inline ActiveTail<Unit>* ActiveTail<Unit>::getOtherActiveTail() const {
+ inline ActiveTail<Unit>* ActiveTail<Unit>::getOtherActiveTail() const {
return otherTailp_; }
template <typename Unit>
inline bool ActiveTail<Unit>::isOtherTail(const ActiveTail<Unit>& b) {
// assert( (tailp_ == b.getOtherTail() && getOtherTail() == b.tailp_) ||
- // (tailp_ != b.getOtherTail() && getOtherTail() != b.tailp_))
+ // (tailp_ != b.getOtherTail() && getOtherTail() != b.tailp_))
// ("ActiveTail: Active tails out of sync");
return otherTailp_ == &b;
}
@@ -1214,7 +1190,7 @@ namespace polygon_formation {
if(other->getOrient() == VERTICAL) {
//assert that hole.getOrient() == HORIZONTAL
//this case should never happen
- h = hole;
+ h = hole;
v = other;
} else {
//assert that hole.getOrient() == VERTICAL
@@ -1242,23 +1218,23 @@ namespace polygon_formation {
}
template <typename Unit>
- inline bool ActiveTail<Unit>::solidToRight() const {
+ inline bool ActiveTail<Unit>::solidToRight() const {
return getTail()->solidToRight(); }
template <typename Unit>
- inline Unit ActiveTail<Unit>::getCoord() const {
+ inline Unit ActiveTail<Unit>::getCoord() const {
return getTail()->getEndCoord(); }
-
+
template <typename Unit>
- inline Unit ActiveTail<Unit>::getCoordinate() const {
- return getCoord(); }
+ inline Unit ActiveTail<Unit>::getCoordinate() const {
+ return getCoord(); }
template <typename Unit>
- inline orientation_2d ActiveTail<Unit>::getOrient() const {
+ inline orientation_2d ActiveTail<Unit>::getOrient() const {
return getTail()->tailOrient(); }
template <typename Unit>
- inline void ActiveTail<Unit>::pushCoordinate(Unit coord) {
+ inline void ActiveTail<Unit>::pushCoordinate(Unit coord) {
//appropriately handle any co-linear polyline segments by calling push point internally
point_data<Unit> p;
p.set(HORIZONTAL, coord);
@@ -1359,16 +1335,16 @@ namespace polygon_formation {
if((getOrient() == HORIZONTAL) ^ !isHole) {
//our first coordinate is a y value, so we need to rotate it to the end
typename std::vector<Unit>::iterator tmpItr = outVec.begin();
- tmpItr += size;
+ tmpItr += size;
outVec.erase(++tmpItr); //erase the 2nd element
}
End startEnd = tailp_->endConnectivity(HEAD);
if(isHole) startEnd = otherTailp_->tailp_->endConnectivity(HEAD);
while(nextPolyLinep) {
bool nextStartEnd = nextPolyLinep->endConnectivity(!startEnd);
- nextPolyLinep = nextPolyLinep->writeOut(outVec, startEnd);
+ nextPolyLinep = nextPolyLinep->writeOut(outVec, startEnd);
startEnd = nextStartEnd;
- }
+ }
if((getOrient() == HORIZONTAL) ^ !isHole) {
//we want to push the y value onto the end since we ought to have ended with an x
outVec.push_back(firsty); //should never be executed because we want first value to be an x
@@ -1402,7 +1378,7 @@ namespace polygon_formation {
//solid indicates if it was joined by a solit or a space
template <typename Unit>
- inline ActiveTail<Unit>* ActiveTail<Unit>::joinChains(ActiveTail<Unit>* at1, ActiveTail<Unit>* at2, bool solid, std::vector<Unit>& outBufferTmp)
+ inline ActiveTail<Unit>* ActiveTail<Unit>::joinChains(ActiveTail<Unit>* at1, ActiveTail<Unit>* at2, bool solid, std::vector<Unit>& outBufferTmp)
{
//checks to see if we closed a figure
if(at1->isOtherTail(*at2)){
@@ -1457,7 +1433,7 @@ namespace polygon_formation {
//solid indicates if it was joined by a solit or a space
template <typename Unit>
template <typename PolygonT>
- inline ActiveTail<Unit>* ActiveTail<Unit>::joinChains(ActiveTail<Unit>* at1, ActiveTail<Unit>* at2, bool solid,
+ inline ActiveTail<Unit>* ActiveTail<Unit>::joinChains(ActiveTail<Unit>* at1, ActiveTail<Unit>* at2, bool solid,
std::vector<PolygonT>& outBufferTmp) {
//checks to see if we closed a figure
if(at1->isOtherTail(*at2)){
@@ -1471,7 +1447,7 @@ namespace polygon_formation {
//because otherwise it would have to have another vertex to the right of this one
//and would not be closed at this point
return at1;
- } else {
+ } else {
//assert pG != 0
//the figure that was closed is a shell
outBufferTmp.push_back(at1);
@@ -1495,8 +1471,8 @@ namespace polygon_formation {
return 0;
}
- template <class TKey, class T> inline typename std::map<TKey, T>::iterator findAtNext(std::map<TKey, T>& theMap,
- typename std::map<TKey, T>::iterator pos, const TKey& key)
+ template <class TKey, class T> inline typename std::map<TKey, T>::iterator findAtNext(std::map<TKey, T>& theMap,
+ typename std::map<TKey, T>::iterator pos, const TKey& key)
{
if(pos == theMap.end()) return theMap.find(key);
//if they match the mapItr is pointing to the correct position
@@ -1505,22 +1481,22 @@ namespace polygon_formation {
}
if(pos->first > key) {
return theMap.end();
- }
+ }
//else they are equal and no need to do anything to the iterator
return pos;
}
// createActiveTailsAsPair is called in these two end cases of geometry
// 1. lower left concave corner
- // ###|
// ###|
- // ###|###
+ // ###|
+ // ###|###
// ###|###
// 2. lower left convex corner
- // |###
- // |###
- // |
- // |
+ // |###
+ // |###
+ // |
+ // |
// In case 1 there may be a hole propigated up from the bottom. If the fracture option is enabled
// the two active tails that form the filament fracture line edges can become the new active tail pair
// by pushing x and y onto them. Otherwise the hole simply needs to be associated to one of the new active tails
@@ -1540,7 +1516,7 @@ namespace polygon_formation {
at1->addPolyLineSize(1);
at2->addPolyLineSize(1);
- if(phole)
+ if(phole)
at1->addHole(phole, fractureHoles); //assert fractureHoles == false
return std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*>(at1, at2);
}
@@ -1561,7 +1537,7 @@ namespace polygon_formation {
return std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*>(at1, at2);
}
- /*
+ /*
* |
* |
* =
@@ -1581,10 +1557,10 @@ namespace polygon_formation {
insertNewLeftEdgeIntoTailMap(Unit currentX, Unit yBegin, Unit yEnd,
typename std::map<Unit, ActiveTail<Unit> *>::iterator &hint){
ActiveTail<Unit> *currentTail = NULL;
- std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
- createActiveTailsAsPair(currentX, yBegin, true, currentTail,
+ std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
+ createActiveTailsAsPair(currentX, yBegin, true, currentTail,
fractureHoles_);
- currentTail = tailPair.first;
+ currentTail = tailPair.first;
if(!tailMap_.empty()){
++hint;
}
@@ -1631,8 +1607,8 @@ namespace polygon_formation {
hint = tailMap_.begin();
for(size_t i=0; i < leftEdges.size(); i++){
begin = leftEdges[i].get(LOW); end = leftEdges[i].get(HIGH);
- succ = findAtNext(tailMap_, hint, begin);
- pred = findAtNext(tailMap_, hint, end);
+ succ = findAtNext(tailMap_, hint, begin);
+ pred = findAtNext(tailMap_, hint, end);
if(succ != tailMap_.end() && pred != tailMap_.end()){ //CASE-1//
//join the corresponding active tails//
@@ -1646,7 +1622,7 @@ namespace polygon_formation {
if(usize+2 < vertexThreshold){
//cut-off the lower piece (succ1, succ) join (succ1, pred)//
succ1 = succ; --succ1;
- assert((succ1 != tailMap_.end()) &&
+ assert((succ1 != tailMap_.end()) &&
((succ->second)->getOtherActiveTail() == succ1->second));
closePartialSimplePolygon(currentX, succ1->second, succ->second);
tailPair = createActiveTailsAsPair<Unit>(currentX, succ1->first,
@@ -1659,7 +1635,7 @@ namespace polygon_formation {
}else if(bsize+2 < vertexThreshold){
//cut-off the upper piece () join ()//
pred1 = pred; ++pred1;
- assert(pred1 != tailMap_.end() &&
+ assert(pred1 != tailMap_.end() &&
((pred1->second)->getOtherActiveTail() == pred->second));
closePartialSimplePolygon(currentX, pred->second, pred1->second);
@@ -1667,11 +1643,11 @@ namespace polygon_formation {
pred1->second = pfig;
pfig->pushCoordinate(currentX);
pfig->pushCoordinate(pred1->first);
- }else{
+ }else{
//cut both and create an left edge between (pred->first, succ1)//
- succ1 = succ; --succ1;
+ succ1 = succ; --succ1;
pred1 = pred; ++pred1;
- assert(pred1 != tailMap_.end() && succ1 != tailMap_.end());
+ assert(pred1 != tailMap_.end() && succ1 != tailMap_.end());
assert((pred1->second)->getOtherActiveTail() == pred->second);
assert((succ1->second)->getOtherActiveTail() == succ->second);
@@ -1689,11 +1665,11 @@ namespace polygon_formation {
pfig->pushCoordinate(currentX);
ActiveTail<Unit>::joinChains(pfig, ppfig, true, outputPolygons_);
}
- hint = pred; ++hint;
+ hint = pred; ++hint;
tailMap_.erase(succ); tailMap_.erase(pred);
}else if(succ == tailMap_.end() && pred != tailMap_.end()){ //CASE-2//
//succ is missing in the map, first insert it into the map//
- tailPair = createActiveTailsAsPair<Unit>(currentX, begin, true, NULL,
+ tailPair = createActiveTailsAsPair<Unit>(currentX, begin, true, NULL,
fractureHoles_);
hint = pred; ++hint;
hint = tailMap_.insert(hint, std::make_pair(begin, tailPair.second));
@@ -1703,7 +1679,7 @@ namespace polygon_formation {
if(pfig_size >= vertexThreshold){
//cut-off piece from [pred, pred1] , add [begin, pred1]//
pred1 = pred; ++pred1;
- assert((pred1 != tailMap_.end()) &&
+ assert((pred1 != tailMap_.end()) &&
((pred1->second)->getOtherActiveTail() == pred->second));
closePartialSimplePolygon(currentX, pred->second, pred1->second);
@@ -1712,7 +1688,7 @@ namespace polygon_formation {
(tailPair.first)->pushCoordinate(pred1->first);
}else{
//just join//
- ActiveTail<Unit>::joinChains(tailPair.first, pfig,
+ ActiveTail<Unit>::joinChains(tailPair.first, pfig,
true, outputPolygons_);
}
tailMap_.erase(pred);
@@ -1753,19 +1729,19 @@ namespace polygon_formation {
template<bool orientT, typename Unit, typename polygon_concept_type>
inline void ScanLineToPolygonItrs<orientT, Unit, polygon_concept_type>::
updatePartialSimplePolygonsWithRightEdges(Unit currentX,
- const std::vector<interval_data<Unit> > &rightEdges, size_t vertexThreshold)
+ const std::vector<interval_data<Unit> > &rightEdges, size_t vertexThreshold)
{
-
+
typename std::map<Unit, ActiveTail<Unit>* >::iterator succ, pred, hint;
- std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair;
+ std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair;
Unit begin, end;
size_t i = 0;
//If rightEdges is non-empty Then tailMap_ is non-empty //
assert(rightEdges.empty() || !tailMap_.empty() );
while( i < rightEdges.size() ){
- //find the interval in the tailMap which contains this interval//
- pred = tailMap_.lower_bound(rightEdges[i].get(HIGH));
+ //find the interval in the tailMap which contains this interval//
+ pred = tailMap_.lower_bound(rightEdges[i].get(HIGH));
assert(pred != tailMap_.end());
succ = pred; --succ;
assert(pred != succ);
@@ -1794,11 +1770,11 @@ namespace polygon_formation {
if(rightEdges[j-1].get(HIGH) != rightEdges[j].get(LOW)){
if(!found_solid_opening){
found_solid_opening = true;
- solid_opening_begin = rightEdges[j-1].get(HIGH);
+ solid_opening_begin = rightEdges[j-1].get(HIGH);
solid_opening_end = rightEdges[j].get(LOW);
}else{
++hint;
- insertNewLeftEdgeIntoTailMap(currentX,
+ insertNewLeftEdgeIntoTailMap(currentX,
rightEdges[j-1].get(HIGH), rightEdges[j].get(LOW), hint);
}
}
@@ -1810,9 +1786,9 @@ namespace polygon_formation {
if(!found_solid_opening){
found_solid_opening = true;
solid_opening_begin = rightEdges[j-1].get(HIGH); solid_opening_end = end;
- }else{
- // a solid opening has been found already, we need to insert a new left
- // between [rightEdges[j-1].get(HIGH), end]
+ }else{
+ // a solid opening has been found already, we need to insert a new left
+ // between [rightEdges[j-1].get(HIGH), end]
Unit lbegin = rightEdges[j-1].get(HIGH);
tailPair = createActiveTailsAsPair<Unit>(currentX, lbegin, true, NULL,
fractureHoles_);
@@ -1823,7 +1799,7 @@ namespace polygon_formation {
}
}
- size_t vertex_delta = ((begin != solid_opening_begin) &&
+ size_t vertex_delta = ((begin != solid_opening_begin) &&
(end != solid_opening_end)) ? 4 : 2;
if(!found_solid_opening){
@@ -1837,7 +1813,7 @@ namespace polygon_formation {
assert(begin != solid_opening_begin || end != solid_opening_end);
if(begin != solid_opening_begin && end != solid_opening_end){
- insertNewLeftEdgeIntoTailMap(currentX, solid_opening_begin,
+ insertNewLeftEdgeIntoTailMap(currentX, solid_opening_begin,
solid_opening_end, hint);
}else if(begin == solid_opening_begin){
//we just need to update the succ in the tailMap_//
@@ -1845,7 +1821,7 @@ namespace polygon_formation {
true, NULL, fractureHoles_);
succ->second = tailPair.second;
hint = succ; ++hint;
- hint = tailMap_.insert(pred, std::make_pair(solid_opening_end,
+ hint = tailMap_.insert(pred, std::make_pair(solid_opening_end,
tailPair.first));
(tailPair.first)->pushCoordinate(solid_opening_end);
erase_succ = false;
@@ -1872,13 +1848,13 @@ namespace polygon_formation {
}
if(end != solid_opening_end){
- std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
- createActiveTailsAsPair<Unit>(currentX, solid_opening_end, false,
+ std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
+ createActiveTailsAsPair<Unit>(currentX, solid_opening_end, false,
NULL, fractureHoles_);
hint = pred; ++hint;
- hint = tailMap_.insert(hint, std::make_pair(solid_opening_end,
+ hint = tailMap_.insert(hint, std::make_pair(solid_opening_end,
tailPair.second));
- ActiveTail<Unit>::joinChains(tailPair.first, ppfig, false,
+ ActiveTail<Unit>::joinChains(tailPair.first, ppfig, false,
outputPolygons_);
}else{
erase_pred = false;
@@ -1897,12 +1873,12 @@ namespace polygon_formation {
}
// Maintains the following invariant:
- // a. All the partial polygons formed at any state can be closed
+ // a. All the partial polygons formed at any state can be closed
// by a single edge.
template<bool orientT, typename Unit, typename polygon_concept_type>
inline void ScanLineToPolygonItrs<orientT, Unit, polygon_concept_type>::
- maintainPartialSimplePolygonInvariant(iterator& beginOutput,
- iterator& endOutput, Unit currentX, const std::vector<interval_data<Unit> >& l,
+ maintainPartialSimplePolygonInvariant(iterator& beginOutput,
+ iterator& endOutput, Unit currentX, const std::vector<interval_data<Unit> >& l,
const std::vector<interval_data<Unit> >& r, size_t vertexThreshold) {
clearOutput_();
@@ -1917,109 +1893,109 @@ namespace polygon_formation {
endOutput = outputPolygons_.end();
}
-
+
//Process edges connects vertical input edges (right or left edges of figures) to horizontal edges stored as member
//data of the scanline object. It also creates now horizontal edges as needed to construct figures from edge data.
//
- //There are only 12 geometric end cases where the scanline intersects a horizontal edge and even fewer unique
+ //There are only 12 geometric end cases where the scanline intersects a horizontal edge and even fewer unique
//actions to take:
// 1. Solid on both sides of the vertical partition after the current position and space on both sides before
- // ###|###
- // ###|###
- // |
- // |
+ // ###|###
+ // ###|###
+ // |
+ // |
// This case does not need to be handled because there is no vertical edge at the current x coordinate.
//
// 2. Solid on both sides of the vertical partition before the current position and space on both sides after
- // |
- // |
- // ###|###
- // ###|###
+ // |
+ // |
+ // ###|###
+ // ###|###
// This case does not need to be handled because there is no vertical edge at the current x coordinate.
//
// 3. Solid on the left of the vertical partition after the current position and space elsewhere
- // ###|
- // ###|
- // |
- // |
+ // ###|
+ // ###|
+ // |
+ // |
// The horizontal edge from the left is found and turns upward because of the vertical right edge to become
// the currently active vertical edge.
//
// 4. Solid on the left of the vertical partion before the current position and space elsewhere
- // |
- // |
- // ###|
+ // |
+ // |
+ // ###|
// ###|
// The horizontal edge from the left is found and joined to the currently active vertical edge.
//
// 5. Solid to the right above and below and solid to the left above current position.
- // ###|###
- // ###|###
- // |###
- // |###
+ // ###|###
+ // ###|###
+ // |###
+ // |###
// The horizontal edge from the left is found and joined to the currently active vertical edge,
// potentially closing a hole.
//
// 6. Solid on the left of the vertical partion before the current position and solid to the right above and below
// |###
- // |###
- // ###|###
+ // |###
+ // ###|###
// ###|###
// The horizontal edge from the left is found and turns upward because of the vertical right edge to become
// the currently active vertical edge.
//
// 7. Solid on the right of the vertical partition after the current position and space elsewhere
- // |###
- // |###
- // |
- // |
+ // |###
+ // |###
+ // |
+ // |
// Create two new ActiveTails, one is added to the horizontal edges and the other becomes the vertical currentTail
//
// 8. Solid on the right of the vertical partion before the current position and space elsewhere
- // |
- // |
- // |###
+ // |
+ // |
+ // |###
// |###
// The currentTail vertical edge turns right and is added to the horizontal edges data
//
// 9. Solid to the right above and solid to the left above and below current position.
- // ###|###
- // ###|###
- // ###|
+ // ###|###
+ // ###|###
+ // ###|
// ###|
// The currentTail vertical edge turns right and is added to the horizontal edges data
//
// 10. Solid on the left of the vertical partion above and below the current position and solid to the right below
- // ###|
// ###|
- // ###|###
+ // ###|
+ // ###|###
// ###|###
// Create two new ActiveTails, one is added to the horizontal edges data and the other becomes the vertical currentTail
//
// 11. Solid to the right above and solid to the left below current position.
- // |###
// |###
- // ###|
+ // |###
+ // ###|
// ###|
// The currentTail vertical edge joins the horizontal edge from the left (may close a polygon)
// Create two new ActiveTails, one is added to the horizontal edges data and the other becomes the vertical currentTail
//
// 12. Solid on the left of the vertical partion above the current position and solid to the right below
- // ###|
// ###|
- // |###
+ // ###|
+ // |###
// |###
// The currentTail vertical edge turns right and is added to the horizontal edges data.
// The horizontal edge from the left turns upward and becomes the currentTail vertical edge
//
template <bool orientT, typename Unit, typename polygon_concept_type>
inline void ScanLineToPolygonItrs<orientT, Unit, polygon_concept_type>::
- processEdges(iterator& beginOutput, iterator& endOutput,
- Unit currentX, std::vector<interval_data<Unit> >& leftEdges,
+ processEdges(iterator& beginOutput, iterator& endOutput,
+ Unit currentX, std::vector<interval_data<Unit> >& leftEdges,
std::vector<interval_data<Unit> >& rightEdges,
size_t vertexThreshold) {
clearOutput_();
- typename std::map<Unit, ActiveTail<Unit>*>::iterator nextMapItr;
+ typename std::map<Unit, ActiveTail<Unit>*>::iterator nextMapItr;
//foreach edge
unsigned int leftIndex = 0;
unsigned int rightIndex = 0;
@@ -2035,7 +2011,7 @@ namespace polygon_formation {
nextMapItr = tailMap_.begin();
while(leftIndex < leftEdges.size() || rightIndex < rightEdges.size()) {
- interval_data<Unit> edges[2] = {interval_data<Unit> (UnitMax, UnitMax),
+ interval_data<Unit> edges[2] = {interval_data<Unit> (UnitMax, UnitMax),
interval_data<Unit> (UnitMax, UnitMax)};
bool haveNextEdge = true;
if(leftIndex < leftEdges.size())
@@ -2051,7 +2027,7 @@ namespace polygon_formation {
interval_data<Unit> & nextEdge = edges[!trailingEdge];
//process this edge
if(!bottomAlreadyProcessed) {
- //assert currentTail = 0
+ //assert currentTail = 0
//process the bottom end of this edge
typename std::map<Unit, ActiveTail<Unit>*>::iterator thisMapItr = findAtNext(tailMap_, nextMapItr, edge.get(LOW));
@@ -2078,7 +2054,7 @@ namespace polygon_formation {
//we need to create one and another one to be the current vertical tail
//if this is a trailing edge then there is space to the right of the vertical edge
//so pass the inverse of trailingEdge to indicate solid to the right
- std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
+ std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
createActiveTailsAsPair(currentX, edge.get(LOW), !trailingEdge, currentTail, fractureHoles_);
currentTail = tailPair.first;
tailMap_.insert(nextMapItr, std::pair<Unit, ActiveTail<Unit>*>(edge.get(LOW), tailPair.second));
@@ -2106,7 +2082,7 @@ namespace polygon_formation {
//two new tails are created, the vertical becomes current tail, the horizontal becomes thisMapItr tail
//pass true becuase they are created at the lower left corner of some solid
//pass null because there is no hole pointer possible
- std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
+ std::pair<ActiveTail<Unit>*, ActiveTail<Unit>*> tailPair =
createActiveTailsAsPair<Unit>(currentX, edge.get(HIGH), true, 0, fractureHoles_);
currentTail = tailPair.first;
thisMapItr->second = tailPair.second;
@@ -2162,7 +2138,7 @@ namespace polygon_formation {
//set current tail to null
currentTail = 0;
}
- }
+ }
//delete thisMapItr from the map
tailMap_.erase(thisMapItr);
} else {
@@ -2175,7 +2151,7 @@ namespace polygon_formation {
//leave nextMapItr unchanged, it is still next
}
}
-
+
//increment index
leftIndex += !trailingEdge;
rightIndex += trailingEdge;
@@ -2218,9 +2194,9 @@ namespace polygon_formation {
//public API to access polygon formation algorithm
template <typename output_container, typename iterator_type, typename concept_type>
- unsigned int get_polygons(output_container& container,
- iterator_type begin, iterator_type end, orientation_2d orient,
- bool fracture_holes, concept_type,
+ unsigned int get_polygons(output_container& container,
+ iterator_type begin, iterator_type end, orientation_2d orient,
+ bool fracture_holes, concept_type,
size_t sliceThreshold = (std::numeric_limits<size_t>::max)() ) {
typedef typename output_container::value_type polygon_type;
typedef typename std::iterator_traits<iterator_type>::value_type::first_type coordinate_type;
@@ -2240,7 +2216,7 @@ namespace polygon_formation {
if(pos != prevPos) {
if(orient == VERTICAL) {
typename polygon_formation::ScanLineToPolygonItrs<true, coordinate_type, polygon_concept_type>::iterator itrPoly, itrPolyEnd;
- scanlineToPolygonItrsV.processEdges(itrPoly, itrPolyEnd, prevPos,
+ scanlineToPolygonItrsV.processEdges(itrPoly, itrPolyEnd, prevPos,
leftEdges, rightEdges, sliceThreshold);
for( ; itrPoly != itrPolyEnd; ++ itrPoly) {
++countPolygons;
@@ -2249,7 +2225,7 @@ namespace polygon_formation {
}
} else {
typename polygon_formation::ScanLineToPolygonItrs<false, coordinate_type, polygon_concept_type>::iterator itrPoly, itrPolyEnd;
- scanlineToPolygonItrsH.processEdges(itrPoly, itrPolyEnd, prevPos,
+ scanlineToPolygonItrsH.processEdges(itrPoly, itrPolyEnd, prevPos,
leftEdges, rightEdges, sliceThreshold);
for( ; itrPoly != itrPolyEnd; ++ itrPoly) {
++countPolygons;
diff --git a/boost/polygon/detail/property_merge.hpp b/boost/polygon/detail/property_merge.hpp
index b0c843b5de..6ea0161b05 100644
--- a/boost/polygon/detail/property_merge.hpp
+++ b/boost/polygon/detail/property_merge.hpp
@@ -458,7 +458,7 @@ private:
processVertex(output);
//std::cout << scanline.size() << " ";
countFromBelow.clear(); //should already be clear
- writeGraph(currentVertex.first.x(), result, output, scanline);
+ writeGraph(result, output, scanline);
currentVertex.second.clear();
mergeProperty(currentVertex.second, data[i].second);
currentVertex.first = data[i].first;
@@ -474,7 +474,7 @@ private:
}
}
processVertex(output);
- writeGraph(currentVertex.first.x(), result, output, scanline);
+ writeGraph(result, output, scanline);
//std::cout << scanline.size() << "\n";
}
@@ -509,7 +509,7 @@ private:
}
template <typename T, typename T2>
- inline void writeGraph(coordinate_type x, T& graph, edge_property_vector& output, T2& scanline) {
+ inline void writeGraph(T& graph, edge_property_vector& output, T2& scanline) {
if(output.empty()) return;
edge_property* previousEdgeP = &(output[0]);
bool firstIteration = true;
diff --git a/boost/polygon/detail/rectangle_formation.hpp b/boost/polygon/detail/rectangle_formation.hpp
index 22d0f38cac..07a2209f48 100644
--- a/boost/polygon/detail/rectangle_formation.hpp
+++ b/boost/polygon/detail/rectangle_formation.hpp
@@ -258,7 +258,7 @@ namespace rectangle_formation {
++itr;
Unit highy = (*itr).second.first;
scanlineToRects.processEdge(output, interval_data<Unit>(lowy, highy));
- if(abs((*itr).second.second) > 1) itr = tmp_itr; //next edge begins from this vertex
+ if(std::abs((*itr).second.second) > 1) itr = tmp_itr; //next edge begins from this vertex
}
}
}
diff --git a/boost/polygon/detail/scan_arbitrary.hpp b/boost/polygon/detail/scan_arbitrary.hpp
index cee2331389..901992a2f0 100644
--- a/boost/polygon/detail/scan_arbitrary.hpp
+++ b/boost/polygon/detail/scan_arbitrary.hpp
@@ -1641,7 +1641,7 @@ namespace boost { namespace polygon{
template <typename polygon_with_holes_type>
void insert(const polygon_with_holes_type& polygon_with_holes_object, const property_type& property_value, bool is_hole,
- polygon_with_holes_concept tag) {
+ polygon_with_holes_concept) {
insert(polygon_with_holes_object, property_value, is_hole, polygon_concept());
for(typename polygon_with_holes_traits<polygon_with_holes_type>::iterator_holes_type itr =
begin_holes(polygon_with_holes_object);
diff --git a/boost/polygon/isotropy.hpp b/boost/polygon/isotropy.hpp
index 890595e35d..117d6a55d6 100644
--- a/boost/polygon/isotropy.hpp
+++ b/boost/polygon/isotropy.hpp
@@ -137,7 +137,7 @@ namespace boost { namespace polygon{
template <typename T1, typename T2>
view_of<T1, T2> view_as(const T2& obj) { return view_of<T1, T2>(obj); }
- template <typename T>
+ template <typename T, bool /*enable*/ = true>
struct coordinate_traits {};
//used to override long double with an infinite precision datatype
@@ -175,6 +175,17 @@ namespace boost { namespace polygon{
typedef long double coordinate_distance;
};
+ template<>
+ struct coordinate_traits<long, sizeof(long) == sizeof(int)> {
+ typedef coordinate_traits<int> cT_;
+ typedef cT_::coordinate_type coordinate_type;
+ typedef cT_::area_type area_type;
+ typedef cT_::manhattan_area_type manhattan_area_type;
+ typedef cT_::unsigned_area_type unsigned_area_type;
+ typedef cT_::coordinate_difference coordinate_difference;
+ typedef cT_::coordinate_distance coordinate_distance;
+ };
+
#ifdef BOOST_POLYGON_USE_LONG_LONG
template <>
struct coordinate_traits<polygon_long_long_type> {
@@ -185,6 +196,17 @@ namespace boost { namespace polygon{
typedef polygon_long_long_type coordinate_difference;
typedef long double coordinate_distance;
};
+
+ template<>
+ struct coordinate_traits<long, sizeof(long) == sizeof(polygon_long_long_type)> {
+ typedef coordinate_traits<polygon_long_long_type> cT_;
+ typedef cT_::coordinate_type coordinate_type;
+ typedef cT_::area_type area_type;
+ typedef cT_::manhattan_area_type manhattan_area_type;
+ typedef cT_::unsigned_area_type unsigned_area_type;
+ typedef cT_::coordinate_difference coordinate_difference;
+ typedef cT_::coordinate_distance coordinate_distance;
+ };
#endif
template <>
diff --git a/boost/polygon/point_data.hpp b/boost/polygon/point_data.hpp
index 8224657b48..deda14d5d4 100644
--- a/boost/polygon/point_data.hpp
+++ b/boost/polygon/point_data.hpp
@@ -45,18 +45,18 @@ class point_data {
return *this;
}
-#ifdef __GNUC__
- // "explicit" to work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63356
+#if defined(__GNUC__) && __GNUC__ < 6
+ // "explicit" to work around a bug in GCC < 6: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63356
template <typename PointType>
explicit point_data(const PointType& that) {
*this = that;
}
-#else // __GNUC__
+#else // __GNUC__ < 6
template <typename PointType>
point_data(const PointType& that) {
*this = that;
}
-#endif // __GNUC__
+#endif // __GNUC__ < 6
template <typename PointType>
point_data& operator=(const PointType& that) {
diff --git a/boost/polygon/polygon_45_set_data.hpp b/boost/polygon/polygon_45_set_data.hpp
index 4438d74ef8..97585f6dad 100644
--- a/boost/polygon/polygon_45_set_data.hpp
+++ b/boost/polygon/polygon_45_set_data.hpp
@@ -666,7 +666,7 @@ namespace boost { namespace polygon{
bool plus45 = vertex.count[2] != 0;
bool minus45 = vertex.count[0] != 0;
if(plus45 || minus45) {
- if(abs(vertex.pt.x()) % 2 != abs(vertex.pt.y()) % 2) {
+ if(local_abs(vertex.pt.x()) % 2 != local_abs(vertex.pt.y()) % 2) {
if(vertex.count[1] != 0 ||
(plus45 && minus45)) {
//move right
@@ -1014,7 +1014,7 @@ namespace boost { namespace polygon{
if(resizing > 0) return; //accute interior corner
else multiplier *= -1; //make it appear to be an accute exterior angle
}
- Unit bloating = abs(resizing);
+ Unit bloating = local_abs(resizing);
if(rounding == SQRT1OVER2) {
if(edge1 % 2 && edge2 % 2) return;
if(corner == ORTHOGONAL && edge1 % 2 == 0 && edge2 % 2 == 0) {
diff --git a/boost/polygon/polygon_90_set_data.hpp b/boost/polygon/polygon_90_set_data.hpp
index 305aa3e113..2c640bf1ae 100644
--- a/boost/polygon/polygon_90_set_data.hpp
+++ b/boost/polygon/polygon_90_set_data.hpp
@@ -46,7 +46,7 @@ namespace boost { namespace polygon{
// constructor from an iterator pair over vertex data
template <typename iT>
- inline polygon_90_set_data(orientation_2d orient, iT input_begin, iT input_end) :
+ inline polygon_90_set_data(orientation_2d, iT input_begin, iT input_end) :
orient_(HORIZONTAL), data_(), dirty_(false), unsorted_(false) {
dirty_ = true;
unsorted_ = true;
@@ -119,7 +119,7 @@ namespace boost { namespace polygon{
}
inline void insert(const std::pair<std::pair<point_data<coordinate_type>, point_data<coordinate_type> >, int>& edge, bool is_hole = false,
- orientation_2d orient = HORIZONTAL) {
+ orientation_2d = HORIZONTAL) {
std::pair<coordinate_type, std::pair<coordinate_type, int> > vertex;
vertex.first = edge.first.first.x();
vertex.second.first = edge.first.first.y();
@@ -837,7 +837,7 @@ namespace boost { namespace polygon{
}
template <typename output_container>
- void get_dispatch(output_container& output, polygon_90_concept tag,
+ void get_dispatch(output_container& output, polygon_90_concept tag,
size_t vthreshold) const {
get_fracture(output, true, tag, vthreshold);
}
diff --git a/boost/polygon/polygon_set_data.hpp b/boost/polygon/polygon_set_data.hpp
index 9c6420decc..32dd800fe7 100644
--- a/boost/polygon/polygon_set_data.hpp
+++ b/boost/polygon/polygon_set_data.hpp
@@ -399,7 +399,7 @@ namespace boost { namespace polygon {
}
template <typename scaling_type>
- inline polygon_set_data& scale(polygon_set_data& polygon_set,
+ inline polygon_set_data& scale(polygon_set_data&,
const scaling_type& scaling) {
for(typename value_type::iterator itr = begin(); itr != end(); ++itr) {
bool vb = (*itr).first.first.x() == (*itr).first.second.x();
@@ -574,7 +574,7 @@ namespace boost { namespace polygon {
template <typename geometry_type>
inline polygon_set_data&
insert_with_resize_dispatch(const geometry_type& poly, coordinate_type resizing, bool corner_fill_arc, unsigned int num_circle_segments, bool hole,
- polygon_with_holes_concept tag) {
+ polygon_with_holes_concept) {
insert_with_resize_dispatch(poly, resizing, corner_fill_arc, num_circle_segments, hole, polygon_concept());
for(typename polygon_with_holes_traits<geometry_type>::iterator_holes_type itr =
begin_holes(poly); itr != end_holes(poly);
@@ -587,7 +587,7 @@ namespace boost { namespace polygon {
template <typename geometry_type>
inline polygon_set_data&
insert_with_resize_dispatch(const geometry_type& poly, coordinate_type resizing, bool corner_fill_arc, unsigned int num_circle_segments, bool hole,
- polygon_concept tag) {
+ polygon_concept) {
if (resizing==0)
return *this;
diff --git a/boost/polygon/polygon_traits.hpp b/boost/polygon/polygon_traits.hpp
index dddbf34d5d..1149483c5a 100644
--- a/boost/polygon/polygon_traits.hpp
+++ b/boost/polygon/polygon_traits.hpp
@@ -179,17 +179,6 @@ namespace boost { namespace polygon{
};
- template <typename T>
- struct polygon_90_mutable_traits<T, typename gtl_same_type<polygon_concept, typename geometry_concept<T>::type>::type> {
- // Set the data of a polygon with the unique coordinates in an iterator, starting with an x
- template <typename iT>
- static inline T& set_compact(T& t, iT input_begin, iT input_end) {
- typedef iterator_points_to_compact<iT, typename polygon_traits<T>::point_type> iTp;
- t.set_points(iTp(polygon_traits<T>::begin_points(t)), iTp(polygon_traits<T>::end_points(t)));
- return t;
- }
- };
-
template <typename T, typename enable = void>
struct polygon_mutable_traits {
@@ -1567,7 +1556,6 @@ namespace boost { namespace polygon{
typedef const hole_type* iterator_holes_type;
static inline iterator_holes_type begin_holes(const hole_type& t) { return &t; }
static inline iterator_holes_type end_holes(const hole_type& t) { return &t; }
- static inline std::size_t size_holes(const hole_type& t) { return 0; }
};
template <typename T>
diff --git a/boost/polygon/segment_data.hpp b/boost/polygon/segment_data.hpp
index dd317fc4aa..2bcfe11f97 100644
--- a/boost/polygon/segment_data.hpp
+++ b/boost/polygon/segment_data.hpp
@@ -90,7 +90,7 @@ class segment_data {
bool operator<(const segment_data& that) const {
if (points_[0] != that.points_[0]) {
- points_[0] < that.points_[0];
+ return points_[0] < that.points_[0];
}
return points_[1] < that.points_[1];
}
diff --git a/boost/pool/detail/mutex.hpp b/boost/pool/detail/mutex.hpp
index 8d72415284..45d8e19eac 100644
--- a/boost/pool/detail/mutex.hpp
+++ b/boost/pool/detail/mutex.hpp
@@ -10,7 +10,7 @@
#define BOOST_POOL_MUTEX_HPP
#include <boost/config.hpp> // for workarounds
-#ifdef BOOST_HAS_THREADS
+#if defined (BOOST_HAS_THREADS) && !defined(BOOST_POOL_NO_MT)
#include <boost/thread/mutex.hpp>
#endif
diff --git a/boost/predef.h b/boost/predef.h
index 36d731fa41..4965337875 100644
--- a/boost/predef.h
+++ b/boost/predef.h
@@ -17,6 +17,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/os.h>
#include <boost/predef/other.h>
#include <boost/predef/platform.h>
+#include <boost/predef/hardware.h>
#include <boost/predef/version.h>
diff --git a/boost/predef/detail/_cassert.h b/boost/predef/detail/_cassert.h
index ccae4950d3..940e944e2b 100644
--- a/boost/predef/detail/_cassert.h
+++ b/boost/predef/detail/_cassert.h
@@ -8,7 +8,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_DETAIL__CASSERT_H
#define BOOST_PREDEF_DETAIL__CASSERT_H
-#if defined(__cpluplus)
+#if defined(__cplusplus)
#include <cassert>
#else
#include <assert.h>
diff --git a/boost/predef/detail/_exception.h b/boost/predef/detail/_exception.h
index ca58c79d32..f5a6687a9f 100644
--- a/boost/predef/detail/_exception.h
+++ b/boost/predef/detail/_exception.h
@@ -8,7 +8,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#ifndef BOOST_PREDEF_DETAIL__EXCEPTION_H
#define BOOST_PREDEF_DETAIL__EXCEPTION_H
-#if defined(__cpluplus)
+#if defined(__cplusplus)
#include <exception>
#endif
diff --git a/boost/predef/hardware.h b/boost/predef/hardware.h
new file mode 100644
index 0000000000..972b73af68
--- /dev/null
+++ b/boost/predef/hardware.h
@@ -0,0 +1,16 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#if !defined(BOOST_PREDEF_HARDWARE_H) || defined(BOOST_PREDEF_INTERNAL_GENERATE_TESTS)
+#ifndef BOOST_PREDEF_HARDWARE_H
+#define BOOST_PREDEF_HARDWARE_H
+#endif
+
+#include <boost/predef/hardware/simd.h>
+
+#endif
diff --git a/boost/predef/hardware/simd.h b/boost/predef/hardware/simd.h
new file mode 100644
index 0000000000..4de1e70cd3
--- /dev/null
+++ b/boost/predef/hardware/simd.h
@@ -0,0 +1,107 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#include <boost/predef/hardware/simd/x86.h>
+#include <boost/predef/hardware/simd/x86_amd.h>
+#include <boost/predef/hardware/simd/arm.h>
+#include <boost/predef/hardware/simd/ppc.h>
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_H
+#define BOOST_PREDEF_HARDWARE_SIMD_H
+
+#include <boost/predef/version_number.h>
+
+/*`
+ [section Using the `BOOST_HW_SIMD_*` predefs]
+ [include ../doc/hardware_simd.qbk]
+ [endsect]
+
+ [/ --------------------------- ]
+
+ [section `BOOST_HW_SIMD_*`]
+
+ [heading `BOOST_HW_SIMD`]
+
+ The SIMD extension detected for a specific architectures.
+ Version number depends on the detected extension.
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`BOOST_HW_SIMD_X86_AVAILABLE`] [__predef_detection__]]
+ [[`BOOST_HW_SIMD_X86_AMD_AVAILABLE`] [__predef_detection__]]
+ [[`BOOST_HW_SIMD_ARM_AVAILABLE`] [__predef_detection__]]
+ [[`BOOST_HW_SIMD_PPC_AVAILABLE`] [__predef_detection__]]
+ ]
+
+ [include ../include/boost/predef/hardware/simd/x86.h]
+ [include ../include/boost/predef/hardware/simd/x86_amd.h]
+ [include ../include/boost/predef/hardware/simd/arm.h]
+ [include ../include/boost/predef/hardware/simd/ppc.h]
+
+ [endsect]
+
+ [/ --------------------------- ]
+
+ [section `BOOST_HW_SIMD_X86_*_VERSION`]
+ [include ../include/boost/predef/hardware/simd/x86/versions.h]
+ [endsect]
+
+ [section `BOOST_HW_SIMD_X86_AMD_*_VERSION`]
+ [include ../include/boost/predef/hardware/simd/x86_amd/versions.h]
+ [endsect]
+
+ [section `BOOST_HW_SIMD_ARM_*_VERSION`]
+ [include ../include/boost/predef/hardware/simd/arm/versions.h]
+ [endsect]
+
+ [section `BOOST_HW_SIMD_PPC_*_VERSION`]
+ [include ../include/boost/predef/hardware/simd/ppc/versions.h]
+ [endsect]
+
+ */
+
+// We check if SIMD extension of multiples architectures have been detected,
+// if yes, then this is an error!
+//
+// NOTE: _X86_AMD implies _X86, so there is no need to check for it here!
+//
+#if defined(BOOST_HW_SIMD_ARM_AVAILABLE) && defined(BOOST_HW_SIMD_PPC_AVAILABLE) ||\
+ defined(BOOST_HW_SIMD_ARM_AVAILABLE) && defined(BOOST_HW_SIMD_X86_AVAILABLE) ||\
+ defined(BOOST_HW_SIMD_PPC_AVAILABLE) && defined(BOOST_HW_SIMD_X86_AVAILABLE)
+# error "Multiple SIMD architectures detected, this cannot happen!"
+#endif
+
+#if defined(BOOST_HW_SIMD_X86_AVAILABLE)
+# define BOOST_HW_SIMD BOOST_HW_SIMD_X86
+#endif
+
+#if defined(BOOST_HW_SIMD_X86_AMD_AVAILABLE)
+# define BOOST_HW_SIMD BOOST_HW_SIMD_X86_AMD
+#endif
+
+#if defined(BOOST_HW_SIMD_ARM_AVAILABLE)
+# define BOOST_HW_SIMD BOOST_HW_SIMD_ARM
+#endif
+
+#if defined(BOOST_HW_SIMD_PPC_AVAILABLE)
+# define BOOST_HW_SIMD BOOST_HW_SIMD_PPC
+#endif
+
+#if defined(BOOST_HW_SIMD)
+# define BOOST_HW_SIMD_AVAILABLE
+#else
+# define BOOST_HW_SIMD BOOST_VERSION_NUMBER_NOT_AVAILABLE
+#endif
+
+#define BOOST_HW_SIMD_NAME "Hardware SIMD"
+
+#endif
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_HW_SIMD, BOOST_HW_SIMD_NAME)
diff --git a/boost/predef/hardware/simd/arm.h b/boost/predef/hardware/simd/arm.h
new file mode 100644
index 0000000000..d067c93196
--- /dev/null
+++ b/boost/predef/hardware/simd/arm.h
@@ -0,0 +1,57 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_ARM_H
+#define BOOST_PREDEF_HARDWARE_SIMD_ARM_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/hardware/simd/arm/versions.h>
+
+/*`
+ [heading `BOOST_HW_SIMD_ARM`]
+
+ The SIMD extension for ARM (*if detected*).
+ Version number depends on the most recent detected extension.
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__ARM_NEON__`] [__predef_detection__]]
+ [[`__aarch64__`] [__predef_detection__]]
+ [[`_M_ARM`] [__predef_detection__]]
+ ]
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__ARM_NEON__`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
+ [[`__aarch64__`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
+ [[`_M_ARM`] [BOOST_HW_SIMD_ARM_NEON_VERSION]]
+ ]
+
+ */
+
+#define BOOST_HW_SIMD_ARM BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#undef BOOST_HW_SIMD_ARM
+#if !defined(BOOST_HW_SIMD_ARM) && (defined(__ARM_NEON__) || defined(__aarch64__) || defined (_M_ARM))
+# define BOOST_HW_SIMD_ARM BOOST_HW_SIMD_ARM_NEON_VERSION
+#endif
+
+#if !defined(BOOST_HW_SIMD_ARM)
+# define BOOST_HW_SIMD_ARM BOOST_VERSION_NUMBER_NOT_AVAILABLE
+#else
+# define BOOST_HW_SIMD_ARM_AVAILABLE
+#endif
+
+#define BOOST_HW_SIMD_ARM_NAME "ARM SIMD"
+
+#endif
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_HW_SIMD_ARM, BOOST_HW_SIMD_ARM_NAME)
diff --git a/boost/predef/hardware/simd/arm/versions.h b/boost/predef/hardware/simd/arm/versions.h
new file mode 100644
index 0000000000..8425b31862
--- /dev/null
+++ b/boost/predef/hardware/simd/arm/versions.h
@@ -0,0 +1,32 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_ARM_VERSIONS_H
+#define BOOST_PREDEF_HARDWARE_SIMD_ARM_VERSIONS_H
+
+#include <boost/predef/version_number.h>
+
+/*`
+ Those defines represent ARM SIMD extensions versions.
+
+ [note You *MUST* compare them with the predef `BOOST_HW_SIMD_ARM`.]
+ */
+
+// ---------------------------------
+
+/*`
+ [heading `BOOST_HW_SIMD_ARM_NEON_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/ARM_architecture#Advanced_SIMD_.28NEON.29 NEON]
+ ARM extension version number.
+
+ Version number is: *1.0.0*.
+ */
+#define BOOST_HW_SIMD_ARM_NEON_VERSION BOOST_VERSION_NUMBER(1, 0, 0)
+
+#endif
diff --git a/boost/predef/hardware/simd/ppc.h b/boost/predef/hardware/simd/ppc.h
new file mode 100644
index 0000000000..eef25c2d26
--- /dev/null
+++ b/boost/predef/hardware/simd/ppc.h
@@ -0,0 +1,69 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_PPC_H
+#define BOOST_PREDEF_HARDWARE_SIMD_PPC_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/hardware/simd/ppc/versions.h>
+
+/*`
+ [heading `BOOST_HW_SIMD_PPC`]
+
+ The SIMD extension for PowerPC (*if detected*).
+ Version number depends on the most recent detected extension.
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__VECTOR4DOUBLE__`] [__predef_detection__]]
+
+ [[`__ALTIVEC__`] [__predef_detection__]]
+ [[`__VEC__`] [__predef_detection__]]
+
+ [[`__VSX__`] [__predef_detection__]]
+ ]
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__VECTOR4DOUBLE__`] [BOOST_HW_SIMD_PPC_QPX_VERSION]]
+
+ [[`__ALTIVEC__`] [BOOST_HW_SIMD_PPC_VMX_VERSION]]
+ [[`__VEC__`] [BOOST_HW_SIMD_PPC_VMX_VERSION]]
+
+ [[`__VSX__`] [BOOST_HW_SIMD_PPC_VSX_VERSION]]
+ ]
+
+ */
+
+#define BOOST_HW_SIMD_PPC BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#undef BOOST_HW_SIMD_PPC
+#if !defined(BOOST_HW_SIMD_PPC) && defined(__VECTOR4DOUBLE__)
+# define BOOST_HW_SIMD_PPC BOOST_HW_SIMD_PPC_QPX_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_PPC) && defined(__VSX__)
+# define BOOST_HW_SIMD_PPC BOOST_HW_SIMD_PPC_VSX_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_PPC) && (defined(__ALTIVEC__) || defined(__VEC__))
+# define BOOST_HW_SIMD_PPC BOOST_HW_SIMD_PPC_VMX_VERSION
+#endif
+
+#if !defined(BOOST_HW_SIMD_PPC)
+# define BOOST_HW_SIMD_PPC BOOST_VERSION_NUMBER_NOT_AVAILABLE
+#else
+# define BOOST_HW_SIMD_PPC_AVAILABLE
+#endif
+
+#define BOOST_HW_SIMD_PPC_NAME "PPC SIMD"
+
+#endif
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_HW_SIMD_PPC, BOOST_HW_SIMD_PPC_NAME)
diff --git a/boost/predef/hardware/simd/ppc/versions.h b/boost/predef/hardware/simd/ppc/versions.h
new file mode 100644
index 0000000000..ffe3f0b1e5
--- /dev/null
+++ b/boost/predef/hardware/simd/ppc/versions.h
@@ -0,0 +1,51 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_PPC_VERSIONS_H
+#define BOOST_PREDEF_HARDWARE_SIMD_PPC_VERSIONS_H
+
+#include <boost/predef/version_number.h>
+
+/*`
+ Those defines represent Power PC SIMD extensions versions.
+
+ [note You *MUST* compare them with the predef `BOOST_HW_SIMD_PPC`.]
+ */
+
+// ---------------------------------
+
+/*`
+ [heading `BOOST_HW_SIMD_PPC_VMX_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/AltiVec#VMX128 VMX] powerpc extension
+ version number.
+
+ Version number is: *1.0.0*.
+ */
+#define BOOST_HW_SIMD_PPC_VMX_VERSION BOOST_VERSION_NUMBER(1, 0, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_PPC_VSX_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/AltiVec#VSX VSX] powerpc extension version
+ number.
+
+ Version number is: *1.1.0*.
+ */
+#define BOOST_HW_SIMD_PPC_VSX_VERSION BOOST_VERSION_NUMBER(1, 1, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_PPC_QPX_VERSION`]
+
+ The QPX powerpc extension version number.
+
+ Version number is: *2.0.0*.
+ */
+#define BOOST_HW_SIMD_PPC_QPX_VERSION BOOST_VERSION_NUMBER(2, 0, 0)
+
+#endif
diff --git a/boost/predef/hardware/simd/x86.h b/boost/predef/hardware/simd/x86.h
new file mode 100644
index 0000000000..0874bc4ea7
--- /dev/null
+++ b/boost/predef/hardware/simd/x86.h
@@ -0,0 +1,123 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_X86_H
+#define BOOST_PREDEF_HARDWARE_SIMD_X86_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/hardware/simd/x86/versions.h>
+
+/*`
+ [heading `BOOST_HW_SIMD_X86`]
+
+ The SIMD extension for x86 (*if detected*).
+ Version number depends on the most recent detected extension.
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__SSE__`] [__predef_detection__]]
+ [[`_M_X64`] [__predef_detection__]]
+ [[`_M_IX86_FP >= 1`] [__predef_detection__]]
+
+ [[`__SSE2__`] [__predef_detection__]]
+ [[`_M_X64`] [__predef_detection__]]
+ [[`_M_IX86_FP >= 2`] [__predef_detection__]]
+
+ [[`__SSE3__`] [__predef_detection__]]
+
+ [[`__SSSE3__`] [__predef_detection__]]
+
+ [[`__SSE4_1__`] [__predef_detection__]]
+
+ [[`__SSE4_2__`] [__predef_detection__]]
+
+ [[`__AVX__`] [__predef_detection__]]
+
+ [[`__FMA__`] [__predef_detection__]]
+
+ [[`__AVX2__`] [__predef_detection__]]
+ ]
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__SSE__`] [BOOST_HW_SIMD_X86_SSE_VERSION]]
+ [[`_M_X64`] [BOOST_HW_SIMD_X86_SSE_VERSION]]
+ [[`_M_IX86_FP >= 1`] [BOOST_HW_SIMD_X86_SSE_VERSION]]
+
+ [[`__SSE2__`] [BOOST_HW_SIMD_X86_SSE2_VERSION]]
+ [[`_M_X64`] [BOOST_HW_SIMD_X86_SSE2_VERSION]]
+ [[`_M_IX86_FP >= 2`] [BOOST_HW_SIMD_X86_SSE2_VERSION]]
+
+ [[`__SSE3__`] [BOOST_HW_SIMD_X86_SSE3_VERSION]]
+
+ [[`__SSSE3__`] [BOOST_HW_SIMD_X86_SSSE3_VERSION]]
+
+ [[`__SSE4_1__`] [BOOST_HW_SIMD_X86_SSE4_1_VERSION]]
+
+ [[`__SSE4_2__`] [BOOST_HW_SIMD_X86_SSE4_2_VERSION]]
+
+ [[`__AVX__`] [BOOST_HW_SIMD_X86_AVX_VERSION]]
+
+ [[`__FMA__`] [BOOST_HW_SIMD_X86_FMA3_VERSION]]
+
+ [[`__AVX2__`] [BOOST_HW_SIMD_x86_AVX2_VERSION]]
+ ]
+
+ */
+
+#define BOOST_HW_SIMD_X86 BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+#undef BOOST_HW_SIMD_X86
+#if !defined(BOOST_HW_SIMD_X86) && defined(__MIC__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_MIC_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__AVX2__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_AVX2_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__AVX__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_AVX_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__FMA__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_FMA_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__SSE4_2__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE4_2_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__SSE4_1__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE4_1_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__SSSE3__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSSE3_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__SSE3__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE3_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE2__) || defined(_M_X64) || _M_IX86_FP >= 2)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE2_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && (defined(__SSE__) || defined(_M_X64) || _M_IX86_FP >= 1)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_SSE_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86) && defined(__MMX__)
+# define BOOST_HW_SIMD_X86 BOOST_HW_SIMD_X86_MMX_VERSION
+#endif
+
+#if !defined(BOOST_HW_SIMD_X86)
+# define BOOST_HW_SIMD_X86 BOOST_VERSION_NUMBER_NOT_AVAILABLE
+#else
+# define BOOST_HW_SIMD_X86_AVAILABLE
+#endif
+
+#define BOOST_HW_SIMD_X86_NAME "x86 SIMD"
+
+#endif
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_HW_SIMD_X86, BOOST_HW_SIMD_X86_NAME)
diff --git a/boost/predef/hardware/simd/x86/versions.h b/boost/predef/hardware/simd/x86/versions.h
new file mode 100644
index 0000000000..0c7a4d3813
--- /dev/null
+++ b/boost/predef/hardware/simd/x86/versions.h
@@ -0,0 +1,129 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_X86_VERSIONS_H
+#define BOOST_PREDEF_HARDWARE_SIMD_X86_VERSIONS_H
+
+#include <boost/predef/version_number.h>
+
+/*`
+ Those defines represent x86 SIMD extensions versions.
+
+ [note You *MUST* compare them with the predef `BOOST_HW_SIMD_X86`.]
+ */
+
+// ---------------------------------
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_MMX_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/MMX_(instruction_set) MMX] x86 extension
+ version number.
+
+ Version number is: *0.99.0*.
+ */
+#define BOOST_HW_SIMD_X86_MMX_VERSION BOOST_VERSION_NUMBER(0, 99, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSE_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions SSE] x86 extension
+ version number.
+
+ Version number is: *1.0.0*.
+ */
+#define BOOST_HW_SIMD_X86_SSE_VERSION BOOST_VERSION_NUMBER(1, 0, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSE2_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/SSE2 SSE2] x86 extension version number.
+
+ Version number is: *2.0.0*.
+ */
+#define BOOST_HW_SIMD_X86_SSE2_VERSION BOOST_VERSION_NUMBER(2, 0, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSE3_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/SSE3 SSE3] x86 extension version number.
+
+ Version number is: *3.0.0*.
+ */
+#define BOOST_HW_SIMD_X86_SSE3_VERSION BOOST_VERSION_NUMBER(3, 0, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSSE3_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/SSSE3 SSSE3] x86 extension version number.
+
+ Version number is: *3.1.0*.
+ */
+#define BOOST_HW_SIMD_X86_SSSE3_VERSION BOOST_VERSION_NUMBER(3, 1, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSE4_1_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/SSE4#SSE4.1 SSE4_1] x86 extension version
+ number.
+
+ Version number is: *4.1.0*.
+ */
+#define BOOST_HW_SIMD_X86_SSE4_1_VERSION BOOST_VERSION_NUMBER(4, 1, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSE4_2_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/SSE4##SSE4.2 SSE4_2] x86 extension version
+ number.
+
+ Version number is: *4.2.0*.
+ */
+#define BOOST_HW_SIMD_X86_SSE4_2_VERSION BOOST_VERSION_NUMBER(4, 2, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_AVX_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/Advanced_Vector_Extensions AVX] x86
+ extension version number.
+
+ Version number is: *5.0.0*.
+ */
+#define BOOST_HW_SIMD_X86_AVX_VERSION BOOST_VERSION_NUMBER(5, 0, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_FMA3_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/FMA_instruction_set FMA3] x86 extension
+ version number.
+
+ Version number is: *5.2.0*.
+ */
+#define BOOST_HW_SIMD_X86_FMA3_VERSION BOOST_VERSION_NUMBER(5, 2, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_AVX2_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/Advanced_Vector_Extensions#Advanced_Vector_Extensions_2 AVX2]
+ x86 extension version number.
+
+ Version number is: *5.3.0*.
+ */
+#define BOOST_HW_SIMD_X86_AVX2_VERSION BOOST_VERSION_NUMBER(5, 3, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_MIC_VERSION`]
+
+ The [@https://en.wikipedia.org/wiki/Xeon_Phi MIC] (Xeon Phi) x86 extension
+ version number.
+
+ Version number is: *9.0.0*.
+ */
+#define BOOST_HW_SIMD_X86_MIC_VERSION BOOST_VERSION_NUMBER(9, 0, 0)
+
+#endif
diff --git a/boost/predef/hardware/simd/x86_amd.h b/boost/predef/hardware/simd/x86_amd.h
new file mode 100644
index 0000000000..60fd4485ec
--- /dev/null
+++ b/boost/predef/hardware/simd/x86_amd.h
@@ -0,0 +1,87 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_X86_AMD_H
+#define BOOST_PREDEF_HARDWARE_SIMD_X86_AMD_H
+
+#include <boost/predef/version_number.h>
+#include <boost/predef/hardware/simd/x86_amd/versions.h>
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_AMD`]
+
+ The SIMD extension for x86 (AMD) (*if detected*).
+ Version number depends on the most recent detected extension.
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__SSE4A__`] [__predef_detection__]]
+
+ [[`__FMA4__`] [__predef_detection__]]
+
+ [[`__XOP__`] [__predef_detection__]]
+
+ [[`BOOST_HW_SIMD_X86`] [__predef_detection__]]
+ ]
+
+ [table
+ [[__predef_symbol__] [__predef_version__]]
+
+ [[`__SSE4A__`] [BOOST_HW_SIMD_x86_SSE4A_VERSION]]
+
+ [[`__FMA4__`] [BOOST_HW_SIMD_x86_FMA4_VERSION]]
+
+ [[`__XOP__`] [BOOST_HW_SIMD_x86_XOP_VERSION]]
+
+ [[`BOOST_HW_SIMD_X86`] [BOOST_HW_SIMD_x86]]
+ ]
+
+ [note This predef includes every other x86 SIMD extensions and also has other
+ more specific extensions (FMA4, XOP, SSE4a). You should use this predef
+ instead of `BOOST_HW_SIMD_X86` to test if those specific extensions have
+ been detected.]
+
+ */
+
+#define BOOST_HW_SIMD_X86_AMD BOOST_VERSION_NUMBER_NOT_AVAILABLE
+
+// AMD CPUs also use x86 architecture. We first try to detect if any AMD
+// specific extension are detected, if yes, then try to detect more recent x86
+// common extensions.
+
+#undef BOOST_HW_SIMD_X86_AMD
+#if !defined(BOOST_HW_SIMD_X86_AMD) && defined(__XOP__)
+# define BOOST_HW_SIMD_X86_AMD BOOST_HW_SIMD_X86_AMD_XOP_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86_AMD) && defined(__FMA4__)
+# define BOOST_HW_SIMD_X86_AMD BOOST_HW_SIMD_X86_AMD_FMA4_VERSION
+#endif
+#if !defined(BOOST_HW_SIMD_X86_AMD) && defined(__SSE4A__)
+# define BOOST_HW_SIMD_X86_AMD BOOST_HW_SIMD_X86_AMD_SSE4A_VERSION
+#endif
+
+#if !defined(BOOST_HW_SIMD_X86_AMD)
+# define BOOST_HW_SIMD_X86_AMD BOOST_VERSION_NUMBER_NOT_AVAILABLE
+#else
+ // At this point, we know that we have an AMD CPU, we do need to check for
+ // other x86 extensions to determine the final version number.
+# include <boost/predef/hardware/simd/x86.h>
+# if BOOST_HW_SIMD_X86 > BOOST_HW_SIMD_X86_AMD
+# undef BOOST_HW_SIMD_X86_AMD
+# define BOOST_HW_SIMD_X86_AMD BOOST_HW_SIMD_X86
+# endif
+# define BOOST_HW_SIMD_X86_AMD_AVAILABLE
+#endif
+
+#define BOOST_HW_SIMD_X86_AMD_NAME "x86 (AMD) SIMD"
+
+#endif
+
+#include <boost/predef/detail/test.h>
+BOOST_PREDEF_DECLARE_TEST(BOOST_HW_SIMD_X86_AMD, BOOST_HW_SIMD_X86_AMD_NAME)
diff --git a/boost/predef/hardware/simd/x86_amd/versions.h b/boost/predef/hardware/simd/x86_amd/versions.h
new file mode 100644
index 0000000000..a0a9e918bb
--- /dev/null
+++ b/boost/predef/hardware/simd/x86_amd/versions.h
@@ -0,0 +1,51 @@
+/*
+Copyright Charly Chevalier 2015
+Copyright Joel Falcou 2015
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_PREDEF_HARDWARE_SIMD_X86_AMD_VERSIONS_H
+#define BOOST_PREDEF_HARDWARE_SIMD_X86_AMD_VERSIONS_H
+
+#include <boost/predef/version_number.h>
+
+/*`
+ Those defines represent x86 (AMD specific) SIMD extensions versions.
+
+ [note You *MUST* compare them with the predef `BOOST_HW_SIMD_X86_AMD`.]
+ */
+
+
+// ---------------------------------
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_SSE4A_VERSION`]
+
+ [@https://en.wikipedia.org/wiki/SSE4##SSE4A SSE4A] x86 extension (AMD specific).
+
+ Version number is: *4.0.0*.
+ */
+#define BOOST_HW_SIMD_X86_AMD_SSE4A_VERSION BOOST_VERSION_NUMBER(4, 0, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_XOP_VERSION`]
+
+ [@https://en.wikipedia.org/wiki/XOP_instruction_set XOP] x86 extension (AMD specific).
+
+ Version number is: *5.1.0*.
+ */
+#define BOOST_HW_SIMD_X86_AMD_FMA4_VERSION BOOST_VERSION_NUMBER(5, 1, 0)
+
+/*`
+ [heading `BOOST_HW_SIMD_X86_XOP_VERSION`]
+
+ [@https://en.wikipedia.org/wiki/XOP_instruction_set XOP] x86 extension (AMD specific).
+
+ Version number is: *5.1.1*.
+ */
+#define BOOST_HW_SIMD_X86_AMD_XOP_VERSION BOOST_VERSION_NUMBER(5, 1, 1)
+
+
+#endif
diff --git a/boost/predef/platform/windows_desktop.h b/boost/predef/platform/windows_desktop.h
index 2fd7d5d80c..62719b4299 100644
--- a/boost/predef/platform/windows_desktop.h
+++ b/boost/predef/platform/windows_desktop.h
@@ -33,7 +33,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#endif
#if BOOST_PLAT_WINDOWS_DESKTOP
-# define BOOST_PLAT_WINDOWS_DESKTOP_AVALIABLE
+# define BOOST_PLAT_WINDOWS_DESKTOP_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
diff --git a/boost/predef/platform/windows_phone.h b/boost/predef/platform/windows_phone.h
index 495c9180f9..df583adc02 100644
--- a/boost/predef/platform/windows_phone.h
+++ b/boost/predef/platform/windows_phone.h
@@ -31,7 +31,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#endif
#if BOOST_PLAT_WINDOWS_PHONE
-# define BOOST_PLAT_WINDOWS_PHONE_AVALIABLE
+# define BOOST_PLAT_WINDOWS_PHONE_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
diff --git a/boost/predef/platform/windows_runtime.h b/boost/predef/platform/windows_runtime.h
index 902428e567..03be5140e9 100644
--- a/boost/predef/platform/windows_runtime.h
+++ b/boost/predef/platform/windows_runtime.h
@@ -33,7 +33,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#endif
#if BOOST_PLAT_WINDOWS_RUNTIME
-# define BOOST_PLAT_WINDOWS_RUNTIME_AVALIABLE
+# define BOOST_PLAT_WINDOWS_RUNTIME_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
diff --git a/boost/predef/platform/windows_store.h b/boost/predef/platform/windows_store.h
index d65821c5de..a34968b3dd 100644
--- a/boost/predef/platform/windows_store.h
+++ b/boost/predef/platform/windows_store.h
@@ -31,7 +31,7 @@ http://www.boost.org/LICENSE_1_0.txt)
#endif
#if BOOST_PLAT_WINDOWS_STORE
-# define BOOST_PLAT_WINDOWS_STORE_AVALIABLE
+# define BOOST_PLAT_WINDOWS_STORE_AVAILABLE
# include <boost/predef/detail/platform_detected.h>
#endif
diff --git a/boost/predef/version.h b/boost/predef/version.h
index 1d57cbbf99..2fcdefa694 100644
--- a/boost/predef/version.h
+++ b/boost/predef/version.h
@@ -10,6 +10,6 @@ http://www.boost.org/LICENSE_1_0.txt)
#include <boost/predef/version_number.h>
-#define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,3,0)
+#define BOOST_PREDEF_VERSION BOOST_VERSION_NUMBER(1,4,0)
#endif
diff --git a/boost/preprocessor/facilities/identity.hpp b/boost/preprocessor/facilities/identity.hpp
index 13ec4cab88..8a7834d4a5 100644
--- a/boost/preprocessor/facilities/identity.hpp
+++ b/boost/preprocessor/facilities/identity.hpp
@@ -8,6 +8,7 @@
# */
#
# /* Revised by Paul Mensonides (2002) */
+# /* Revised by Edward Diener (2015) */
#
# /* See http://www.boost.org for most recent version. */
#
@@ -15,9 +16,12 @@
# define BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP
#
# include <boost/preprocessor/facilities/empty.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
#
# /* BOOST_PP_IDENTITY */
#
# define BOOST_PP_IDENTITY(item) item BOOST_PP_EMPTY
#
+# define BOOST_PP_IDENTITY_N(item,n) item BOOST_PP_TUPLE_EAT_N(n)
+#
# endif
diff --git a/boost/preprocessor/tuple/eat.hpp b/boost/preprocessor/tuple/eat.hpp
index 708015e140..7e8a100675 100644
--- a/boost/preprocessor/tuple/eat.hpp
+++ b/boost/preprocessor/tuple/eat.hpp
@@ -8,7 +8,7 @@
# */
#
# /* Revised by Paul Mensonides (2002-2011) */
-# /* Revised by Edward Diener (2011) */
+# /* Revised by Edward Diener (2011,2015) */
#
# /* See http://www.boost.org for most recent version. */
#
@@ -38,6 +38,15 @@
# endif
# define BOOST_PP_TUPLE_EAT_I(size) BOOST_PP_TUPLE_EAT_ ## size
# endif
+#
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
+# define BOOST_PP_TUPLE_EAT_N(size) BOOST_PP_TUPLE_EAT_N_I(size)
+# else
+# define BOOST_PP_TUPLE_EAT_N(size) BOOST_PP_TUPLE_EAT_N_OO((size))
+# define BOOST_PP_TUPLE_EAT_N_OO(par) BOOST_PP_TUPLE_EAT_N_I ## par
+# endif
+# define BOOST_PP_TUPLE_EAT_N_I(size) BOOST_PP_TUPLE_EAT_ ## size
+#
# define BOOST_PP_TUPLE_EAT_1(e0)
# define BOOST_PP_TUPLE_EAT_2(e0, e1)
# define BOOST_PP_TUPLE_EAT_3(e0, e1, e2)
diff --git a/boost/progress.hpp b/boost/progress.hpp
index 62bece0839..027d9f927b 100644
--- a/boost/progress.hpp
+++ b/boost/progress.hpp
@@ -125,12 +125,11 @@ class progress_display : private noncopyable
// use of floating point ensures that both large and small counts
// work correctly. static_cast<>() is also used several places
// to suppress spurious compiler warnings.
- unsigned int tics_needed =
- static_cast<unsigned int>(
- (static_cast<double>(_count)/_expected_count)*50.0 );
+ unsigned int tics_needed = static_cast<unsigned int>((static_cast<double>(_count)
+ / static_cast<double>(_expected_count)) * 50.0);
do { m_os << '*' << std::flush; } while ( ++_tic < tics_needed );
_next_tic_count =
- static_cast<unsigned long>((_tic/50.0)*_expected_count);
+ static_cast<unsigned long>((_tic/50.0) * static_cast<double>(_expected_count));
if ( _count == _expected_count ) {
if ( _tic < 51 ) m_os << '*';
m_os << std::endl;
diff --git a/boost/python/data_members.hpp b/boost/python/data_members.hpp
index 139bde3270..5d3309cf97 100644
--- a/boost/python/data_members.hpp
+++ b/boost/python/data_members.hpp
@@ -305,7 +305,7 @@ inline object make_setter(D& x)
return detail::make_setter(x, default_call_policies(), is_member_pointer<D>(), 0);
}
-# if BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+# if !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
template <class D>
inline object make_setter(D const& x)
{
diff --git a/boost/random.hpp b/boost/random.hpp
index f7c04851d9..a164e7eb1a 100644
--- a/boost/random.hpp
+++ b/boost/random.hpp
@@ -56,6 +56,7 @@
// distributions
#include <boost/random/bernoulli_distribution.hpp>
+#include <boost/random/beta_distribution.hpp>
#include <boost/random/binomial_distribution.hpp>
#include <boost/random/cauchy_distribution.hpp>
#include <boost/random/chi_squared_distribution.hpp>
@@ -65,6 +66,8 @@
#include <boost/random/fisher_f_distribution.hpp>
#include <boost/random/gamma_distribution.hpp>
#include <boost/random/geometric_distribution.hpp>
+#include <boost/random/hyperexponential_distribution.hpp>
+#include <boost/random/laplace_distribution.hpp>
#include <boost/random/lognormal_distribution.hpp>
#include <boost/random/negative_binomial_distribution.hpp>
#include <boost/random/non_central_chi_squared_distribution.hpp>
@@ -83,4 +86,6 @@
#include <boost/random/uniform_smallint.hpp>
#include <boost/random/weibull_distribution.hpp>
+#include <boost/random/generate_canonical.hpp>
+
#endif // BOOST_RANDOM_HPP
diff --git a/boost/random/binomial_distribution.hpp b/boost/random/binomial_distribution.hpp
index 8c880e855c..3efc905746 100644
--- a/boost/random/binomial_distribution.hpp
+++ b/boost/random/binomial_distribution.hpp
@@ -304,7 +304,7 @@ private:
RealType u;
RealType v = uniform_01<RealType>()(urng);
if(v <= btrd.u_rv_r) {
- RealType u = v/btrd.v_r - 0.43;
+ u = v/btrd.v_r - 0.43;
return static_cast<IntType>(floor(
(2*btrd.a/(0.5 - abs(u)) + btrd.b)*u + btrd.c));
}
diff --git a/boost/random/chi_squared_distribution.hpp b/boost/random/chi_squared_distribution.hpp
index ce63584f2d..f0fcce5c5d 100644
--- a/boost/random/chi_squared_distribution.hpp
+++ b/boost/random/chi_squared_distribution.hpp
@@ -90,7 +90,7 @@ public:
* Requires: t >=0 && 0 <= p <= 1
*/
explicit chi_squared_distribution(RealType n_arg = RealType(1))
- : _impl(n_arg / 2)
+ : _impl(static_cast<RealType>(n_arg / 2))
{
}
@@ -99,7 +99,7 @@ public:
* parameters.
*/
explicit chi_squared_distribution(const param_type& parm)
- : _impl(parm.n() / 2)
+ : _impl(static_cast<RealType>(parm.n() / 2))
{
}
@@ -138,7 +138,7 @@ public:
void param(const param_type& parm)
{
typedef gamma_distribution<RealType> impl_type;
- typename impl_type::param_type impl_parm(parm.n() / 2);
+ typename impl_type::param_type impl_parm(static_cast<RealType>(parm.n() / 2));
_impl.param(impl_parm);
}
diff --git a/boost/random/detail/auto_link.hpp b/boost/random/detail/auto_link.hpp
index 6b180cc71e..acbebdd4f0 100644
--- a/boost/random/detail/auto_link.hpp
+++ b/boost/random/detail/auto_link.hpp
@@ -13,13 +13,11 @@
#include <boost/config.hpp>
-#ifdef BOOST_HAS_DECLSPEC
- #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_RANDOM_DYN_LINK)
- #if defined(BOOST_RANDOM_SOURCE)
- #define BOOST_RANDOM_DECL __declspec(dllexport)
- #else
- #define BOOST_RANDOM_DECL __declspec(dllimport)
- #endif
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_RANDOM_DYN_LINK)
+ #if defined(BOOST_RANDOM_SOURCE)
+ #define BOOST_RANDOM_DECL BOOST_SYMBOL_EXPORT
+ #else
+ #define BOOST_RANDOM_DECL BOOST_SYMBOL_IMPORT
#endif
#endif
diff --git a/boost/random/detail/seed_impl.hpp b/boost/random/detail/seed_impl.hpp
index 2451dbe521..918a294457 100644
--- a/boost/random/detail/seed_impl.hpp
+++ b/boost/random/detail/seed_impl.hpp
@@ -19,9 +19,7 @@
#include <boost/config/no_tr1/cmath.hpp>
#include <boost/integer/integer_mask.hpp>
#include <boost/integer/static_log2.hpp>
-#include <boost/type_traits/is_signed.hpp>
-#include <boost/type_traits/is_integral.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/random/traits.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/int.hpp>
@@ -55,8 +53,8 @@ struct const_pow_impl
template<class T>
static T call(T arg, int n, T result)
{
- return const_pow_impl<N / 2>::call(arg * arg, n / 2,
- n%2 == 0? result : result * arg);
+ return const_pow_impl<N / 2>::call(T(arg * arg), n / 2,
+ n%2 == 0? result : T(result * arg));
}
};
@@ -135,7 +133,7 @@ template<class Engine, class Iter>
void generate_from_int(Engine& eng, Iter begin, Iter end)
{
typedef typename Engine::result_type IntType;
- typedef typename boost::make_unsigned<IntType>::type unsigned_type;
+ typedef typename boost::random::traits::make_unsigned<IntType>::type unsigned_type;
int remaining_bits = 0;
boost::uint_least32_t saved_bits = 0;
unsigned_type range = boost::random::detail::subtract<IntType>()((eng.max)(), (eng.min)());
@@ -219,7 +217,7 @@ void generate_impl(Engine& eng, Iter first, Iter last, boost::mpl::false_)
template<class Engine, class Iter>
void generate(Engine& eng, Iter first, Iter last)
{
- return detail::generate_impl(eng, first, last, boost::is_integral<typename Engine::result_type>());
+ return detail::generate_impl(eng, first, last, boost::random::traits::is_integral<typename Engine::result_type>());
}
@@ -281,6 +279,7 @@ void seed_array_int_impl(SeedSeq& seq, UIntType (&x)[n])
template<int w, std::size_t n, class SeedSeq, class IntType>
inline void seed_array_int_impl(SeedSeq& seq, IntType (&x)[n], boost::mpl::true_)
{
+ BOOST_STATIC_ASSERT_MSG(boost::is_integral<IntType>::value, "Sorry but this routine has not been ported to non built-in integers as it relies on a reinterpret_cast.");
typedef typename boost::make_unsigned<IntType>::type unsigned_array[n];
seed_array_int_impl<w>(seq, reinterpret_cast<unsigned_array&>(x));
}
@@ -294,7 +293,7 @@ inline void seed_array_int_impl(SeedSeq& seq, IntType (&x)[n], boost::mpl::false
template<int w, std::size_t n, class SeedSeq, class IntType>
inline void seed_array_int(SeedSeq& seq, IntType (&x)[n])
{
- seed_array_int_impl<w>(seq, x, boost::is_signed<IntType>());
+ seed_array_int_impl<w>(seq, x, boost::random::traits::is_signed<IntType>());
}
template<int w, std::size_t n, class Iter, class UIntType>
@@ -315,6 +314,7 @@ void fill_array_int_impl(Iter& first, Iter last, UIntType (&x)[n])
template<int w, std::size_t n, class Iter, class IntType>
inline void fill_array_int_impl(Iter& first, Iter last, IntType (&x)[n], boost::mpl::true_)
{
+ BOOST_STATIC_ASSERT_MSG(boost::is_integral<IntType>::value, "Sorry but this routine has not been ported to non built-in integers as it relies on a reinterpret_cast.");
typedef typename boost::make_unsigned<IntType>::type unsigned_array[n];
fill_array_int_impl<w>(first, last, reinterpret_cast<unsigned_array&>(x));
}
@@ -328,7 +328,7 @@ inline void fill_array_int_impl(Iter& first, Iter last, IntType (&x)[n], boost::
template<int w, std::size_t n, class Iter, class IntType>
inline void fill_array_int(Iter& first, Iter last, IntType (&x)[n])
{
- fill_array_int_impl<w>(first, last, x, boost::is_signed<IntType>());
+ fill_array_int_impl<w>(first, last, x, boost::random::traits::is_signed<IntType>());
}
template<int w, std::size_t n, class RealType>
diff --git a/boost/random/detail/signed_unsigned_tools.hpp b/boost/random/detail/signed_unsigned_tools.hpp
index 988cfb84db..1979908a31 100644
--- a/boost/random/detail/signed_unsigned_tools.hpp
+++ b/boost/random/detail/signed_unsigned_tools.hpp
@@ -13,7 +13,7 @@
#include <boost/limits.hpp>
#include <boost/config.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/random/traits.hpp>
namespace boost {
namespace random {
@@ -24,7 +24,7 @@ namespace detail {
* Compute x - y, we know that x >= y, return an unsigned value.
*/
-template<class T, bool sgn = std::numeric_limits<T>::is_signed>
+template<class T, bool sgn = std::numeric_limits<T>::is_signed && std::numeric_limits<T>::is_bounded>
struct subtract { };
template<class T>
@@ -37,7 +37,7 @@ struct subtract<T, /* signed */ false>
template<class T>
struct subtract<T, /* signed */ true>
{
- typedef typename make_unsigned<T>::type result_type;
+ typedef typename boost::random::traits::make_unsigned_or_unbounded<T>::type result_type;
result_type operator()(T x, T y)
{
if (y >= 0) // because x >= y, it follows that x >= 0, too
@@ -54,11 +54,11 @@ struct subtract<T, /* signed */ true>
* Compute x + y, x is unsigned, result fits in type of "y".
*/
-template<class T1, class T2, bool sgn = std::numeric_limits<T2>::is_signed>
+template<class T1, class T2, bool sgn = (std::numeric_limits<T2>::is_signed && (std::numeric_limits<T1>::digits >= std::numeric_limits<T2>::digits))>
struct add { };
template<class T1, class T2>
-struct add<T1, T2, /* signed */ false>
+struct add<T1, T2, /* signed or else T2 has more digits than T1 so the cast always works - needed when T2 is a multiprecision type and T1 is a native integer */ false>
{
typedef T2 result_type;
result_type operator()(T1 x, T2 y) { return T2(x) + y; }
diff --git a/boost/random/discrete_distribution.hpp b/boost/random/discrete_distribution.hpp
index 6407272093..3d14d4a02c 100644
--- a/boost/random/discrete_distribution.hpp
+++ b/boost/random/discrete_distribution.hpp
@@ -434,10 +434,10 @@ public:
result = uniform_int_distribution<IntType>((min)(), (max)())(urng);
test = _impl.test(urng);
} while(!_impl.accept(result, test));
- if(test < _impl._alias_table[result].first) {
+ if(test < _impl._alias_table[static_cast<std::size_t>(result)].first) {
return result;
} else {
- return(_impl._alias_table[result].second);
+ return(_impl._alias_table[static_cast<std::size_t>(result)].second);
}
}
@@ -495,7 +495,7 @@ public:
*/
std::vector<WeightType> probabilities() const
{
- std::vector<WeightType> result(_impl._alias_table.size());
+ std::vector<WeightType> result(_impl._alias_table.size(), static_cast<WeightType>(0));
std::size_t i = 0;
for(typename impl_type::alias_table_t::const_iterator
iter = _impl._alias_table.begin(),
@@ -504,7 +504,7 @@ public:
{
WeightType val = iter->first;
result[i] += val;
- result[iter->second] += _impl.get_weight(i) - val;
+ result[static_cast<std::size_t>(iter->second)] += _impl.get_weight(i) - val;
}
impl_type::normalize(result);
return(result);
@@ -593,7 +593,7 @@ private:
a_end = above_average.end()
;
while(b_iter != b_end && a_iter != a_end) {
- _impl._alias_table[b_iter->second] =
+ _impl._alias_table[static_cast<std::size_t>(b_iter->second)] =
std::make_pair(b_iter->first, a_iter->second);
a_iter->first -= (_impl.get_weight(b_iter->second) - b_iter->first);
if(a_iter->first < normalized_average) {
@@ -603,11 +603,11 @@ private:
}
}
for(; b_iter != b_end; ++b_iter) {
- _impl._alias_table[b_iter->second].first =
+ _impl._alias_table[static_cast<std::size_t>(b_iter->second)].first =
_impl.get_weight(b_iter->second);
}
for(; a_iter != a_end; ++a_iter) {
- _impl._alias_table[a_iter->second].first =
+ _impl._alias_table[static_cast<std::size_t>(a_iter->second)].first =
_impl.get_weight(a_iter->second);
}
}
diff --git a/boost/random/generate_canonical.hpp b/boost/random/generate_canonical.hpp
index d8ff144d6c..112784742b 100644
--- a/boost/random/generate_canonical.hpp
+++ b/boost/random/generate_canonical.hpp
@@ -80,7 +80,7 @@ template<class RealType, std::size_t bits, class URNG>
RealType generate_canonical(URNG& g)
{
RealType result = detail::generate_canonical_impl<RealType, bits>(
- g, boost::is_integral<typename URNG::result_type>());
+ g, boost::random::traits::is_integral<typename URNG::result_type>());
BOOST_ASSERT(result >= 0);
BOOST_ASSERT(result <= 1);
if(result == 1) {
diff --git a/boost/random/hyperexponential_distribution.hpp b/boost/random/hyperexponential_distribution.hpp
new file mode 100644
index 0000000000..046d0fc401
--- /dev/null
+++ b/boost/random/hyperexponential_distribution.hpp
@@ -0,0 +1,883 @@
+/* boost random/hyperexponential_distribution.hpp header file
+ *
+ * Copyright Marco Guazzone 2014
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * Much of the code here taken by boost::math::hyperexponential_distribution.
+ * To this end, we would like to thank Paul Bristow and John Maddock for their
+ * valuable feedback.
+ *
+ * \author Marco Guazzone (marco.guazzone@gmail.com)
+ */
+
+#ifndef BOOST_RANDOM_HYPEREXPONENTIAL_DISTRIBUTION_HPP
+#define BOOST_RANDOM_HYPEREXPONENTIAL_DISTRIBUTION_HPP
+
+
+#include <boost/config.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/random/detail/operators.hpp>
+#include <boost/random/detail/vector_io.hpp>
+#include <boost/random/discrete_distribution.hpp>
+#include <boost/random/exponential_distribution.hpp>
+#include <boost/range/begin.hpp>
+#include <boost/range/end.hpp>
+#include <boost/range/size.hpp>
+#include <boost/type_traits/has_pre_increment.hpp>
+#include <cassert>
+#include <cmath>
+#include <cstddef>
+#include <iterator>
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+# include <initializer_list>
+#endif // BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+#include <iostream>
+#include <limits>
+#include <numeric>
+#include <vector>
+
+
+namespace boost { namespace random {
+
+namespace hyperexp_detail {
+
+template <typename T>
+std::vector<T>& normalize(std::vector<T>& v)
+{
+ if (v.size() == 0)
+ {
+ return v;
+ }
+
+ const T sum = std::accumulate(v.begin(), v.end(), static_cast<T>(0));
+ T final_sum = 0;
+
+ const typename std::vector<T>::iterator end = --v.end();
+ for (typename std::vector<T>::iterator it = v.begin();
+ it != end;
+ ++it)
+ {
+ *it /= sum;
+ final_sum += *it;
+ }
+ *end = 1-final_sum; // avoids round off errors thus ensuring the probabilities really sum to 1
+
+ return v;
+}
+
+template <typename RealT>
+bool check_probabilities(std::vector<RealT> const& probabilities)
+{
+ const std::size_t n = probabilities.size();
+ RealT sum = 0;
+ for (std::size_t i = 0; i < n; ++i)
+ {
+ if (probabilities[i] < 0
+ || probabilities[i] > 1
+ || !(boost::math::isfinite)(probabilities[i]))
+ {
+ return false;
+ }
+ sum += probabilities[i];
+ }
+
+ //NOTE: the check below seems to fail on some architectures.
+ // So we commented it.
+ //// - We try to keep phase probabilities correctly normalized in the distribution constructors
+ //// - However in practice we have to allow for a very slight divergence from a sum of exactly 1:
+ ////if (std::abs(sum-1) > (std::numeric_limits<RealT>::epsilon()*2))
+ //// This is from Knuth "The Art of Computer Programming: Vol.2, 3rd Ed", and can be used to
+ //// check is two numbers are approximately equal
+ //const RealT one = 1;
+ //const RealT tol = std::numeric_limits<RealT>::epsilon()*2.0;
+ //if (std::abs(sum-one) > (std::max(std::abs(sum), std::abs(one))*tol))
+ //{
+ // return false;
+ //}
+
+ return true;
+}
+
+template <typename RealT>
+bool check_rates(std::vector<RealT> const& rates)
+{
+ const std::size_t n = rates.size();
+ for (std::size_t i = 0; i < n; ++i)
+ {
+ if (rates[i] <= 0
+ || !(boost::math::isfinite)(rates[i]))
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+template <typename RealT>
+bool check_params(std::vector<RealT> const& probabilities, std::vector<RealT> const& rates)
+{
+ if (probabilities.size() != rates.size())
+ {
+ return false;
+ }
+
+ return check_probabilities(probabilities)
+ && check_rates(rates);
+}
+
+} // Namespace hyperexp_detail
+
+
+/**
+ * The hyperexponential distribution is a real-valued continuous distribution
+ * with two parameters, the <em>phase probability vector</em> \c probs and the
+ * <em>rate vector</em> \c rates.
+ *
+ * A \f$k\f$-phase hyperexponential distribution is a mixture of \f$k\f$
+ * exponential distributions.
+ * For this reason, it is also referred to as <em>mixed exponential
+ * distribution</em> or <em>parallel \f$k\f$-phase exponential
+ * distribution</em>.
+ *
+ * A \f$k\f$-phase hyperexponential distribution is characterized by two
+ * parameters, namely a <em>phase probability vector</em> \f$\mathbf{\alpha}=(\alpha_1,\ldots,\alpha_k)\f$ and a <em>rate vector</em> \f$\mathbf{\lambda}=(\lambda_1,\ldots,\lambda_k)\f$.
+ *
+ * A \f$k\f$-phase hyperexponential distribution is frequently used in
+ * <em>queueing theory</em> to model the distribution of the superposition of
+ * \f$k\f$ independent events, like, for instance, the service time distribution
+ * of a queueing station with \f$k\f$ servers in parallel where the \f$i\f$-th
+ * server is chosen with probability \f$\alpha_i\f$ and its service time
+ * distribution is an exponential distribution with rate \f$\lambda_i\f$
+ * (Allen,1990; Papadopolous et al.,1993; Trivedi,2002).
+ *
+ * For instance, CPUs service-time distribution in a computing system has often
+ * been observed to possess such a distribution (Rosin,1965).
+ * Also, the arrival of different types of customer to a single queueing station
+ * is often modeled as a hyperexponential distribution (Papadopolous et al.,1993).
+ * Similarly, if a product manufactured in several parallel assemply lines and
+ * the outputs are merged, the failure density of the overall product is likely
+ * to be hyperexponential (Trivedi,2002).
+ *
+ * Finally, since the hyperexponential distribution exhibits a high Coefficient
+ * of Variation (CoV), that is a CoV > 1, it is especially suited to fit
+ * empirical data with large CoV (Feitelson,2014; Wolski et al.,2013) and to
+ * approximate <em>long-tail probability distributions</em> (Feldmann et al.,1998).
+ *
+ * See (Boost,2014) for more information and examples.
+ *
+ * A \f$k\f$-phase hyperexponential distribution has a probability density
+ * function
+ * \f[
+ * f(x) = \sum_{i=1}^k \alpha_i \lambda_i e^{-x\lambda_i}
+ * \f]
+ * where:
+ * - \f$k\f$ is the <em>number of phases</em> and also the size of the input
+ * vector parameters,
+ * - \f$\mathbf{\alpha}=(\alpha_1,\ldots,\alpha_k)\f$ is the <em>phase probability
+ * vector</em> parameter, and
+ * - \f$\mathbf{\lambda}=(\lambda_1,\ldots,\lambda_k)\f$ is the <em>rate vector</em>
+ * parameter.
+ * .
+ *
+ * Given a \f$k\f$-phase hyperexponential distribution with phase probability
+ * vector \f$\mathbf{\alpha}\f$ and rate vector \f$\mathbf{\lambda}\f$, the
+ * random variate generation algorithm consists of the following steps (Tyszer,1999):
+ * -# Generate a random variable \f$U\f$ uniformly distribution on the interval \f$(0,1)\f$.
+ * -# Use \f$U\f$ to select the appropriate \f$\lambda_i\f$ (e.g., the
+ * <em>alias method</em> can possibly be used for this step).
+ * -# Generate an exponentially distributed random variable \f$X\f$ with rate parameter \f$\lambda_i\f$.
+ * -# Return \f$X\f$.
+ * .
+ *
+ * References:
+ * -# A.O. Allen, <em>Probability, Statistics, and Queuing Theory with Computer Science Applications, Second Edition</em>, Academic Press, 1990.
+ * -# Boost C++ Libraries, <em>Boost.Math / Statistical Distributions: Hyperexponential Distribution</em>, Online: http://www.boost.org/doc/libs/release/libs/math/doc/html/dist.html , 2014.
+ * -# D.G. Feitelson, <em>Workload Modeling for Computer Systems Performance Evaluation</em>, Cambridge University Press, 2014
+ * -# A. Feldmann and W. Whitt, <em>Fitting mixtures of exponentials to long-tail distributions to analyze network performance models</em>, Performance Evaluation 31(3-4):245, doi:10.1016/S0166-5316(97)00003-5, 1998.
+ * -# H.T. Papadopolous, C. Heavey and J. Browne, <em>Queueing Theory in Manufacturing Systems Analysis and Design</em>, Chapman & Hall/CRC, 1993, p. 35.
+ * -# R.F. Rosin, <em>Determining a computing center environment</em>, Communications of the ACM 8(7):463-468, 1965.
+ * -# K.S. Trivedi, <em>Probability and Statistics with Reliability, Queueing, and Computer Science Applications</em>, John Wiley & Sons, Inc., 2002.
+ * -# J. Tyszer, <em>Object-Oriented Computer Simulation of Discrete-Event Systems</em>, Springer, 1999.
+ * -# Wikipedia, <em>Hyperexponential Distribution</em>, Online: http://en.wikipedia.org/wiki/Hyperexponential_distribution , 2014.
+ * -# Wolfram Mathematica, <em>Hyperexponential Distribution</em>, Online: http://reference.wolfram.com/language/ref/HyperexponentialDistribution.html , 2014.
+ * .
+ *
+ * \author Marco Guazzone (marco.guazzone@gmail.com)
+ */
+template<class RealT = double>
+class hyperexponential_distribution
+{
+ public: typedef RealT result_type;
+ public: typedef RealT input_type;
+
+
+ /**
+ * The parameters of a hyperexponential distribution.
+ *
+ * Stores the <em>phase probability vector</em> and the <em>rate vector</em>
+ * of the hyperexponential distribution.
+ *
+ * \author Marco Guazzone (marco.guazzone@gmail.com)
+ */
+ public: class param_type
+ {
+ public: typedef hyperexponential_distribution distribution_type;
+
+ /**
+ * Constructs a \c param_type with the default parameters
+ * of the distribution.
+ */
+ public: param_type()
+ : probs_(1, 1),
+ rates_(1, 1)
+ {
+ }
+
+ /**
+ * Constructs a \c param_type from the <em>phase probability vector</em>
+ * and <em>rate vector</em> parameters of the distribution.
+ *
+ * The <em>phase probability vector</em> parameter is given by the range
+ * defined by [\a prob_first, \a prob_last) iterator pair, and the
+ * <em>rate vector</em> parameter is given by the range defined by
+ * [\a rate_first, \a rate_last) iterator pair.
+ *
+ * \tparam ProbIterT Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ * \tparam RateIterT Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ *
+ * \param prob_first The iterator to the beginning of the range of non-negative real elements representing the phase probabilities; if elements don't sum to 1, they are normalized.
+ * \param prob_last The iterator to the ending of the range of non-negative real elements representing the phase probabilities; if elements don't sum to 1, they are normalized.
+ * \param rate_first The iterator to the beginning of the range of non-negative real elements representing the rates.
+ * \param rate_last The iterator to the ending of the range of non-negative real elements representing the rates.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ public: template <typename ProbIterT, typename RateIterT>
+ param_type(ProbIterT prob_first, ProbIterT prob_last,
+ RateIterT rate_first, RateIterT rate_last)
+ : probs_(prob_first, prob_last),
+ rates_(rate_first, rate_last)
+ {
+ hyperexp_detail::normalize(probs_);
+
+ assert( hyperexp_detail::check_params(probs_, rates_) );
+ }
+
+ /**
+ * Constructs a \c param_type from the <em>phase probability vector</em>
+ * and <em>rate vector</em> parameters of the distribution.
+ *
+ * The <em>phase probability vector</em> parameter is given by the range
+ * defined by \a prob_range, and the <em>rate vector</em> parameter is
+ * given by the range defined by \a rate_range.
+ *
+ * \tparam ProbRangeT Must meet the requirements of <a href="boost:/libs/range/doc/html/range/concepts.html">Range</a> concept.
+ * \tparam RateRangeT Must meet the requirements of <a href="boost:/libs/range/doc/html/range/concepts.html">Range</a> concept.
+ *
+ * \param prob_range The range of non-negative real elements representing the phase probabilities; if elements don't sum to 1, they are normalized.
+ * \param rate_range The range of positive real elements representing the rates.
+ *
+ * \note
+ * The final \c disable_if parameter is an implementation detail that
+ * differentiates between this two argument constructor and the
+ * iterator-based two argument constructor described below.
+ */
+ // We SFINAE this out of existance if either argument type is
+ // incrementable as in that case the type is probably an iterator:
+ public: template <typename ProbRangeT, typename RateRangeT>
+ param_type(ProbRangeT const& prob_range,
+ RateRangeT const& rate_range,
+ typename boost::disable_if_c<boost::has_pre_increment<ProbRangeT>::value || boost::has_pre_increment<RateRangeT>::value>::type* = 0)
+ : probs_(boost::begin(prob_range), boost::end(prob_range)),
+ rates_(boost::begin(rate_range), boost::end(rate_range))
+ {
+ hyperexp_detail::normalize(probs_);
+
+ assert( hyperexp_detail::check_params(probs_, rates_) );
+ }
+
+ /**
+ * Constructs a \c param_type from the <em>rate vector</em> parameter of
+ * the distribution and with equal phase probabilities.
+ *
+ * The <em>rate vector</em> parameter is given by the range defined by
+ * [\a rate_first, \a rate_last) iterator pair, and the <em>phase
+ * probability vector</em> parameter is set to the equal phase
+ * probabilities (i.e., to a vector of the same length \f$k\f$ of the
+ * <em>rate vector</em> and with each element set to \f$1.0/k\f$).
+ *
+ * \tparam RateIterT Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ * \tparam RateIterT2 Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ *
+ * \param rate_first The iterator to the beginning of the range of non-negative real elements representing the rates.
+ * \param rate_last The iterator to the ending of the range of non-negative real elements representing the rates.
+ *
+ * \note
+ * The final \c disable_if parameter is an implementation detail that
+ * differentiates between this two argument constructor and the
+ * range-based two argument constructor described above.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ // We SFINAE this out of existance if the argument type is
+ // incrementable as in that case the type is probably an iterator.
+ public: template <typename RateIterT>
+ param_type(RateIterT rate_first,
+ RateIterT rate_last,
+ typename boost::enable_if_c<boost::has_pre_increment<RateIterT>::value>::type* = 0)
+ : probs_(std::distance(rate_first, rate_last), 1), // will be normalized below
+ rates_(rate_first, rate_last)
+ {
+ assert(probs_.size() == rates_.size());
+ }
+
+ /**
+ * Constructs a @c param_type from the "rates" parameters
+ * of the distribution and with equal phase probabilities.
+ *
+ * The <em>rate vector</em> parameter is given by the range defined by
+ * \a rate_range, and the <em>phase probability vector</em> parameter is
+ * set to the equal phase probabilities (i.e., to a vector of the same
+ * length \f$k\f$ of the <em>rate vector</em> and with each element set
+ * to \f$1.0/k\f$).
+ *
+ * \tparam RateRangeT Must meet the requirements of <a href="boost:/libs/range/doc/html/range/concepts.html">Range</a> concept.
+ *
+ * \param rate_range The range of positive real elements representing the rates.
+ */
+ public: template <typename RateRangeT>
+ param_type(RateRangeT const& rate_range)
+ : probs_(boost::size(rate_range), 1), // Will be normalized below
+ rates_(boost::begin(rate_range), boost::end(rate_range))
+ {
+ hyperexp_detail::normalize(probs_);
+
+ assert( hyperexp_detail::check_params(probs_, rates_) );
+ }
+
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+ /**
+ * Constructs a \c param_type from the <em>phase probability vector</em>
+ * and <em>rate vector</em> parameters of the distribution.
+ *
+ * The <em>phase probability vector</em> parameter is given by the
+ * <em>brace-init-list</em> (ISO,2014,sec. 8.5.4 [dcl.init.list])
+ * defined by \a l1, and the <em>rate vector</em> parameter is given by the
+ * <em>brace-init-list</em> (ISO,2014,sec. 8.5.4 [dcl.init.list])
+ * defined by \a l2.
+ *
+ * \param l1 The initializer list for inizializing the phase probability vector.
+ * \param l2 The initializer list for inizializing the rate vector.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ public: param_type(std::initializer_list<RealT> l1, std::initializer_list<RealT> l2)
+ : probs_(l1.begin(), l1.end()),
+ rates_(l2.begin(), l2.end())
+ {
+ hyperexp_detail::normalize(probs_);
+
+ assert( hyperexp_detail::check_params(probs_, rates_) );
+ }
+
+ /**
+ * Constructs a \c param_type from the <em>rate vector</em> parameter
+ * of the distribution and with equal phase probabilities.
+ *
+ * The <em>rate vector</em> parameter is given by the
+ * <em>brace-init-list</em> (ISO,2014,sec. 8.5.4 [dcl.init.list])
+ * defined by \a l1, and the <em>phase probability vector</em> parameter is
+ * set to the equal phase probabilities (i.e., to a vector of the same
+ * length \f$k\f$ of the <em>rate vector</em> and with each element set
+ * to \f$1.0/k\f$).
+ *
+ * \param l1 The initializer list for inizializing the rate vector.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ public: param_type(std::initializer_list<RealT> l1)
+ : probs_(std::distance(l1.begin(), l1.end()), 1), // Will be normalized below
+ rates_(l1.begin(), l1.end())
+ {
+ hyperexp_detail::normalize(probs_);
+
+ assert( hyperexp_detail::check_params(probs_, rates_) );
+ }
+#endif // BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+
+ /**
+ * Gets the <em>phase probability vector</em> parameter of the distribtuion.
+ *
+ * \return The <em>phase probability vector</em> parameter of the distribution.
+ *
+ * \note
+ * The returned probabilities are the normalized version of the ones
+ * passed at construction time.
+ */
+ public: std::vector<RealT> probabilities() const
+ {
+ return probs_;
+ }
+
+ /**
+ * Gets the <em>rate vector</em> parameter of the distribtuion.
+ *
+ * \return The <em>rate vector</em> parameter of the distribution.
+ */
+ public: std::vector<RealT> rates() const
+ {
+ return rates_;
+ }
+
+ /** Writes a \c param_type to a \c std::ostream. */
+ public: BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, param)
+ {
+ detail::print_vector(os, param.probs_);
+ os << ' ';
+ detail::print_vector(os, param.rates_);
+
+ return os;
+ }
+
+ /** Reads a \c param_type from a \c std::istream. */
+ public: BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, param)
+ {
+ // NOTE: if \c std::ios_base::exceptions is set, the code below may
+ // throw in case of a I/O failure.
+ // To prevent leaving the state of \c param inconsistent:
+ // - if an exception is thrown, the state of \c param is left
+ // unchanged (i.e., is the same as the one at the beginning
+ // of the function's execution), and
+ // - the state of \c param only after reading the whole input.
+
+ std::vector<RealT> probs;
+ std::vector<RealT> rates;
+
+ // Reads probability and rate vectors
+ detail::read_vector(is, probs);
+ if (!is)
+ {
+ return is;
+ }
+ is >> std::ws;
+ detail::read_vector(is, rates);
+ if (!is)
+ {
+ return is;
+ }
+
+ // Update the state of the param_type object
+ if (probs.size() > 0)
+ {
+ param.probs_.swap(probs);
+ probs.clear();
+ }
+ if (rates.size() > 0)
+ {
+ param.rates_.swap(rates);
+ rates.clear();
+ }
+
+ bool fail = false;
+
+ // Adjust vector sizes (if needed)
+ if (param.probs_.size() != param.rates_.size()
+ || param.probs_.size() == 0)
+ {
+ fail = true;
+
+ const std::size_t np = param.probs_.size();
+ const std::size_t nr = param.rates_.size();
+
+ if (np > nr)
+ {
+ param.rates_.resize(np, 1);
+ }
+ else if (nr > np)
+ {
+ param.probs_.resize(nr, 1);
+ }
+ else
+ {
+ param.probs_.resize(1, 1);
+ param.rates_.resize(1, 1);
+ }
+ }
+
+ // Normalize probabilities
+ // NOTE: this cannot be done earlier since the probability vector
+ // can be changed due to size conformance
+ hyperexp_detail::normalize(param.probs_);
+
+ // Set the error state in the underlying stream in case of invalid input
+ if (fail)
+ {
+ // This throws an exception if ios_base::exception(failbit) is enabled
+ is.setstate(std::ios_base::failbit);
+ }
+
+ //post: vector size conformance
+ assert(param.probs_.size() == param.rates_.size());
+
+ return is;
+ }
+
+ /** Returns true if the two sets of parameters are the same. */
+ public: BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs)
+ {
+ return lhs.probs_ == rhs.probs_
+ && lhs.rates_ == rhs.rates_;
+ }
+
+ /** Returns true if the two sets of parameters are the different. */
+ public: BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type)
+
+
+ private: std::vector<RealT> probs_; ///< The <em>phase probability vector</em> parameter of the distribution
+ private: std::vector<RealT> rates_; ///< The <em>rate vector</em> parameter of the distribution
+ }; // param_type
+
+
+ /**
+ * Constructs a 1-phase \c hyperexponential_distribution (i.e., an
+ * exponential distribution) with rate 1.
+ */
+ public: hyperexponential_distribution()
+ : dd_(std::vector<RealT>(1, 1)),
+ rates_(1, 1)
+ {
+ // empty
+ }
+
+ /**
+ * Constructs a \c hyperexponential_distribution from the <em>phase
+ * probability vector</em> and <em>rate vector</em> parameters of the
+ * distribution.
+ *
+ * The <em>phase probability vector</em> parameter is given by the range
+ * defined by [\a prob_first, \a prob_last) iterator pair, and the
+ * <em>rate vector</em> parameter is given by the range defined by
+ * [\a rate_first, \a rate_last) iterator pair.
+ *
+ * \tparam ProbIterT Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ * \tparam RateIterT Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ *
+ * \param prob_first The iterator to the beginning of the range of non-negative real elements representing the phase probabilities; if elements don't sum to 1, they are normalized.
+ * \param prob_last The iterator to the ending of the range of non-negative real elements representing the phase probabilities; if elements don't sum to 1, they are normalized.
+ * \param rate_first The iterator to the beginning of the range of non-negative real elements representing the rates.
+ * \param rate_last The iterator to the ending of the range of non-negative real elements representing the rates.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ public: template <typename ProbIterT, typename RateIterT>
+ hyperexponential_distribution(ProbIterT prob_first, ProbIterT prob_last,
+ RateIterT rate_first, RateIterT rate_last)
+ : dd_(prob_first, prob_last),
+ rates_(rate_first, rate_last)
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+
+ /**
+ * Constructs a \c hyperexponential_distribution from the <em>phase
+ * probability vector</em> and <em>rate vector</em> parameters of the
+ * distribution.
+ *
+ * The <em>phase probability vector</em> parameter is given by the range
+ * defined by \a prob_range, and the <em>rate vector</em> parameter is
+ * given by the range defined by \a rate_range.
+ *
+ * \tparam ProbRangeT Must meet the requirements of <a href="boost:/libs/range/doc/html/range/concepts.html">Range</a> concept.
+ * \tparam RateRangeT Must meet the requirements of <a href="boost:/libs/range/doc/html/range/concepts.html">Range</a> concept.
+ *
+ * \param prob_range The range of non-negative real elements representing the phase probabilities; if elements don't sum to 1, they are normalized.
+ * \param rate_range The range of positive real elements representing the rates.
+ *
+ * \note
+ * The final \c disable_if parameter is an implementation detail that
+ * differentiates between this two argument constructor and the
+ * iterator-based two argument constructor described below.
+ */
+ // We SFINAE this out of existance if either argument type is
+ // incrementable as in that case the type is probably an iterator:
+ public: template <typename ProbRangeT, typename RateRangeT>
+ hyperexponential_distribution(ProbRangeT const& prob_range,
+ RateRangeT const& rate_range,
+ typename boost::disable_if_c<boost::has_pre_increment<ProbRangeT>::value || boost::has_pre_increment<RateRangeT>::value>::type* = 0)
+ : dd_(prob_range),
+ rates_(boost::begin(rate_range), boost::end(rate_range))
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+
+ /**
+ * Constructs a \c hyperexponential_distribution from the <em>rate
+ * vector</em> parameter of the distribution and with equal phase
+ * probabilities.
+ *
+ * The <em>rate vector</em> parameter is given by the range defined by
+ * [\a rate_first, \a rate_last) iterator pair, and the <em>phase
+ * probability vector</em> parameter is set to the equal phase
+ * probabilities (i.e., to a vector of the same length \f$k\f$ of the
+ * <em>rate vector</em> and with each element set to \f$1.0/k\f$).
+ *
+ * \tparam RateIterT Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ * \tparam RateIterT2 Must meet the requirements of \c InputIterator concept (ISO,2014,sec. 24.2.3 [input.iterators]).
+ *
+ * \param rate_first The iterator to the beginning of the range of non-negative real elements representing the rates.
+ * \param rate_last The iterator to the ending of the range of non-negative real elements representing the rates.
+ *
+ * \note
+ * The final \c disable_if parameter is an implementation detail that
+ * differentiates between this two argument constructor and the
+ * range-based two argument constructor described above.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ // We SFINAE this out of existance if the argument type is
+ // incrementable as in that case the type is probably an iterator.
+ public: template <typename RateIterT>
+ hyperexponential_distribution(RateIterT rate_first,
+ RateIterT rate_last,
+ typename boost::enable_if_c<boost::has_pre_increment<RateIterT>::value>::type* = 0)
+ : dd_(std::vector<RealT>(std::distance(rate_first, rate_last), 1)),
+ rates_(rate_first, rate_last)
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+
+ /**
+ * Constructs a @c param_type from the "rates" parameters
+ * of the distribution and with equal phase probabilities.
+ *
+ * The <em>rate vector</em> parameter is given by the range defined by
+ * \a rate_range, and the <em>phase probability vector</em> parameter is
+ * set to the equal phase probabilities (i.e., to a vector of the same
+ * length \f$k\f$ of the <em>rate vector</em> and with each element set
+ * to \f$1.0/k\f$).
+ *
+ * \tparam RateRangeT Must meet the requirements of <a href="boost:/libs/range/doc/html/range/concepts.html">Range</a> concept.
+ *
+ * \param rate_range The range of positive real elements representing the rates.
+ */
+ public: template <typename RateRangeT>
+ hyperexponential_distribution(RateRangeT const& rate_range)
+ : dd_(std::vector<RealT>(boost::size(rate_range), 1)),
+ rates_(boost::begin(rate_range), boost::end(rate_range))
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+
+ /**
+ * Constructs a \c hyperexponential_distribution from its parameters.
+ *
+ * \param param The parameters of the distribution.
+ */
+ public: explicit hyperexponential_distribution(param_type const& param)
+ : dd_(param.probabilities()),
+ rates_(param.rates())
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+
+#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST
+ /**
+ * Constructs a \c hyperexponential_distribution from the <em>phase
+ * probability vector</em> and <em>rate vector</em> parameters of the
+ * distribution.
+ *
+ * The <em>phase probability vector</em> parameter is given by the
+ * <em>brace-init-list</em> (ISO,2014,sec. 8.5.4 [dcl.init.list])
+ * defined by \a l1, and the <em>rate vector</em> parameter is given by the
+ * <em>brace-init-list</em> (ISO,2014,sec. 8.5.4 [dcl.init.list])
+ * defined by \a l2.
+ *
+ * \param l1 The initializer list for inizializing the phase probability vector.
+ * \param l2 The initializer list for inizializing the rate vector.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ public: hyperexponential_distribution(std::initializer_list<RealT> const& l1, std::initializer_list<RealT> const& l2)
+ : dd_(l1.begin(), l1.end()),
+ rates_(l2.begin(), l2.end())
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+
+ /**
+ * Constructs a \c hyperexponential_distribution from the <em>rate
+ * vector</em> parameter of the distribution and with equal phase
+ * probabilities.
+ *
+ * The <em>rate vector</em> parameter is given by the
+ * <em>brace-init-list</em> (ISO,2014,sec. 8.5.4 [dcl.init.list])
+ * defined by \a l1, and the <em>phase probability vector</em> parameter is
+ * set to the equal phase probabilities (i.e., to a vector of the same
+ * length \f$k\f$ of the <em>rate vector</em> and with each element set
+ * to \f$1.0/k\f$).
+ *
+ * \param l1 The initializer list for inizializing the rate vector.
+ *
+ * References:
+ * -# ISO, <em>ISO/IEC 14882-2014: Information technology - Programming languages - C++</em>, 2014
+ * .
+ */
+ public: hyperexponential_distribution(std::initializer_list<RealT> const& l1)
+ : dd_(std::vector<RealT>(std::distance(l1.begin(), l1.end()), 1)),
+ rates_(l1.begin(), l1.end())
+ {
+ assert( hyperexp_detail::check_params(dd_.probabilities(), rates_) );
+ }
+#endif
+
+ /**
+ * Gets a random variate distributed according to the
+ * hyperexponential distribution.
+ *
+ * \tparam URNG Must meet the requirements of \uniform_random_number_generator.
+ *
+ * \param urng A uniform random number generator object.
+ *
+ * \return A random variate distributed according to the hyperexponential distribution.
+ */
+ public: template<class URNG>\
+ RealT operator()(URNG& urng) const
+ {
+ const int i = dd_(urng);
+
+ return boost::random::exponential_distribution<RealT>(rates_[i])(urng);
+ }
+
+ /**
+ * Gets a random variate distributed according to the hyperexponential
+ * distribution with parameters specified by \c param.
+ *
+ * \tparam URNG Must meet the requirements of \uniform_random_number_generator.
+ *
+ * \param urng A uniform random number generator object.
+ * \param param A distribution parameter object.
+ *
+ * \return A random variate distributed according to the hyperexponential distribution.
+ * distribution with parameters specified by \c param.
+ */
+ public: template<class URNG>
+ RealT operator()(URNG& urng, const param_type& param) const
+ {
+ return hyperexponential_distribution(param)(urng);
+ }
+
+ /** Returns the number of phases of the distribution. */
+ public: std::size_t num_phases() const
+ {
+ return rates_.size();
+ }
+
+ /** Returns the <em>phase probability vector</em> parameter of the distribution. */
+ public: std::vector<RealT> probabilities() const
+ {
+ return dd_.probabilities();
+ }
+
+ /** Returns the <em>rate vector</em> parameter of the distribution. */
+ public: std::vector<RealT> rates() const
+ {
+ return rates_;
+ }
+
+ /** Returns the smallest value that the distribution can produce. */
+ public: RealT min BOOST_PREVENT_MACRO_SUBSTITUTION () const
+ {
+ return 0;
+ }
+
+ /** Returns the largest value that the distribution can produce. */
+ public: RealT max BOOST_PREVENT_MACRO_SUBSTITUTION () const
+ {
+ return std::numeric_limits<RealT>::infinity();
+ }
+
+ /** Returns the parameters of the distribution. */
+ public: param_type param() const
+ {
+ std::vector<RealT> probs = dd_.probabilities();
+
+ return param_type(probs.begin(), probs.end(), rates_.begin(), rates_.end());
+ }
+
+ /** Sets the parameters of the distribution. */
+ public: void param(param_type const& param)
+ {
+ dd_.param(typename boost::random::discrete_distribution<int,RealT>::param_type(param.probabilities()));
+ rates_ = param.rates();
+ }
+
+ /**
+ * Effects: Subsequent uses of the distribution do not depend
+ * on values produced by any engine prior to invoking reset.
+ */
+ public: void reset()
+ {
+ // empty
+ }
+
+ /** Writes an @c hyperexponential_distribution to a @c std::ostream. */
+ public: BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, hyperexponential_distribution, hd)
+ {
+ os << hd.param();
+ return os;
+ }
+
+ /** Reads an @c hyperexponential_distribution from a @c std::istream. */
+ public: BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, hyperexponential_distribution, hd)
+ {
+ param_type param;
+ if(is >> param)
+ {
+ hd.param(param);
+ }
+ return is;
+ }
+
+ /**
+ * Returns true if the two instances of @c hyperexponential_distribution will
+ * return identical sequences of values given equal generators.
+ */
+ public: BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(hyperexponential_distribution, lhs, rhs)
+ {
+ return lhs.dd_ == rhs.dd_
+ && lhs.rates_ == rhs.rates_;
+ }
+
+ /**
+ * Returns true if the two instances of @c hyperexponential_distribution will
+ * return different sequences of values given equal generators.
+ */
+ public: BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(hyperexponential_distribution)
+
+
+ private: boost::random::discrete_distribution<int,RealT> dd_; ///< The \c discrete_distribution used to sample the phase probability and choose the rate
+ private: std::vector<RealT> rates_; ///< The <em>rate vector</em> parameter of the distribution
+}; // hyperexponential_distribution
+
+}} // namespace boost::random
+
+
+#endif // BOOST_RANDOM_HYPEREXPONENTIAL_DISTRIBUTION_HPP
diff --git a/boost/random/independent_bits.hpp b/boost/random/independent_bits.hpp
index 5ff52b80ff..dec63b3f46 100644
--- a/boost/random/independent_bits.hpp
+++ b/boost/random/independent_bits.hpp
@@ -21,7 +21,7 @@
#include <boost/config.hpp>
#include <boost/cstdint.hpp>
#include <boost/integer/integer_mask.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/random/traits.hpp>
#include <boost/random/detail/config.hpp>
#include <boost/random/detail/integer_log2.hpp>
#include <boost/random/detail/operators.hpp>
@@ -46,6 +46,7 @@ class independent_bits_engine
public:
typedef Engine base_type;
typedef UIntType result_type;
+ typedef typename Engine::result_type base_result_type;
// Required by old Boost.Random concept
BOOST_STATIC_CONSTANT(bool, has_fixed_range = false);
@@ -55,7 +56,7 @@ public:
{ return 0; }
/** Returns the largest value that the generator can produce. */
static result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
- { return boost::low_bits_mask_t<w>::sig_bits; }
+ { return max_imp(boost::is_integral<UIntType>()); }
/**
* Constructs an @c independent_bits_engine using the
@@ -68,7 +69,7 @@ public:
* the constructor argument for both base generators.
*/
BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(independent_bits_engine,
- result_type, seed_arg)
+ base_result_type, seed_arg)
{
_base.seed(seed_arg);
}
@@ -108,7 +109,7 @@ public:
* seed for the base generator.
*/
BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(independent_bits_engine,
- result_type, seed_arg)
+ base_result_type, seed_arg)
{ _base.seed(seed_arg); }
/**
@@ -139,7 +140,7 @@ public:
// every time, both msvc and gcc can propagate
// constants, resolving this at compile time.
base_unsigned range =
- detail::subtract<base_result>()((_base.max)(), (_base.min)());
+ detail::subtract<base_result_type>()((_base.max)(), (_base.min)());
std::size_t m =
(range == (std::numeric_limits<base_unsigned>::max)()) ?
std::numeric_limits<base_unsigned>::digits :
@@ -161,14 +162,14 @@ public:
for(std::size_t k = 0; k < n0; ++k) {
base_unsigned u;
do {
- u = detail::subtract<base_result>()(_base(), (_base.min)());
+ u = detail::subtract<base_result_type>()(_base(), (_base.min)());
} while(u > base_unsigned(y0 - 1));
S = (S << w0) + (u & y0_mask);
}
for(std::size_t k = 0; k < (n - n0); ++k) {
base_unsigned u;
do {
- u = detail::subtract<base_result>()(_base(), (_base.min)());
+ u = detail::subtract<base_result_type>()(_base(), (_base.min)());
} while(u > base_unsigned(y1 - 1));
S = (S << (w0 + 1)) + (u & y1_mask);
}
@@ -226,8 +227,18 @@ public:
private:
/// \cond show_private
- typedef typename base_type::result_type base_result;
- typedef typename make_unsigned<base_result>::type base_unsigned;
+ typedef typename boost::random::traits::make_unsigned<base_result_type>::type base_unsigned;
+
+ static UIntType max_imp(const boost::true_type&)
+ {
+ return boost::low_bits_mask_t<w>::sig_bits;
+ }
+ static UIntType max_imp(const boost::false_type&)
+ {
+ // We have a multiprecision integer type:
+ BOOST_STATIC_ASSERT(std::numeric_limits<UIntType>::is_specialized);
+ return w < std::numeric_limits<UIntType>::digits ? UIntType((UIntType(1) << w) - 1) : UIntType((((UIntType(1) << (w - 1)) - 1) << 1) | 1u);
+ }
void calc_params(
std::size_t n, base_unsigned range,
diff --git a/boost/random/piecewise_constant_distribution.hpp b/boost/random/piecewise_constant_distribution.hpp
index 697a374087..488f41c0e3 100644
--- a/boost/random/piecewise_constant_distribution.hpp
+++ b/boost/random/piecewise_constant_distribution.hpp
@@ -409,7 +409,7 @@ public:
void param(const param_type& parm)
{
std::vector<RealType> new_intervals(parm._intervals);
- typedef discrete_distribution<std::size_t, RealType> bins_type;
+ typedef discrete_distribution<std::size_t, WeightType> bins_type;
typename bins_type::param_type bins_param(parm._weights);
_bins.param(bins_param);
_intervals.swap(new_intervals);
diff --git a/boost/random/piecewise_linear_distribution.hpp b/boost/random/piecewise_linear_distribution.hpp
index 861cf429c5..541c57fb82 100644
--- a/boost/random/piecewise_linear_distribution.hpp
+++ b/boost/random/piecewise_linear_distribution.hpp
@@ -487,6 +487,7 @@ private:
void init(const std::vector<RealType>& intervals_arg,
const std::vector<RealType>& weights_arg)
{
+ using std::abs;
std::vector<RealType> bin_weights;
bin_weights.reserve((intervals_arg.size() - 1) * 2);
for(std::size_t i = 0; i < intervals_arg.size() - 1; ++i) {
@@ -494,7 +495,7 @@ private:
RealType w1 = weights_arg[i];
RealType w2 = weights_arg[i + 1];
bin_weights.push_back((std::min)(w1, w2) * width);
- bin_weights.push_back(std::abs(w1 - w2) * width / 2);
+ bin_weights.push_back(abs(w1 - w2) * width / 2);
}
typedef discrete_distribution<std::size_t, RealType> bins_type;
typename bins_type::param_type bins_param(bin_weights);
diff --git a/boost/random/seed_seq.hpp b/boost/random/seed_seq.hpp
index 9579d5bb9b..d76aef4f5e 100644
--- a/boost/random/seed_seq.hpp
+++ b/boost/random/seed_seq.hpp
@@ -79,25 +79,25 @@ public:
std::size_t m = (std::max)(s+1, n);
value_type mask = 0xffffffffu;
for(std::size_t k = 0; k < m; ++k) {
- value_type r1 =
- *(first + k%n) ^ *(first + (k+p)%n) ^ *(first + (k+n-1)%n);
+ value_type r1 = static_cast<value_type>
+ (*(first + k%n) ^ *(first + (k+p)%n) ^ *(first + (k+n-1)%n));
r1 = r1 ^ (r1 >> 27);
r1 = (r1 * 1664525u) & mask;
- value_type r2 = r1 +
+ value_type r2 = static_cast<value_type>(r1 +
((k == 0) ? s :
(k <= s) ? k % n + v[k - 1] :
- (k % n));
+ (k % n)));
*(first + (k+p)%n) = (*(first + (k+p)%n) + r1) & mask;
*(first + (k+q)%n) = (*(first + (k+q)%n) + r2) & mask;
*(first + k%n) = r2;
}
for(std::size_t k = m; k < m + n; ++k) {
- value_type r3 =
- (*(first + k%n) + *(first + (k+p)%n) + *(first + (k+n-1)%n))
- & mask;
+ value_type r3 = static_cast<value_type>
+ ((*(first + k%n) + *(first + (k+p)%n) + *(first + (k+n-1)%n))
+ & mask);
r3 = r3 ^ (r3 >> 27);
r3 = (r3 * 1566083941u) & mask;
- value_type r4 = r3 - k%m;
+ value_type r4 = static_cast<value_type>(r3 - k%m);
*(first + (k+p)%n) ^= r3;
*(first + (k+q)%n) ^= r4;
*(first + k%n) = r4;
diff --git a/boost/random/shuffle_order.hpp b/boost/random/shuffle_order.hpp
index 646c09bafa..54645303e8 100644
--- a/boost/random/shuffle_order.hpp
+++ b/boost/random/shuffle_order.hpp
@@ -130,7 +130,7 @@ public:
result_type operator()() {
// calculating the range every time may seem wasteful. However, this
// makes the information locally available for the optimizer.
- typedef typename make_unsigned<result_type>::type base_unsigned;
+ typedef typename boost::random::traits::make_unsigned<result_type>::type base_unsigned;
const base_unsigned brange =
detail::subtract<result_type>()((max)(), (min)());
const base_unsigned off =
diff --git a/boost/random/subtract_with_carry.hpp b/boost/random/subtract_with_carry.hpp
index dc430e6d55..acaf69ac69 100644
--- a/boost/random/subtract_with_carry.hpp
+++ b/boost/random/subtract_with_carry.hpp
@@ -402,7 +402,7 @@ public:
SeedSeq, seq)
{
detail::seed_array_real<w>(seq, x);
- carry = (x[long_lag-1] ? 0 : 1 / _modulus);
+ carry = (x[long_lag-1] ? result_type(0) : result_type(1 / _modulus));
k = 0;
}
@@ -416,7 +416,7 @@ public:
void seed(It& first, It last)
{
detail::fill_array_real<w>(first, last, x);
- carry = (x[long_lag-1] ? 0 : 1 / _modulus);
+ carry = (x[long_lag-1] ? result_type(0) : result_type(1 / _modulus));
k = 0;
}
diff --git a/boost/random/traits.hpp b/boost/random/traits.hpp
new file mode 100644
index 0000000000..975421a4d0
--- /dev/null
+++ b/boost/random/traits.hpp
@@ -0,0 +1,107 @@
+/* boost random/traits.hpp header file
+ *
+ * Copyright John Maddock 2015
+ * Distributed under the Boost Software License, Version 1.0. (See
+ * accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * These traits classes serve two purposes: they are designed to mostly
+ * work out of the box for multiprecision types (ie number types that are
+ * C++ class types and not integers or floats from type-traits point of view),
+ * they are also a potential point of specialization for user-defined
+ * number types.
+ *
+ * $Id$
+ */
+
+#ifndef BOOST_RANDOM_TRAITS_HPP
+#define BOOST_RANDOM_TRAITS_HPP
+
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+#include <boost/mpl/bool.hpp>
+#include <limits>
+
+namespace boost {
+namespace random {
+namespace traits {
+ // \cond show_private
+ template <class T, bool intrinsic>
+ struct make_unsigned_imp
+ {
+ typedef typename boost::make_unsigned<T>::type type;
+ };
+ template <class T>
+ struct make_unsigned_imp<T, false>
+ {
+ BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_specialized);
+ BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_signed == false);
+ BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_integer == true);
+ typedef T type;
+ };
+ // \endcond
+ /** \brief Converts the argument type T to an unsigned type.
+ *
+ * This trait has a single member `type` which is the unsigned type corresponding to T.
+ * Note that
+ * if T is signed, then member `type` *should define a type with one more bit precision than T*. For built-in
+ * types this trait defaults to `boost::make_unsigned<T>::type`. For user defined types it simply asserts that
+ * the argument type T is an unsigned integer (using std::numeric_limits).
+ * User defined specializations may be provided for other cases.
+ */
+ template <class T>
+ struct make_unsigned
+ // \cond show_private
+ : public make_unsigned_imp < T, boost::is_integral<T>::value >
+ // \endcond
+ {};
+ // \cond show_private
+ template <class T, bool intrinsic>
+ struct make_unsigned_or_unbounded_imp
+ {
+ typedef typename boost::make_unsigned<T>::type type;
+ };
+ template <class T>
+ struct make_unsigned_or_unbounded_imp<T, false>
+ {
+ BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_specialized);
+ BOOST_STATIC_ASSERT((std::numeric_limits<T>::is_signed == false) || (std::numeric_limits<T>::is_bounded == false));
+ BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_integer == true);
+ typedef T type;
+ };
+ // \endcond
+ /** \brief Converts the argument type T to either an unsigned type or an unbounded integer type.
+ *
+ * This trait has a single member `type` which is either the unsigned type corresponding to T or an unbounded
+ * integer type. This trait is used to generate types suitable for the calculation of a range: as a result
+ * if T is signed, then member `type` *should define a type with one more bit precision than T*. For built-in
+ * types this trait defaults to `boost::make_unsigned<T>::type`. For user defined types it simply asserts that
+ * the argument type T is either an unbounded integer, or an unsigned one (using std::numeric_limits).
+ * User defined specializations may be provided for other cases.
+ */
+ template <class T>
+ struct make_unsigned_or_unbounded
+ // \cond show_private
+ : public make_unsigned_or_unbounded_imp < T, boost::is_integral<T>::value >
+ // \endcond
+ {};
+ /** \brief Traits class that indicates whether type T is an integer
+ */
+ template <class T>
+ struct is_integral
+ : public mpl::bool_<boost::is_integral<T>::value || (std::numeric_limits<T>::is_integer)>
+ {};
+ /** \brief Traits class that indicates whether type T is a signed integer
+ */
+ template <class T> struct is_signed
+ : public mpl::bool_ < boost::is_signed<T>::value || (std::numeric_limits<T>::is_specialized && std::numeric_limits<T>::is_integer && std::numeric_limits<T>::is_signed)>
+ {};
+
+}
+}
+}
+
+#endif
diff --git a/boost/random/triangle_distribution.hpp b/boost/random/triangle_distribution.hpp
index 5ac6604713..6d37e2bb92 100644
--- a/boost/random/triangle_distribution.hpp
+++ b/boost/random/triangle_distribution.hpp
@@ -161,7 +161,7 @@ public:
result_type operator()(Engine& eng)
{
using std::sqrt;
- result_type u = uniform_01<>()(eng);
+ result_type u = uniform_01<result_type>()(eng);
if( u <= q1 )
return _a + p1*sqrt(u);
else
diff --git a/boost/random/uniform_01.hpp b/boost/random/uniform_01.hpp
index 9710b766ea..37258f5806 100644
--- a/boost/random/uniform_01.hpp
+++ b/boost/random/uniform_01.hpp
@@ -93,9 +93,9 @@ public:
for (;;) {
typedef typename Engine::result_type base_result;
result_type factor = result_type(1) /
- (result_type((eng.max)()-(eng.min)()) +
+ (result_type(base_result((eng.max)()-(eng.min)())) +
result_type(std::numeric_limits<base_result>::is_integer ? 1 : 0));
- result_type result = result_type(eng() - (eng.min)()) * factor;
+ result_type result = result_type(base_result(eng() - (eng.min)())) * factor;
if (result < result_type(1))
return result;
}
@@ -185,7 +185,7 @@ template<class UniformRandomNumberGenerator, class RealType>
const bool backward_compatible_uniform_01<UniformRandomNumberGenerator, RealType>::has_fixed_range;
#endif
-template<class UniformRandomNumberGenerator>
+template<class UniformRandomNumberGenerator, bool is_number = std::numeric_limits<UniformRandomNumberGenerator>::is_specialized>
struct select_uniform_01
{
template<class RealType>
@@ -195,33 +195,13 @@ struct select_uniform_01
};
};
-template<>
-struct select_uniform_01<float>
+template<class Num>
+struct select_uniform_01<Num, true>
{
template<class RealType>
struct apply
{
- typedef new_uniform_01<float> type;
- };
-};
-
-template<>
-struct select_uniform_01<double>
-{
- template<class RealType>
- struct apply
- {
- typedef new_uniform_01<double> type;
- };
-};
-
-template<>
-struct select_uniform_01<long double>
-{
- template<class RealType>
- struct apply
- {
- typedef new_uniform_01<long double> type;
+ typedef new_uniform_01<Num> type;
};
};
diff --git a/boost/random/uniform_int_distribution.hpp b/boost/random/uniform_int_distribution.hpp
index e7ef4b8248..e0d3a9bebc 100644
--- a/boost/random/uniform_int_distribution.hpp
+++ b/boost/random/uniform_int_distribution.hpp
@@ -28,9 +28,11 @@
#include <boost/random/detail/operators.hpp>
#include <boost/random/detail/uniform_int_float.hpp>
#include <boost/random/detail/signed_unsigned_tools.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
-#include <boost/type_traits/is_integral.hpp>
+#include <boost/random/traits.hpp>
#include <boost/mpl/bool.hpp>
+#ifdef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#include <boost/mpl/if.hpp>
+#endif
namespace boost {
namespace random {
@@ -50,10 +52,10 @@ T generate_uniform_int(
boost::mpl::true_ /** is_integral<Engine::result_type> */)
{
typedef T result_type;
- typedef typename make_unsigned<T>::type range_type;
+ typedef typename boost::random::traits::make_unsigned_or_unbounded<T>::type range_type;
typedef typename Engine::result_type base_result;
- // ranges are always unsigned
- typedef typename make_unsigned<base_result>::type base_unsigned;
+ // ranges are always unsigned or unbounded
+ typedef typename boost::random::traits::make_unsigned_or_unbounded<base_result>::type base_unsigned;
const range_type range = random::detail::subtract<result_type>()(max_value, min_value);
const base_result bmin = (eng.min)();
const base_unsigned brange =
@@ -112,7 +114,7 @@ T generate_uniform_int(
// mult+mult*brange by (2), (3) (4)
// Therefore result+(eng()-bmin)*mult <
// mult*(brange+1) by (4)
- result += static_cast<range_type>(random::detail::subtract<base_result>()(eng(), bmin) * mult);
+ result += static_cast<range_type>(static_cast<range_type>(random::detail::subtract<base_result>()(eng(), bmin)) * mult);
// equivalent to (mult * (brange+1)) == range+1, but avoids overflow.
if(mult * range_type(brange) == range - mult + 1) {
@@ -166,7 +168,7 @@ T generate_uniform_int(
static_cast<range_type>(0),
static_cast<range_type>(range/mult),
boost::mpl::true_());
- if((std::numeric_limits<range_type>::max)() / mult < result_increment) {
+ if(std::numeric_limits<range_type>::is_bounded && ((std::numeric_limits<range_type>::max)() / mult < result_increment)) {
// The multiplcation would overflow. Reject immediately.
continue;
}
@@ -184,27 +186,43 @@ T generate_uniform_int(
return random::detail::add<range_type, result_type>()(result, min_value);
}
} else { // brange > range
- base_unsigned bucket_size;
+#ifdef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+ typedef typename mpl::if_c<
+ std::numeric_limits<range_type>::is_specialized && std::numeric_limits<base_unsigned>::is_specialized
+ && (std::numeric_limits<range_type>::digits >= std::numeric_limits<base_unsigned>::digits),
+ range_type, base_unsigned>::type mixed_range_type;
+#else
+ typedef base_unsigned mixed_range_type;
+#endif
+
+ mixed_range_type bucket_size;
// it's safe to add 1 to range, as long as we cast it first,
// because we know that it is less than brange. However,
// we do need to be careful not to cause overflow by adding 1
- // to brange.
+ // to brange. We use mixed_range_type throughout for mixed
+ // arithmetic between base_unsigned and range_type - in the case
+ // that range_type has more bits than base_unsigned it is always
+ // safe to use range_type for this albeit it may be more effient
+ // to use base_unsigned. The latter is a narrowing conversion though
+ // which may be disallowed if range_type is a multiprecision type
+ // and there are no explicit converison operators.
+
if(brange == (std::numeric_limits<base_unsigned>::max)()) {
- bucket_size = brange / (static_cast<base_unsigned>(range)+1);
- if(brange % (static_cast<base_unsigned>(range)+1) == static_cast<base_unsigned>(range)) {
+ bucket_size = static_cast<mixed_range_type>(brange) / (static_cast<mixed_range_type>(range)+1);
+ if(static_cast<mixed_range_type>(brange) % (static_cast<mixed_range_type>(range)+1) == static_cast<mixed_range_type>(range)) {
++bucket_size;
}
} else {
- bucket_size = (brange+1) / (static_cast<base_unsigned>(range)+1);
+ bucket_size = static_cast<mixed_range_type>(brange + 1) / (static_cast<mixed_range_type>(range)+1);
}
for(;;) {
- base_unsigned result =
+ mixed_range_type result =
random::detail::subtract<base_result>()(eng(), bmin);
result /= bucket_size;
// result and range are non-negative, and result is possibly larger
// than range, so the cast is safe
- if(result <= static_cast<base_unsigned>(range))
- return random::detail::add<base_unsigned, result_type>()(result, min_value);
+ if(result <= static_cast<mixed_range_type>(range))
+ return random::detail::add<mixed_range_type, result_type>()(result, min_value);
}
}
}
@@ -227,7 +245,7 @@ inline T generate_uniform_int(Engine& eng, T min_value, T max_value)
{
typedef typename Engine::result_type base_result;
return generate_uniform_int(eng, min_value, max_value,
- boost::is_integral<base_result>());
+ boost::random::traits::is_integral<base_result>());
}
}
diff --git a/boost/random/uniform_real_distribution.hpp b/boost/random/uniform_real_distribution.hpp
index c53d85835b..820fce9314 100644
--- a/boost/random/uniform_real_distribution.hpp
+++ b/boost/random/uniform_real_distribution.hpp
@@ -67,7 +67,7 @@ template<class Engine, class T>
inline T generate_uniform_real(Engine& eng, T min_value, T max_value)
{
if(max_value / 2 - min_value / 2 > (std::numeric_limits<T>::max)() / 2)
- return 2 * generate_uniform_real(eng, min_value / 2, max_value / 2);
+ return 2 * generate_uniform_real(eng, T(min_value / 2), T(max_value / 2));
typedef typename Engine::result_type base_result;
return generate_uniform_real(eng, min_value, max_value,
boost::is_integral<base_result>());
diff --git a/boost/random/uniform_smallint.hpp b/boost/random/uniform_smallint.hpp
index 96f2fdc2c1..c1afd7fbcd 100644
--- a/boost/random/uniform_smallint.hpp
+++ b/boost/random/uniform_smallint.hpp
@@ -30,6 +30,10 @@
#include <boost/detail/workaround.hpp>
#include <boost/mpl/bool.hpp>
+#ifdef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+#include <boost/mpl/if.hpp>
+#endif
+
namespace boost {
namespace random {
@@ -194,7 +198,7 @@ public:
result_type operator()(Engine& eng) const
{
typedef typename Engine::result_type base_result;
- return generate(eng, boost::is_integral<base_result>());
+ return generate(eng, boost::random::traits::is_integral<base_result>());
}
/** Returns a value uniformly distributed in the range [param.a(), param.b()]. */
@@ -238,20 +242,34 @@ private:
// equivalent to (eng() - eng.min()) % (_max - _min + 1) + _min,
// but guarantees no overflow.
typedef typename Engine::result_type base_result;
- typedef typename boost::make_unsigned<base_result>::type base_unsigned;
- typedef typename boost::make_unsigned<result_type>::type range_type;
+ typedef typename boost::random::traits::make_unsigned<base_result>::type base_unsigned;
+ typedef typename boost::random::traits::make_unsigned_or_unbounded<result_type>::type range_type;
+#ifdef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
+ typedef typename mpl::if_c<
+ std::numeric_limits<range_type>::is_specialized && std::numeric_limits<base_unsigned>::is_specialized
+ && (std::numeric_limits<range_type>::digits >= std::numeric_limits<base_unsigned>::digits),
+ range_type, base_unsigned>::type mixed_range_type;
+#else
+ typedef base_unsigned mixed_range_type;
+#endif
range_type range = random::detail::subtract<result_type>()(_max, _min);
base_unsigned base_range =
- random::detail::subtract<result_type>()((eng.max)(), (eng.min)());
+ random::detail::subtract<base_result>()((eng.max)(), (eng.min)());
base_unsigned val =
random::detail::subtract<base_result>()(eng(), (eng.min)());
if(range >= base_range) {
return boost::random::detail::add<range_type, result_type>()(
static_cast<range_type>(val), _min);
} else {
- base_unsigned modulus = static_cast<base_unsigned>(range) + 1;
+ // This involves mixed arithmetic between the base generators range
+ // type, and the result_type's range type. mixed_range_type is
+ // normally the same as base_unsigned which is the most efficient
+ // option, but requires a narrowing explcit cast if result_type
+ // is a multiprecision type. If no such casts are available then use
+ // multiprecision arithmetic throughout instead.
+ mixed_range_type modulus = static_cast<mixed_range_type>(range)+1;
return boost::random::detail::add<range_type, result_type>()(
- static_cast<range_type>(val % modulus), _min);
+ static_cast<mixed_range_type>(val) % modulus, _min);
}
}
@@ -259,7 +277,7 @@ private:
result_type generate(Engine& eng, boost::mpl::false_) const
{
typedef typename Engine::result_type base_result;
- typedef typename boost::make_unsigned<result_type>::type range_type;
+ typedef typename boost::random::traits::make_unsigned<result_type>::type range_type;
range_type range = random::detail::subtract<result_type>()(_max, _min);
base_result val = boost::uniform_01<base_result>()(eng);
// what is the worst that can possibly happen here?
diff --git a/boost/rational.hpp b/boost/rational.hpp
index 5977822b6d..72d11e7d06 100644
--- a/boost/rational.hpp
+++ b/boost/rational.hpp
@@ -82,6 +82,7 @@
#include <boost/integer/common_factor_rt.hpp> // for boost::integer::gcd, lcm
#include <limits> // for std::numeric_limits
#include <boost/static_assert.hpp> // for BOOST_STATIC_ASSERT
+#include <boost/throw_exception.hpp>
// Control whether depreciated GCD and LCM functions are included (default: yes)
#ifndef BOOST_CONTROL_RATIONAL_HAS_GCD
@@ -155,11 +156,10 @@ public:
#ifndef BOOST_NO_MEMBER_TEMPLATES
template < typename NewType >
BOOST_CONSTEXPR explicit
- rational( rational<NewType> const &r )
- : num( r.numerator() ), den( is_normalized(int_type( r.numerator() ),
- int_type( r.denominator() )) ? r.denominator() :
- throw bad_rational("bad rational: denormalized conversion") )
- {}
+ rational(rational<NewType> const &r)
+ : num(r.numerator()), den(is_normalized(int_type(r.numerator()),
+ int_type(r.denominator())) ? r.denominator() :
+ (BOOST_THROW_EXCEPTION(bad_rational("bad rational: denormalized conversion")), 0)){}
#endif
// Default copy constructor and assignment are fine
@@ -172,9 +172,9 @@ public:
// Access to representation
BOOST_CONSTEXPR
- IntType numerator() const { return num; }
+ const IntType& numerator() const { return num; }
BOOST_CONSTEXPR
- IntType denominator() const { return den; }
+ const IntType& denominator() const { return den; }
// Arithmetic assignment operators
rational& operator+= (const rational& r);
@@ -356,7 +356,7 @@ rational<IntType>& rational<IntType>::operator/= (const rational<IntType>& r)
// Trap division by zero
if (r_num == zero)
- throw bad_rational();
+ BOOST_THROW_EXCEPTION(bad_rational());
if (num == zero)
return *this;
@@ -393,7 +393,7 @@ rational<IntType>::operator/= (param_type i)
// Avoid repeated construction
IntType const zero(0);
- if (i == zero) throw bad_rational();
+ if(i == zero) BOOST_THROW_EXCEPTION(bad_rational());
if (num == zero) return *this;
// Avoid overflow and preserve normalization
@@ -548,7 +548,7 @@ void rational<IntType>::normalize()
IntType zero(0);
if (den == zero)
- throw bad_rational();
+ BOOST_THROW_EXCEPTION(bad_rational());
// Handle the case of zero separately, to avoid division by zero
if (num == zero) {
@@ -572,7 +572,7 @@ void rational<IntType>::normalize()
// member function is only called during the constructor, so we never have
// to worry about zombie objects.)
if (den < zero)
- throw bad_rational( "bad rational: non-zero singular denominator" );
+ BOOST_THROW_EXCEPTION(bad_rational("bad rational: non-zero singular denominator"));
BOOST_ASSERT( this->test_invariant() );
}
@@ -671,6 +671,38 @@ inline rational<IntType> abs(const rational<IntType>& r)
return r.numerator() >= IntType(0)? r: -r;
}
+namespace integer {
+
+template <typename IntType>
+struct gcd_evaluator< rational<IntType> >
+{
+ typedef rational<IntType> result_type,
+ first_argument_type, second_argument_type;
+ result_type operator() ( first_argument_type const &a
+ , second_argument_type const &b
+ ) const
+ {
+ return result_type(integer::gcd(a.numerator(), b.numerator()),
+ integer::lcm(a.denominator(), b.denominator()));
+ }
+};
+
+template <typename IntType>
+struct lcm_evaluator< rational<IntType> >
+{
+ typedef rational<IntType> result_type,
+ first_argument_type, second_argument_type;
+ result_type operator() ( first_argument_type const &a
+ , second_argument_type const &b
+ ) const
+ {
+ return result_type(integer::lcm(a.numerator(), b.numerator()),
+ integer::gcd(a.denominator(), b.denominator()));
+ }
+};
+
+} // namespace integer
+
} // namespace boost
#endif // BOOST_RATIONAL_HPP
diff --git a/boost/regex/config.hpp b/boost/regex/config.hpp
index 7e6cc51969..4fd1fd94a8 100644
--- a/boost/regex/config.hpp
+++ b/boost/regex/config.hpp
@@ -25,6 +25,7 @@
#if defined(__BORLANDC__)
# include <boost/regex/config/borland.hpp>
#endif
+#include <boost/version.hpp>
/*****************************************************************************
*
@@ -41,6 +42,7 @@
# include BOOST_REGEX_USER_CONFIG
# include <boost/config.hpp>
+# include <boost/predef.h>
#else
/*
@@ -69,6 +71,13 @@
#define UNICODE
#endif
+
+/*
+* Define a macro for the namespace that details are placed in, this includes the Boost
+* version number to avoid mismatched header and library versions:
+*/
+#define BOOST_REGEX_DETAIL_NS BOOST_JOIN(re_detail_, BOOST_VERSION)
+
/*
* Fix for gcc prior to 3.4: std::ctype<wchar_t> doesn't allow
* masks to be combined, for example:
@@ -92,7 +101,13 @@
#if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS)
# define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
#endif
-/*
+ /*
+ * Oracle compiler in C++11 mode doesn't like external templates for some reason:
+ */
+#ifdef __SUNPRO_CC
+# define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+#endif
+ /*
* Shared regex lib will crash without this, frankly it looks a lot like a gcc bug:
*/
#if defined(__MINGW32__)
@@ -133,8 +148,14 @@
/* disable our own file-iterators and mapfiles if we can't
* support them: */
-#if !defined(BOOST_HAS_DIRENT_H) && !(defined(_WIN32) && !defined(BOOST_REGEX_NO_W32))
-# define BOOST_REGEX_NO_FILEITER
+#if defined(_WIN32)
+# if defined(BOOST_REGEX_NO_W32) || BOOST_PLAT_WINDOWS_STORE
+# define BOOST_REGEX_NO_FILEITER
+# endif
+#else // defined(_WIN32)
+# if !defined(BOOST_HAS_DIRENT_H)
+# define BOOST_REGEX_NO_FILEITER
+# endif
#endif
/* backwards compatibitity: */
@@ -163,10 +184,20 @@
* with MSVC and the /Zc:wchar_t option we place some extra unsigned short versions
* of the non-inline functions in the library, so that users can still link to the lib,
* irrespective of whether their own code is built with /Zc:wchar_t.
- * Note that this does NOT WORK with VC10 when the C++ locale is in effect as
+ * Note that this does NOT WORK with VC10 and VC14 when the C++ locale is in effect as
* the locale's <unsigned short> facets simply do not compile in that case.
+ * As we default to the C++ locale when compiling for the windows runtime we
+ * skip in this case aswell.
*/
-#if defined(__cplusplus) && (defined(BOOST_MSVC) || defined(__ICL)) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) && defined(BOOST_WINDOWS) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) && !defined(BOOST_RWSTD_VER) && ((_MSC_VER < 1600) || !defined(BOOST_REGEX_USE_CPP_LOCALE))
+#if defined(__cplusplus) && \
+ (defined(BOOST_MSVC) || defined(__ICL)) && \
+ !defined(BOOST_NO_INTRINSIC_WCHAR_T) && \
+ defined(BOOST_WINDOWS) && \
+ !defined(__SGI_STL_PORT) && \
+ !defined(_STLPORT_VERSION) && \
+ !defined(BOOST_RWSTD_VER) && \
+ ((_MSC_VER < 1600) || !defined(BOOST_REGEX_USE_CPP_LOCALE)) && \
+ !BOOST_PLAT_WINDOWS_RUNTIME
# define BOOST_REGEX_HAS_OTHER_WCHAR_T
# ifdef BOOST_MSVC
# pragma warning(push)
@@ -264,8 +295,19 @@
# define BOOST_REGEX_USE_C_LOCALE
#endif
+/* use C++ locale when targeting windows store */
+#if BOOST_PLAT_WINDOWS_RUNTIME
+# define BOOST_REGEX_USE_CPP_LOCALE
+# define BOOST_REGEX_NO_WIN32_LOCALE
+#endif
+
/* Win32 defaults to native Win32 locale: */
-#if defined(_WIN32) && !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE) && !defined(BOOST_REGEX_NO_W32)
+#if defined(_WIN32) && \
+ !defined(BOOST_REGEX_USE_WIN32_LOCALE) && \
+ !defined(BOOST_REGEX_USE_C_LOCALE) && \
+ !defined(BOOST_REGEX_USE_CPP_LOCALE) && \
+ !defined(BOOST_REGEX_NO_W32) && \
+ !defined(BOOST_REGEX_NO_WIN32_LOCALE)
# define BOOST_REGEX_USE_WIN32_LOCALE
#endif
/* otherwise use C++ locale if supported: */
@@ -334,7 +376,7 @@ if(0 == (x))\
#if defined(__cplusplus) && defined(BOOST_REGEX_HAS_MS_STACK_GUARD)
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
BOOST_REGEX_DECL void BOOST_REGEX_CALL reset_stack_guard_page();
@@ -387,7 +429,7 @@ BOOST_REGEX_DECL void BOOST_REGEX_CALL reset_stack_guard_page();
****************************************************************************/
#if defined(__cplusplus) && defined(BOOST_REGEX_NON_RECURSIVE)
-namespace boost{ namespace re_detail{
+namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
BOOST_REGEX_DECL void* BOOST_REGEX_CALL get_mem_block();
BOOST_REGEX_DECL void BOOST_REGEX_CALL put_mem_block(void*);
diff --git a/boost/regex/icu.hpp b/boost/regex/icu.hpp
index 572172e542..a70aa0da81 100644
--- a/boost/regex/icu.hpp
+++ b/boost/regex/icu.hpp
@@ -34,7 +34,7 @@
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
//
// Implementation details:
@@ -108,18 +108,18 @@ public:
struct boost_extensions_tag{};
icu_regex_traits()
- : m_pimpl(re_detail::get_icu_regex_traits_implementation(U_NAMESPACE_QUALIFIER Locale()))
+ : m_pimpl(BOOST_REGEX_DETAIL_NS::get_icu_regex_traits_implementation(U_NAMESPACE_QUALIFIER Locale()))
{
}
static size_type length(const char_type* p);
::boost::regex_constants::syntax_type syntax_type(char_type c)const
{
- return ((c < 0x7f) && (c > 0)) ? re_detail::get_default_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
+ return ((c < 0x7f) && (c > 0)) ? BOOST_REGEX_DETAIL_NS::get_default_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
}
::boost::regex_constants::escape_syntax_type escape_syntax_type(char_type c) const
{
- return ((c < 0x7f) && (c > 0)) ? re_detail::get_default_escape_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
+ return ((c < 0x7f) && (c > 0)) ? BOOST_REGEX_DETAIL_NS::get_default_escape_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
}
char_type translate(char_type c) const
{
@@ -154,7 +154,7 @@ public:
bool isctype(char_type c, char_class_type f) const;
int toi(const char_type*& p1, const char_type* p2, int radix)const
{
- return re_detail::global_toi(p1, p2, radix, *this);
+ return BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
}
int value(char_type c, int radix)const
{
@@ -163,7 +163,7 @@ public:
locale_type imbue(locale_type l)
{
locale_type result(m_pimpl->getloc());
- m_pimpl = re_detail::get_icu_regex_traits_implementation(l);
+ m_pimpl = BOOST_REGEX_DETAIL_NS::get_icu_regex_traits_implementation(l);
return result;
}
locale_type getloc()const
@@ -172,7 +172,7 @@ public:
}
std::string error_string(::boost::regex_constants::error_type n) const
{
- return re_detail::get_default_error_string(n);
+ return BOOST_REGEX_DETAIL_NS::get_default_error_string(n);
}
private:
icu_regex_traits(const icu_regex_traits&);
@@ -208,7 +208,7 @@ private:
static char_class_type lookup_icu_mask(const ::UChar32* p1, const ::UChar32* p2);
- boost::shared_ptr< ::boost::re_detail::icu_regex_traits_implementation> m_pimpl;
+ boost::shared_ptr< ::boost::BOOST_REGEX_DETAIL_NS::icu_regex_traits_implementation> m_pimpl;
};
} // namespace boost
@@ -241,7 +241,7 @@ typedef match_results<const ::UChar*> u16match;
//
// Construction of 32-bit regex types from UTF-8 and UTF-16 primitives:
//
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
#if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__)
template <class InputIterator>
@@ -341,18 +341,18 @@ inline u32regex make_u32regex(InputIterator i,
InputIterator j,
boost::regex_constants::syntax_option_type opt)
{
- return re_detail::do_make_u32regex(i, j, opt, static_cast<boost::mpl::int_<sizeof(*i)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(i, j, opt, static_cast<boost::mpl::int_<sizeof(*i)> const*>(0));
}
//
// construction from UTF-8 nul-terminated strings:
//
inline u32regex make_u32regex(const char* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
{
- return re_detail::do_make_u32regex(p, p + std::strlen(p), opt, static_cast<boost::mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + std::strlen(p), opt, static_cast<boost::mpl::int_<1> const*>(0));
}
inline u32regex make_u32regex(const unsigned char* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
{
- return re_detail::do_make_u32regex(p, p + std::strlen(reinterpret_cast<const char*>(p)), opt, static_cast<boost::mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + std::strlen(reinterpret_cast<const char*>(p)), opt, static_cast<boost::mpl::int_<1> const*>(0));
}
//
// construction from UTF-16 nul-terminated strings:
@@ -360,13 +360,13 @@ inline u32regex make_u32regex(const unsigned char* p, boost::regex_constants::sy
#ifndef BOOST_NO_WREGEX
inline u32regex make_u32regex(const wchar_t* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
{
- return re_detail::do_make_u32regex(p, p + std::wcslen(p), opt, static_cast<boost::mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + std::wcslen(p), opt, static_cast<boost::mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
inline u32regex make_u32regex(const UChar* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
{
- return re_detail::do_make_u32regex(p, p + u_strlen(p), opt, static_cast<boost::mpl::int_<2> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(p, p + u_strlen(p), opt, static_cast<boost::mpl::int_<2> const*>(0));
}
#endif
//
@@ -375,20 +375,20 @@ inline u32regex make_u32regex(const UChar* p, boost::regex_constants::syntax_opt
template<class C, class T, class A>
inline u32regex make_u32regex(const std::basic_string<C, T, A>& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
{
- return re_detail::do_make_u32regex(s.begin(), s.end(), opt, static_cast<boost::mpl::int_<sizeof(C)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(s.begin(), s.end(), opt, static_cast<boost::mpl::int_<sizeof(C)> const*>(0));
}
//
// Construction from ICU string type:
//
inline u32regex make_u32regex(const U_NAMESPACE_QUALIFIER UnicodeString& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
{
- return re_detail::do_make_u32regex(s.getBuffer(), s.getBuffer() + s.length(), opt, static_cast<boost::mpl::int_<2> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_make_u32regex(s.getBuffer(), s.getBuffer() + s.length(), opt, static_cast<boost::mpl::int_<2> const*>(0));
}
//
// regex_match overloads that widen the character type as appropriate:
//
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template<class MR1, class MR2>
void copy_results(MR1& out, MR2 const& in)
{
@@ -446,7 +446,7 @@ bool do_regex_match(BidiIterator first, BidiIterator last,
if(result) copy_results(m, what);
return result;
}
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
template <class BidiIterator, class Allocator>
inline bool u32regex_match(BidiIterator first, BidiIterator last,
@@ -454,14 +454,14 @@ inline bool u32regex_match(BidiIterator first, BidiIterator last,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
}
inline bool u32regex_match(const UChar* p,
match_results<const UChar*>& m,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
}
#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
inline bool u32regex_match(const wchar_t* p,
@@ -469,7 +469,7 @@ inline bool u32regex_match(const wchar_t* p,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_match(const char* p,
@@ -477,21 +477,21 @@ inline bool u32regex_match(const char* p,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_match(const unsigned char* p,
match_results<const unsigned char*>& m,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_match(const std::string& s,
match_results<std::string::const_iterator>& m,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
}
#ifndef BOOST_NO_STD_WSTRING
inline bool u32regex_match(const std::wstring& s,
@@ -499,7 +499,7 @@ inline bool u32regex_match(const std::wstring& s,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s,
@@ -507,7 +507,7 @@ inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
//
// regex_match overloads that do not return what matched:
@@ -518,14 +518,14 @@ inline bool u32regex_match(BidiIterator first, BidiIterator last,
match_flag_type flags = match_default)
{
match_results<BidiIterator> m;
- return re_detail::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
}
inline bool u32regex_match(const UChar* p,
const u32regex& e,
match_flag_type flags = match_default)
{
match_results<const UChar*> m;
- return re_detail::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
}
#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
inline bool u32regex_match(const wchar_t* p,
@@ -533,7 +533,7 @@ inline bool u32regex_match(const wchar_t* p,
match_flag_type flags = match_default)
{
match_results<const wchar_t*> m;
- return re_detail::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_match(const char* p,
@@ -541,21 +541,21 @@ inline bool u32regex_match(const char* p,
match_flag_type flags = match_default)
{
match_results<const char*> m;
- return re_detail::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_match(const unsigned char* p,
const u32regex& e,
match_flag_type flags = match_default)
{
match_results<const unsigned char*> m;
- return re_detail::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_match(const std::string& s,
const u32regex& e,
match_flag_type flags = match_default)
{
match_results<std::string::const_iterator> m;
- return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
}
#ifndef BOOST_NO_STD_WSTRING
inline bool u32regex_match(const std::wstring& s,
@@ -563,7 +563,7 @@ inline bool u32regex_match(const std::wstring& s,
match_flag_type flags = match_default)
{
match_results<std::wstring::const_iterator> m;
- return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s,
@@ -571,13 +571,13 @@ inline bool u32regex_match(const U_NAMESPACE_QUALIFIER UnicodeString& s,
match_flag_type flags = match_default)
{
match_results<const UChar*> m;
- return re_detail::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
//
// regex_search overloads that widen the character type as appropriate:
//
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class BidiIterator, class Allocator>
inline bool do_regex_search(BidiIterator first, BidiIterator last,
match_results<BidiIterator, Allocator>& m,
@@ -630,7 +630,7 @@ inline bool u32regex_search(BidiIterator first, BidiIterator last,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
}
template <class BidiIterator, class Allocator>
inline bool u32regex_search(BidiIterator first, BidiIterator last,
@@ -639,14 +639,14 @@ inline bool u32regex_search(BidiIterator first, BidiIterator last,
match_flag_type flags,
BidiIterator base)
{
- return re_detail::do_regex_search(first, last, m, e, flags, base, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(first, last, m, e, flags, base, static_cast<mpl::int_<sizeof(*first)> const*>(0));
}
inline bool u32regex_search(const UChar* p,
match_results<const UChar*>& m,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
}
#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
inline bool u32regex_search(const wchar_t* p,
@@ -654,7 +654,7 @@ inline bool u32regex_search(const wchar_t* p,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_search(const char* p,
@@ -662,21 +662,21 @@ inline bool u32regex_search(const char* p,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_search(const unsigned char* p,
match_results<const unsigned char*>& m,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_search(const std::string& s,
match_results<std::string::const_iterator>& m,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
}
#ifndef BOOST_NO_STD_WSTRING
inline bool u32regex_search(const std::wstring& s,
@@ -684,7 +684,7 @@ inline bool u32regex_search(const std::wstring& s,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s,
@@ -692,7 +692,7 @@ inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s,
const u32regex& e,
match_flag_type flags = match_default)
{
- return re_detail::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
template <class BidiIterator>
inline bool u32regex_search(BidiIterator first, BidiIterator last,
@@ -700,14 +700,14 @@ inline bool u32regex_search(BidiIterator first, BidiIterator last,
match_flag_type flags = match_default)
{
match_results<BidiIterator> m;
- return re_detail::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
}
inline bool u32regex_search(const UChar* p,
const u32regex& e,
match_flag_type flags = match_default)
{
match_results<const UChar*> m;
- return re_detail::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
}
#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
inline bool u32regex_search(const wchar_t* p,
@@ -715,7 +715,7 @@ inline bool u32regex_search(const wchar_t* p,
match_flag_type flags = match_default)
{
match_results<const wchar_t*> m;
- return re_detail::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_search(const char* p,
@@ -723,21 +723,21 @@ inline bool u32regex_search(const char* p,
match_flag_type flags = match_default)
{
match_results<const char*> m;
- return re_detail::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_search(const unsigned char* p,
const u32regex& e,
match_flag_type flags = match_default)
{
match_results<const unsigned char*> m;
- return re_detail::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
}
inline bool u32regex_search(const std::string& s,
const u32regex& e,
match_flag_type flags = match_default)
{
match_results<std::string::const_iterator> m;
- return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
}
#ifndef BOOST_NO_STD_WSTRING
inline bool u32regex_search(const std::wstring& s,
@@ -745,7 +745,7 @@ inline bool u32regex_search(const std::wstring& s,
match_flag_type flags = match_default)
{
match_results<std::wstring::const_iterator> m;
- return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
#endif
inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s,
@@ -753,13 +753,13 @@ inline bool u32regex_search(const U_NAMESPACE_QUALIFIER UnicodeString& s,
match_flag_type flags = match_default)
{
match_results<const UChar*> m;
- return re_detail::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+ return BOOST_REGEX_DETAIL_NS::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
}
//
// overloads for regex_replace with utf-8 and utf-16 data types:
//
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class I>
inline std::pair< boost::u8_to_u32_iterator<I>, boost::u8_to_u32_iterator<I> >
make_utf32_seq(I i, I j, mpl::int_<1> const*)
@@ -838,7 +838,7 @@ OutputIterator do_regex_replace(OutputIterator out,
if(i == j)
{
if(!(flags & regex_constants::format_no_copy))
- out = re_detail::copy(in.first, in.second, out);
+ out = BOOST_REGEX_DETAIL_NS::copy(in.first, in.second, out);
}
else
{
@@ -846,18 +846,18 @@ OutputIterator do_regex_replace(OutputIterator out,
while(i != j)
{
if(!(flags & regex_constants::format_no_copy))
- out = re_detail::copy(i->prefix().first, i->prefix().second, out);
+ out = BOOST_REGEX_DETAIL_NS::copy(i->prefix().first, i->prefix().second, out);
if(f.size())
- out = ::boost::re_detail::regex_format_imp(out, *i, &*f.begin(), &*f.begin() + f.size(), flags, e.get_traits());
+ out = ::boost::BOOST_REGEX_DETAIL_NS::regex_format_imp(out, *i, &*f.begin(), &*f.begin() + f.size(), flags, e.get_traits());
else
- out = ::boost::re_detail::regex_format_imp(out, *i, static_cast<UChar32 const*>(0), static_cast<UChar32 const*>(0), flags, e.get_traits());
+ out = ::boost::BOOST_REGEX_DETAIL_NS::regex_format_imp(out, *i, static_cast<UChar32 const*>(0), static_cast<UChar32 const*>(0), flags, e.get_traits());
last_m = (*i)[0].second;
if(flags & regex_constants::format_first_only)
break;
++i;
}
if(!(flags & regex_constants::format_no_copy))
- out = re_detail::copy(last_m, in.second, out);
+ out = BOOST_REGEX_DETAIL_NS::copy(last_m, in.second, out);
}
return out;
}
@@ -876,7 +876,7 @@ inline BaseIterator extract_output_base(const utf16_output_iterator<BaseIterator
{
return b.base();
}
-} // re_detail
+} // BOOST_REGEX_DETAIL_NS
template <class OutputIterator, class BidirectionalIterator, class charT>
inline OutputIterator u32regex_replace(OutputIterator out,
@@ -886,13 +886,13 @@ inline OutputIterator u32regex_replace(OutputIterator out,
const charT* fmt,
match_flag_type flags = match_default)
{
- return re_detail::extract_output_base
+ return BOOST_REGEX_DETAIL_NS::extract_output_base
(
- re_detail::do_regex_replace(
- re_detail::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- re_detail::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::do_regex_replace(
+ BOOST_REGEX_DETAIL_NS::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
e,
- re_detail::make_utf32_seq(fmt, static_cast<mpl::int_<sizeof(*fmt)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt, static_cast<mpl::int_<sizeof(*fmt)> const*>(0)),
flags)
);
}
@@ -905,13 +905,13 @@ inline OutputIterator u32regex_replace(OutputIterator out,
const std::basic_string<charT>& fmt,
match_flag_type flags = match_default)
{
- return re_detail::extract_output_base
+ return BOOST_REGEX_DETAIL_NS::extract_output_base
(
- re_detail::do_regex_replace(
- re_detail::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- re_detail::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::do_regex_replace(
+ BOOST_REGEX_DETAIL_NS::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
e,
- re_detail::make_utf32_seq(fmt.begin(), fmt.end(), static_cast<mpl::int_<sizeof(charT)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt.begin(), fmt.end(), static_cast<mpl::int_<sizeof(charT)> const*>(0)),
flags)
);
}
@@ -924,13 +924,13 @@ inline OutputIterator u32regex_replace(OutputIterator out,
const U_NAMESPACE_QUALIFIER UnicodeString& fmt,
match_flag_type flags = match_default)
{
- return re_detail::extract_output_base
+ return BOOST_REGEX_DETAIL_NS::extract_output_base
(
- re_detail::do_regex_replace(
- re_detail::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
- re_detail::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::do_regex_replace(
+ BOOST_REGEX_DETAIL_NS::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
e,
- re_detail::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
flags)
);
}
@@ -942,7 +942,7 @@ std::basic_string<charT> u32regex_replace(const std::basic_string<charT>& s,
match_flag_type flags = match_default)
{
std::basic_string<charT> result;
- re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+ BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<charT> > i(result);
u32regex_replace(i, s.begin(), s.end(), e, fmt, flags);
return result;
}
@@ -954,12 +954,12 @@ std::basic_string<charT> u32regex_replace(const std::basic_string<charT>& s,
match_flag_type flags = match_default)
{
std::basic_string<charT> result;
- re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+ BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<charT> > i(result);
u32regex_replace(i, s.begin(), s.end(), e, fmt.c_str(), flags);
return result;
}
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
class unicode_string_out_iterator
{
@@ -989,7 +989,7 @@ inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QU
match_flag_type flags = match_default)
{
U_NAMESPACE_QUALIFIER UnicodeString result;
- re_detail::unicode_string_out_iterator i(result);
+ BOOST_REGEX_DETAIL_NS::unicode_string_out_iterator i(result);
u32regex_replace(i, s.getBuffer(), s.getBuffer()+s.length(), e, fmt, flags);
return result;
}
@@ -1000,12 +1000,12 @@ inline U_NAMESPACE_QUALIFIER UnicodeString u32regex_replace(const U_NAMESPACE_QU
match_flag_type flags = match_default)
{
U_NAMESPACE_QUALIFIER UnicodeString result;
- re_detail::unicode_string_out_iterator i(result);
- re_detail::do_regex_replace(
- re_detail::make_utf32_out(i, static_cast<mpl::int_<2> const*>(0)),
- re_detail::make_utf32_seq(s.getBuffer(), s.getBuffer()+s.length(), static_cast<mpl::int_<2> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::unicode_string_out_iterator i(result);
+ BOOST_REGEX_DETAIL_NS::do_regex_replace(
+ BOOST_REGEX_DETAIL_NS::make_utf32_out(i, static_cast<mpl::int_<2> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(s.getBuffer(), s.getBuffer()+s.length(), static_cast<mpl::int_<2> const*>(0)),
e,
- re_detail::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
+ BOOST_REGEX_DETAIL_NS::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
flags);
return result;
}
diff --git a/boost/regex/mfc.hpp b/boost/regex/mfc.hpp
index 8ecaf1f5ba..d780673931 100644
--- a/boost/regex/mfc.hpp
+++ b/boost/regex/mfc.hpp
@@ -144,7 +144,7 @@ OutputIterator regex_replace(OutputIterator out,
return ::boost::regex_replace(out, first, last, e, fmt.GetString(), flags);
}
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class B, bool b>
class mfc_string_out_iterator
@@ -176,7 +176,7 @@ ATL::CSimpleStringT<B, b> regex_replace(const ATL::CSimpleStringT<B, b>& s,
match_flag_type flags = match_default)
{
ATL::CSimpleStringT<B, b> result(s.GetManager());
- re_detail::mfc_string_out_iterator<B, b> i(result);
+ BOOST_REGEX_DETAIL_NS::mfc_string_out_iterator<B, b> i(result);
regex_replace(i, s.GetString(), s.GetString() + s.GetLength(), e, fmt.GetString(), flags);
return result;
}
diff --git a/boost/regex/pattern_except.hpp b/boost/regex/pattern_except.hpp
index 57ea14c256..004b67f3f2 100644
--- a/boost/regex/pattern_except.hpp
+++ b/boost/regex/pattern_except.hpp
@@ -63,7 +63,7 @@ private:
typedef regex_error bad_pattern;
typedef regex_error bad_expression;
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
BOOST_REGEX_DECL void BOOST_REGEX_CALL raise_runtime_error(const std::runtime_error& ex);
@@ -72,7 +72,7 @@ void raise_error(const traits& t, regex_constants::error_type code)
{
(void)t; // warning suppression
std::runtime_error e(t.error_string(code));
- ::boost::re_detail::raise_runtime_error(e);
+ ::boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(e);
}
}
diff --git a/boost/regex/v4/basic_regex.hpp b/boost/regex/v4/basic_regex.hpp
index ae86152286..ac91af2914 100644
--- a/boost/regex/v4/basic_regex.hpp
+++ b/boost/regex/v4/basic_regex.hpp
@@ -42,7 +42,7 @@ namespace boost{
#endif
#endif
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
//
// forward declaration, we will need this one later:
@@ -164,9 +164,9 @@ struct regex_data : public named_subexpressions
regex_data(const ::boost::shared_ptr<
::boost::regex_traits_wrapper<traits> >& t)
- : m_ptraits(t), m_expression(0), m_expression_len(0) {}
+ : m_ptraits(t), m_expression(0), m_expression_len(0), m_disable_match_any(false) {}
regex_data()
- : m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_expression(0), m_expression_len(0) {}
+ : m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_expression(0), m_expression_len(0), m_disable_match_any(false) {}
::boost::shared_ptr<
::boost::regex_traits_wrapper<traits>
@@ -176,16 +176,17 @@ struct regex_data : public named_subexpressions
const charT* m_expression; // the original expression
std::ptrdiff_t m_expression_len; // the length of the original expression
size_type m_mark_count; // the number of marked sub-expressions
- re_detail::re_syntax_base* m_first_state; // the first state of the machine
+ BOOST_REGEX_DETAIL_NS::re_syntax_base* m_first_state; // the first state of the machine
unsigned m_restart_type; // search optimisation type
unsigned char m_startmap[1 << CHAR_BIT]; // which characters can start a match
unsigned int m_can_be_null; // whether we can match a null string
- re_detail::raw_storage m_data; // the buffer in which our states are constructed
+ BOOST_REGEX_DETAIL_NS::raw_storage m_data; // the buffer in which our states are constructed
typename traits::char_class_type m_word_mask; // mask used to determine if a character is a word character
std::vector<
std::pair<
std::size_t, std::size_t> > m_subs; // Position of sub-expressions within the *string*.
bool m_has_recursions; // whether we have recursive expressions;
+ bool m_disable_match_any; // when set we need to disable the match_any flag as it causes different/buggy behaviour.
};
//
// class basic_regex_implementation
@@ -266,7 +267,7 @@ public:
{
return this->m_mark_count - 1;
}
- const re_detail::re_syntax_base* get_first_state()const
+ const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
{
return this->m_first_state;
}
@@ -293,7 +294,7 @@ public:
}
};
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
//
// class basic_regex:
// represents the compiled
@@ -597,7 +598,7 @@ public:
//
// private access methods:
//
- const re_detail::re_syntax_base* get_first_state()const
+ const BOOST_REGEX_DETAIL_NS::re_syntax_base* get_first_state()const
{
BOOST_ASSERT(0 != m_pimpl.get());
return m_pimpl->get_first_state();
@@ -622,18 +623,18 @@ public:
BOOST_ASSERT(0 != m_pimpl.get());
return m_pimpl->can_be_null();
}
- const re_detail::regex_data<charT, traits>& get_data()const
+ const BOOST_REGEX_DETAIL_NS::regex_data<charT, traits>& get_data()const
{
BOOST_ASSERT(0 != m_pimpl.get());
return m_pimpl->get_data();
}
- boost::shared_ptr<re_detail::named_subexpressions > get_named_subs()const
+ boost::shared_ptr<BOOST_REGEX_DETAIL_NS::named_subexpressions > get_named_subs()const
{
return m_pimpl;
}
private:
- shared_ptr<re_detail::basic_regex_implementation<charT, traits> > m_pimpl;
+ shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > m_pimpl;
};
//
@@ -647,14 +648,14 @@ basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign(const charT* p
const charT* p2,
flag_type f)
{
- shared_ptr<re_detail::basic_regex_implementation<charT, traits> > temp;
+ shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > temp;
if(!m_pimpl.get())
{
- temp = shared_ptr<re_detail::basic_regex_implementation<charT, traits> >(new re_detail::basic_regex_implementation<charT, traits>());
+ temp = shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> >(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>());
}
else
{
- temp = shared_ptr<re_detail::basic_regex_implementation<charT, traits> >(new re_detail::basic_regex_implementation<charT, traits>(m_pimpl->m_ptraits));
+ temp = shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> >(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>(m_pimpl->m_ptraits));
}
temp->assign(p1, p2, f);
temp.swap(m_pimpl);
@@ -664,7 +665,7 @@ basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign(const charT* p
template <class charT, class traits>
typename basic_regex<charT, traits>::locale_type BOOST_REGEX_CALL basic_regex<charT, traits>::imbue(locale_type l)
{
- shared_ptr<re_detail::basic_regex_implementation<charT, traits> > temp(new re_detail::basic_regex_implementation<charT, traits>());
+ shared_ptr<BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits> > temp(new BOOST_REGEX_DETAIL_NS::basic_regex_implementation<charT, traits>());
locale_type result = temp->imbue(l);
temp.swap(m_pimpl);
return result;
diff --git a/boost/regex/v4/basic_regex_creator.hpp b/boost/regex/v4/basic_regex_creator.hpp
index 821fb8298c..51704a849f 100644
--- a/boost/regex/v4/basic_regex_creator.hpp
+++ b/boost/regex/v4/basic_regex_creator.hpp
@@ -38,7 +38,7 @@
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class charT>
struct digraph : public std::pair<charT, charT>
@@ -371,9 +371,9 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
//
// fill in the basics:
//
- result->csingles = static_cast<unsigned int>(::boost::re_detail::distance(char_set.singles_begin(), char_set.singles_end()));
- result->cranges = static_cast<unsigned int>(::boost::re_detail::distance(char_set.ranges_begin(), char_set.ranges_end())) / 2;
- result->cequivalents = static_cast<unsigned int>(::boost::re_detail::distance(char_set.equivalents_begin(), char_set.equivalents_end()));
+ result->csingles = static_cast<unsigned int>(::boost::BOOST_REGEX_DETAIL_NS::distance(char_set.singles_begin(), char_set.singles_end()));
+ result->cranges = static_cast<unsigned int>(::boost::BOOST_REGEX_DETAIL_NS::distance(char_set.ranges_begin(), char_set.ranges_end())) / 2;
+ result->cequivalents = static_cast<unsigned int>(::boost::BOOST_REGEX_DETAIL_NS::distance(char_set.equivalents_begin(), char_set.equivalents_end()));
result->cclasses = char_set.classes();
result->cnclasses = char_set.negated_classes();
if(flags() & regbase::icase)
@@ -463,10 +463,10 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
return 0;
}
charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s1.size() + s2.size() + 2) ) );
- re_detail::copy(s1.begin(), s1.end(), p);
+ BOOST_REGEX_DETAIL_NS::copy(s1.begin(), s1.end(), p);
p[s1.size()] = charT(0);
p += s1.size() + 1;
- re_detail::copy(s2.begin(), s2.end(), p);
+ BOOST_REGEX_DETAIL_NS::copy(s2.begin(), s2.end(), p);
p[s2.size()] = charT(0);
}
//
@@ -487,7 +487,7 @@ re_syntax_base* basic_regex_creator<charT, traits>::append_set(
if(s.empty())
return 0; // invalid or unsupported equivalence class
charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s.size()+1) ) );
- re_detail::copy(s.begin(), s.end(), p);
+ BOOST_REGEX_DETAIL_NS::copy(s.begin(), s.end(), p);
p[s.size()] = charT(0);
++first;
}
@@ -664,7 +664,7 @@ void basic_regex_creator<charT, traits>::finalize(const charT* p1, const charT*
m_pdata->m_expression_len = len;
charT* ps = static_cast<charT*>(m_pdata->m_data.extend(sizeof(charT) * (1 + (p2 - p1))));
m_pdata->m_expression = ps;
- re_detail::copy(p1, p2, ps);
+ BOOST_REGEX_DETAIL_NS::copy(p1, p2, ps);
ps[p2 - p1] = 0;
// fill in our other data...
// successful parsing implies a zero status:
@@ -1149,6 +1149,7 @@ void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state,
set_all_masks(l_map, mask);
return;
}
+ case syntax_element_accept:
case syntax_element_match:
{
// must be null, any character can match:
@@ -1335,6 +1336,11 @@ void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state,
state = state->next.p;
break;
+ case syntax_element_commit:
+ set_all_masks(l_map, mask);
+ // Continue scanning so we can figure out whether we can be null:
+ state = state->next.p;
+ break;
case syntax_element_startmark:
// need to handle independent subs as a special case:
if(static_cast<re_brace*>(state)->index == -3)
@@ -1456,15 +1462,15 @@ syntax_element_type basic_regex_creator<charT, traits>::get_repeat_type(re_synta
{
switch(state->next.p->type)
{
- case re_detail::syntax_element_wild:
- return re_detail::syntax_element_dot_rep;
- case re_detail::syntax_element_literal:
- return re_detail::syntax_element_char_rep;
- case re_detail::syntax_element_set:
- return re_detail::syntax_element_short_set_rep;
- case re_detail::syntax_element_long_set:
- if(static_cast<re_detail::re_set_long<m_type>*>(state->next.p)->singleton)
- return re_detail::syntax_element_long_set_rep;
+ case BOOST_REGEX_DETAIL_NS::syntax_element_wild:
+ return BOOST_REGEX_DETAIL_NS::syntax_element_dot_rep;
+ case BOOST_REGEX_DETAIL_NS::syntax_element_literal:
+ return BOOST_REGEX_DETAIL_NS::syntax_element_char_rep;
+ case BOOST_REGEX_DETAIL_NS::syntax_element_set:
+ return BOOST_REGEX_DETAIL_NS::syntax_element_short_set_rep;
+ case BOOST_REGEX_DETAIL_NS::syntax_element_long_set:
+ if(static_cast<BOOST_REGEX_DETAIL_NS::re_set_long<m_type>*>(state->next.p)->singleton)
+ return BOOST_REGEX_DETAIL_NS::syntax_element_long_set_rep;
break;
default:
break;
@@ -1529,7 +1535,7 @@ void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* st
}
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
diff --git a/boost/regex/v4/basic_regex_parser.hpp b/boost/regex/v4/basic_regex_parser.hpp
index 3c331a57c4..4a80ab9c32 100644
--- a/boost/regex/v4/basic_regex_parser.hpp
+++ b/boost/regex/v4/basic_regex_parser.hpp
@@ -31,7 +31,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
#ifdef BOOST_MSVC
#pragma warning(push)
@@ -68,6 +68,8 @@ public:
bool parse_inner_set(basic_char_set<charT, traits>& char_set);
bool parse_QE();
bool parse_perl_extension();
+ bool parse_perl_verb();
+ bool match_verb(const char*);
bool add_emacs_code(bool negate);
bool unwind_alts(std::ptrdiff_t last_paren_start);
digraph<charT> get_next_set_literal(basic_char_set<charT, traits>& char_set);
@@ -165,7 +167,7 @@ void basic_regex_parser<charT, traits>::parse(const charT* p1, const charT* p2,
// have had an unexpected ')' :
if(!result)
{
- fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_position), "Found a closing ) with no corresponding openening parenthesis.");
+ fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_position), "Found a closing ) with no corresponding openening parenthesis.");
return;
}
// if an error has been set then give up now:
@@ -421,6 +423,8 @@ bool basic_regex_parser<charT, traits>::parse_open_paren()
{
if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question)
return parse_perl_extension();
+ if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_star)
+ return parse_perl_verb();
}
//
// update our mark count, and append the required state:
@@ -489,7 +493,7 @@ bool basic_regex_parser<charT, traits>::parse_open_paren()
//
if(m_position == m_end)
{
- this->fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_end));
+ this->fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_end));
return false;
}
BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
@@ -924,9 +928,9 @@ bool basic_regex_parser<charT, traits>::parse_match_any()
static_cast<re_dot*>(
this->append_state(syntax_element_wild, sizeof(re_dot))
)->mask = static_cast<unsigned char>(this->flags() & regbase::no_mod_s
- ? re_detail::force_not_newline
+ ? BOOST_REGEX_DETAIL_NS::force_not_newline
: this->flags() & regbase::mod_s ?
- re_detail::force_newline : re_detail::dont_care);
+ BOOST_REGEX_DETAIL_NS::force_newline : BOOST_REGEX_DETAIL_NS::dont_care);
return true;
}
@@ -963,7 +967,7 @@ bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_
}
if(0 == this->m_last_state)
{
- fail(regex_constants::error_badrepeat, ::boost::re_detail::distance(m_base, m_position), "Nothing to repeat.");
+ fail(regex_constants::error_badrepeat, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_position), "Nothing to repeat.");
return false;
}
if(this->m_last_state->type == syntax_element_endmark)
@@ -1235,7 +1239,7 @@ bool basic_regex_parser<charT, traits>::parse_alt()
//
// we need to append a trailing jump:
//
- re_syntax_base* pj = this->append_state(re_detail::syntax_element_jump, sizeof(re_jump));
+ re_syntax_base* pj = this->append_state(BOOST_REGEX_DETAIL_NS::syntax_element_jump, sizeof(re_jump));
std::ptrdiff_t jump_offset = this->getoffset(pj);
//
// now insert the alternative:
@@ -1784,7 +1788,7 @@ charT basic_regex_parser<charT, traits>::unescape_character()
{
// an octal escape sequence, the first character must be a zero
// followed by up to 3 octal digits:
- std::ptrdiff_t len = (std::min)(::boost::re_detail::distance(m_position, m_end), static_cast<std::ptrdiff_t>(4));
+ std::ptrdiff_t len = (std::min)(::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end), static_cast<std::ptrdiff_t>(4));
const charT* bp = m_position;
int val = this->m_traits.toi(bp, bp + 1, 8);
if(val != 0)
@@ -2521,7 +2525,7 @@ option_group_jump:
// Rewind to start of (? sequence:
--m_position;
while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
- this->fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_end));
+ this->fail(regex_constants::error_paren, ::boost::BOOST_REGEX_DETAIL_NS::distance(m_base, m_end));
return false;
}
BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
@@ -2653,6 +2657,194 @@ option_group_jump:
}
template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::match_verb(const char* verb)
+{
+ while(*verb)
+ {
+ if(static_cast<charT>(*verb) != *m_position)
+ {
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if(++m_position == m_end)
+ {
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++verb;
+ }
+ return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_perl_verb()
+{
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ switch(*m_position)
+ {
+ case 'F':
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if((this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark) || match_verb("AIL"))
+ {
+ if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++m_position;
+ this->append_state(syntax_element_fail);
+ return true;
+ }
+ break;
+ case 'A':
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if(match_verb("CCEPT"))
+ {
+ if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++m_position;
+ this->append_state(syntax_element_accept);
+ return true;
+ }
+ break;
+ case 'C':
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if(match_verb("OMMIT"))
+ {
+ if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++m_position;
+ static_cast<re_commit*>(this->append_state(syntax_element_commit, sizeof(re_commit)))->action = commit_commit;
+ this->m_pdata->m_disable_match_any = true;
+ return true;
+ }
+ break;
+ case 'P':
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if(match_verb("RUNE"))
+ {
+ if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++m_position;
+ static_cast<re_commit*>(this->append_state(syntax_element_commit, sizeof(re_commit)))->action = commit_prune;
+ this->m_pdata->m_disable_match_any = true;
+ return true;
+ }
+ break;
+ case 'S':
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if(match_verb("KIP"))
+ {
+ if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++m_position;
+ static_cast<re_commit*>(this->append_state(syntax_element_commit, sizeof(re_commit)))->action = commit_skip;
+ this->m_pdata->m_disable_match_any = true;
+ return true;
+ }
+ break;
+ case 'T':
+ if(++m_position == m_end)
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ if(match_verb("HEN"))
+ {
+ if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
+ {
+ // Rewind to start of (* sequence:
+ --m_position;
+ while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
+ fail(regex_constants::error_perl_extension, m_position - m_base);
+ return false;
+ }
+ ++m_position;
+ this->append_state(syntax_element_then);
+ this->m_pdata->m_disable_match_any = true;
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
+template <class charT, class traits>
bool basic_regex_parser<charT, traits>::add_emacs_code(bool negate)
{
//
@@ -2862,7 +3054,7 @@ bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_st
#pragma warning(pop)
#endif
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/cpp_regex_traits.hpp b/boost/regex/v4/cpp_regex_traits.hpp
index 106ffcbfc2..709663a385 100644
--- a/boost/regex/v4/cpp_regex_traits.hpp
+++ b/boost/regex/v4/cpp_regex_traits.hpp
@@ -69,7 +69,7 @@ namespace boost{
template <class charT>
class cpp_regex_traits;
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
//
// class parser_buf:
@@ -290,7 +290,7 @@ void cpp_regex_traits_char_layer<charT>::init()
{
std::string m("Unable to open message catalog: ");
std::runtime_error err(m + cat_name);
- boost::re_detail::raise_runtime_error(err);
+ boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
}
}
//
@@ -415,8 +415,9 @@ template <class charT>
class cpp_regex_traits_implementation : public cpp_regex_traits_char_layer<charT>
{
public:
- typedef typename cpp_regex_traits<charT>::char_class_type char_class_type;
- typedef typename std::ctype<charT>::mask native_mask_type;
+ typedef typename cpp_regex_traits<charT>::char_class_type char_class_type;
+ typedef typename std::ctype<charT>::mask native_mask_type;
+ typedef typename boost::make_unsigned<native_mask_type>::type unsigned_native_mask_type;
#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
BOOST_STATIC_CONSTANT(char_class_type, mask_blank = 1u << 24);
BOOST_STATIC_CONSTANT(char_class_type, mask_word = 1u << 25);
@@ -717,7 +718,7 @@ void cpp_regex_traits_implementation<charT>::init()
{
std::string m("Unable to open message catalog: ");
std::runtime_error err(m + cat_name);
- boost::re_detail::raise_runtime_error(err);
+ boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
}
}
//
@@ -753,19 +754,19 @@ void cpp_regex_traits_implementation<charT>::init()
#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
static const char_class_type masks[16] =
{
- std::ctype<charT>::alnum,
- std::ctype<charT>::alpha,
- std::ctype<charT>::cntrl,
- std::ctype<charT>::digit,
- std::ctype<charT>::graph,
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::alnum),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::alpha),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::cntrl),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::digit),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::graph),
cpp_regex_traits_implementation<charT>::mask_horizontal,
- std::ctype<charT>::lower,
- std::ctype<charT>::print,
- std::ctype<charT>::punct,
- std::ctype<charT>::space,
- std::ctype<charT>::upper,
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::lower),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::print),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::punct),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::space),
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::upper),
cpp_regex_traits_implementation<charT>::mask_vertical,
- std::ctype<charT>::xdigit,
+ static_cast<unsigned_native_mask_type>(std::ctype<charT>::xdigit),
cpp_regex_traits_implementation<charT>::mask_blank,
cpp_regex_traits_implementation<charT>::mask_word,
cpp_regex_traits_implementation<charT>::mask_unicode,
@@ -773,22 +774,22 @@ void cpp_regex_traits_implementation<charT>::init()
#else
static const char_class_type masks[16] =
{
- ::boost::re_detail::char_class_alnum,
- ::boost::re_detail::char_class_alpha,
- ::boost::re_detail::char_class_cntrl,
- ::boost::re_detail::char_class_digit,
- ::boost::re_detail::char_class_graph,
- ::boost::re_detail::char_class_horizontal_space,
- ::boost::re_detail::char_class_lower,
- ::boost::re_detail::char_class_print,
- ::boost::re_detail::char_class_punct,
- ::boost::re_detail::char_class_space,
- ::boost::re_detail::char_class_upper,
- ::boost::re_detail::char_class_vertical_space,
- ::boost::re_detail::char_class_xdigit,
- ::boost::re_detail::char_class_blank,
- ::boost::re_detail::char_class_word,
- ::boost::re_detail::char_class_unicode,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_alpha,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_cntrl,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_graph,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_horizontal_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_print,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_punct,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_vertical_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_blank,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_word,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_unicode,
};
#endif
static const string_type null_string;
@@ -803,7 +804,7 @@ void cpp_regex_traits_implementation<charT>::init()
//
// get the collation format used by m_pcollate:
//
- m_collate_type = re_detail::find_sort_syntax(this, &m_collate_delim);
+ m_collate_type = BOOST_REGEX_DETAIL_NS::find_sort_syntax(this, &m_collate_delim);
}
template <class charT>
@@ -814,53 +815,53 @@ typename cpp_regex_traits_implementation<charT>::char_class_type
static const char_class_type masks[22] =
{
0,
- std::ctype<char>::alnum,
- std::ctype<char>::alpha,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::alnum),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::alpha),
cpp_regex_traits_implementation<charT>::mask_blank,
- std::ctype<char>::cntrl,
- std::ctype<char>::digit,
- std::ctype<char>::digit,
- std::ctype<char>::graph,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::cntrl),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::digit),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::digit),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::graph),
cpp_regex_traits_implementation<charT>::mask_horizontal,
- std::ctype<char>::lower,
- std::ctype<char>::lower,
- std::ctype<char>::print,
- std::ctype<char>::punct,
- std::ctype<char>::space,
- std::ctype<char>::space,
- std::ctype<char>::upper,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::lower),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::lower),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::print),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::punct),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::space),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::space),
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::upper),
cpp_regex_traits_implementation<charT>::mask_unicode,
- std::ctype<char>::upper,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::upper),
cpp_regex_traits_implementation<charT>::mask_vertical,
- std::ctype<char>::alnum | cpp_regex_traits_implementation<charT>::mask_word,
- std::ctype<char>::alnum | cpp_regex_traits_implementation<charT>::mask_word,
- std::ctype<char>::xdigit,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::alnum) | cpp_regex_traits_implementation<charT>::mask_word,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::alnum) | cpp_regex_traits_implementation<charT>::mask_word,
+ static_cast<unsigned_native_mask_type>(std::ctype<char>::xdigit),
};
#else
static const char_class_type masks[22] =
{
0,
- ::boost::re_detail::char_class_alnum,
- ::boost::re_detail::char_class_alpha,
- ::boost::re_detail::char_class_blank,
- ::boost::re_detail::char_class_cntrl,
- ::boost::re_detail::char_class_digit,
- ::boost::re_detail::char_class_digit,
- ::boost::re_detail::char_class_graph,
- ::boost::re_detail::char_class_horizontal_space,
- ::boost::re_detail::char_class_lower,
- ::boost::re_detail::char_class_lower,
- ::boost::re_detail::char_class_print,
- ::boost::re_detail::char_class_punct,
- ::boost::re_detail::char_class_space,
- ::boost::re_detail::char_class_space,
- ::boost::re_detail::char_class_upper,
- ::boost::re_detail::char_class_unicode,
- ::boost::re_detail::char_class_upper,
- ::boost::re_detail::char_class_vertical_space,
- ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word,
- ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word,
- ::boost::re_detail::char_class_xdigit,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_alpha,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_blank,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_cntrl,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_graph,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_horizontal_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_print,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_punct,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_unicode,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_vertical_space,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum | ::boost::BOOST_REGEX_DETAIL_NS::char_class_word,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_alnum | ::boost::BOOST_REGEX_DETAIL_NS::char_class_word,
+ ::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit,
};
#endif
if(m_custom_class_names.size())
@@ -870,7 +871,7 @@ typename cpp_regex_traits_implementation<charT>::char_class_type
if(pos != m_custom_class_names.end())
return pos->second;
}
- std::size_t state_id = 1 + re_detail::get_default_class_id(p1, p2);
+ std::size_t state_id = 1 + BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
BOOST_ASSERT(state_id < sizeof(masks) / sizeof(masks[0]));
return masks[state_id];
}
@@ -880,20 +881,20 @@ template <class charT>
bool cpp_regex_traits_implementation<charT>::isctype(const charT c, char_class_type mask) const
{
return
- ((mask & ::boost::re_detail::char_class_space) && (this->m_pctype->is(std::ctype<charT>::space, c)))
- || ((mask & ::boost::re_detail::char_class_print) && (this->m_pctype->is(std::ctype<charT>::print, c)))
- || ((mask & ::boost::re_detail::char_class_cntrl) && (this->m_pctype->is(std::ctype<charT>::cntrl, c)))
- || ((mask & ::boost::re_detail::char_class_upper) && (this->m_pctype->is(std::ctype<charT>::upper, c)))
- || ((mask & ::boost::re_detail::char_class_lower) && (this->m_pctype->is(std::ctype<charT>::lower, c)))
- || ((mask & ::boost::re_detail::char_class_alpha) && (this->m_pctype->is(std::ctype<charT>::alpha, c)))
- || ((mask & ::boost::re_detail::char_class_digit) && (this->m_pctype->is(std::ctype<charT>::digit, c)))
- || ((mask & ::boost::re_detail::char_class_punct) && (this->m_pctype->is(std::ctype<charT>::punct, c)))
- || ((mask & ::boost::re_detail::char_class_xdigit) && (this->m_pctype->is(std::ctype<charT>::xdigit, c)))
- || ((mask & ::boost::re_detail::char_class_blank) && (this->m_pctype->is(std::ctype<charT>::space, c)) && !::boost::re_detail::is_separator(c))
- || ((mask & ::boost::re_detail::char_class_word) && (c == '_'))
- || ((mask & ::boost::re_detail::char_class_unicode) && ::boost::re_detail::is_extended(c))
- || ((mask & ::boost::re_detail::char_class_vertical_space) && (is_separator(c) || (c == '\v')))
- || ((mask & ::boost::re_detail::char_class_horizontal_space) && this->m_pctype->is(std::ctype<charT>::space, c) && !(is_separator(c) || (c == '\v')));
+ ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_space) && (this->m_pctype->is(std::ctype<charT>::space, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_print) && (this->m_pctype->is(std::ctype<charT>::print, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_cntrl) && (this->m_pctype->is(std::ctype<charT>::cntrl, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_upper) && (this->m_pctype->is(std::ctype<charT>::upper, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_lower) && (this->m_pctype->is(std::ctype<charT>::lower, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_alpha) && (this->m_pctype->is(std::ctype<charT>::alpha, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_digit) && (this->m_pctype->is(std::ctype<charT>::digit, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_punct) && (this->m_pctype->is(std::ctype<charT>::punct, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_xdigit) && (this->m_pctype->is(std::ctype<charT>::xdigit, c)))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_blank) && (this->m_pctype->is(std::ctype<charT>::space, c)) && !::boost::BOOST_REGEX_DETAIL_NS::is_separator(c))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_word) && (c == '_'))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_unicode) && ::boost::BOOST_REGEX_DETAIL_NS::is_extended(c))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_vertical_space) && (is_separator(c) || (c == '\v')))
+ || ((mask & ::boost::BOOST_REGEX_DETAIL_NS::char_class_horizontal_space) && this->m_pctype->is(std::ctype<charT>::space, c) && !(is_separator(c) || (c == '\v')));
}
#endif
@@ -905,7 +906,7 @@ inline boost::shared_ptr<const cpp_regex_traits_implementation<charT> > create_c
return ::boost::object_cache<cpp_regex_traits_base<charT>, cpp_regex_traits_implementation<charT> >::get(key, 5);
}
-} // re_detail
+} // BOOST_REGEX_DETAIL_NS
template <class charT>
class cpp_regex_traits
@@ -922,7 +923,7 @@ public:
struct boost_extensions_tag{};
cpp_regex_traits()
- : m_pimpl(re_detail::create_cpp_regex_traits<charT>(std::locale()))
+ : m_pimpl(BOOST_REGEX_DETAIL_NS::create_cpp_regex_traits<charT>(std::locale()))
{ }
static size_type length(const char_type* p)
{
@@ -995,20 +996,32 @@ public:
&& (m_pimpl->m_pctype->is(
static_cast<ctype_mask>(f & mask_base), c)))
return true;
- else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_unicode) && re_detail::is_extended(c))
+ else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_unicode) && BOOST_REGEX_DETAIL_NS::is_extended(c))
return true;
- else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_word) && (c == '_'))
+ else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_word) && (c == '_'))
return true;
- else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_blank)
+ else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_blank)
&& m_pimpl->m_pctype->is(std::ctype<charT>::space, c)
- && !re_detail::is_separator(c))
+ && !BOOST_REGEX_DETAIL_NS::is_separator(c))
return true;
- else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_vertical)
- && (::boost::re_detail::is_separator(c) || (c == '\v')))
+ else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_vertical)
+ && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == '\v')))
return true;
- else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_horizontal)
- && this->isctype(c, std::ctype<charT>::space) && !this->isctype(c, re_detail::cpp_regex_traits_implementation<charT>::mask_vertical))
+ else if((f & BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_horizontal)
+ && this->isctype(c, std::ctype<charT>::space) && !this->isctype(c, BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT>::mask_vertical))
return true;
+#ifdef __CYGWIN__
+ //
+ // Cygwin has a buggy ctype facet, see https://www.cygwin.com/ml/cygwin/2012-08/msg00178.html:
+ //
+ else if((f & std::ctype<charT>::xdigit) == std::ctype<charT>::xdigit)
+ {
+ if((c >= 'a') && (c <= 'f'))
+ return true;
+ if((c >= 'A') && (c <= 'F'))
+ return true;
+ }
+#endif
return false;
#else
return m_pimpl->isctype(c, f);
@@ -1023,7 +1036,7 @@ public:
locale_type imbue(locale_type l)
{
std::locale result(getloc());
- m_pimpl = re_detail::create_cpp_regex_traits<charT>(l);
+ m_pimpl = BOOST_REGEX_DETAIL_NS::create_cpp_regex_traits<charT>(l);
return result;
}
locale_type getloc()const
@@ -1043,7 +1056,7 @@ public:
static std::string get_catalog_name();
private:
- boost::shared_ptr<const re_detail::cpp_regex_traits_implementation<charT> > m_pimpl;
+ boost::shared_ptr<const BOOST_REGEX_DETAIL_NS::cpp_regex_traits_implementation<charT> > m_pimpl;
//
// catalog name handler:
//
@@ -1058,7 +1071,7 @@ private:
template <class charT>
int cpp_regex_traits<charT>::toi(const charT*& first, const charT* last, int radix)const
{
- re_detail::parser_buf<charT> sbuf; // buffer for parsing numbers.
+ BOOST_REGEX_DETAIL_NS::parser_buf<charT> sbuf; // buffer for parsing numbers.
std::basic_istream<charT> is(&sbuf); // stream for parsing numbers.
// we do NOT want to parse any thousands separators inside the stream:
diff --git a/boost/regex/v4/cregex.hpp b/boost/regex/v4/cregex.hpp
index 7b3df1e510..67abfbee19 100644
--- a/boost/regex/v4/cregex.hpp
+++ b/boost/regex/v4/cregex.hpp
@@ -221,7 +221,7 @@ namespace boost{
class RegEx;
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
class RegExData;
struct pred1;
@@ -229,7 +229,7 @@ struct pred2;
struct pred3;
struct pred4;
-} /* namespace re_detail */
+} /* namespace BOOST_REGEX_DETAIL_NS */
#if (defined(BOOST_MSVC) || defined(__BORLANDC__)) && !defined(BOOST_DISABLE_WIN32)
typedef bool (__cdecl *GrepCallback)(const RegEx& expression);
@@ -244,7 +244,7 @@ typedef bool (*FindFilesCallback)(const char* file);
class BOOST_REGEX_DECL RegEx
{
private:
- re_detail::RegExData* pdata;
+ BOOST_REGEX_DETAIL_NS::RegExData* pdata;
public:
RegEx();
RegEx(const RegEx& o);
@@ -296,10 +296,10 @@ public:
static const std::size_t npos;
- friend struct re_detail::pred1;
- friend struct re_detail::pred2;
- friend struct re_detail::pred3;
- friend struct re_detail::pred4;
+ friend struct BOOST_REGEX_DETAIL_NS::pred1;
+ friend struct BOOST_REGEX_DETAIL_NS::pred2;
+ friend struct BOOST_REGEX_DETAIL_NS::pred3;
+ friend struct BOOST_REGEX_DETAIL_NS::pred4;
};
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/fileiter.hpp b/boost/regex/v4/fileiter.hpp
index f13c4b2fb7..4873a0a85e 100644
--- a/boost/regex/v4/fileiter.hpp
+++ b/boost/regex/v4/fileiter.hpp
@@ -49,7 +49,7 @@
#include <cstddef>
namespace boost{
- namespace re_detail{
+ namespace BOOST_REGEX_DETAIL_NS{
#ifndef BOOST_NO_ANSI_APIS
typedef WIN32_FIND_DATAA _fi_find_data;
@@ -58,7 +58,7 @@ typedef WIN32_FIND_DATAW _fi_find_data;
#endif
typedef HANDLE _fi_find_handle;
- } // namespace re_detail
+ } // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
@@ -84,7 +84,7 @@ using std::list;
#endif
namespace boost{
- namespace re_detail{
+ namespace BOOST_REGEX_DETAIL_NS{
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
@@ -110,7 +110,7 @@ bool _fi_FindClose(_fi_find_handle hFindFile);
# include BOOST_ABI_SUFFIX
#endif
- } // namespace re_detail
+ } // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#ifdef FindFirstFile
@@ -130,7 +130,7 @@ bool _fi_FindClose(_fi_find_handle hFindFile);
#endif
namespace boost{
- namespace re_detail{
+ namespace BOOST_REGEX_DETAIL_NS{
#ifdef BOOST_HAS_ABI_HEADERS
# include BOOST_ABI_PREFIX
@@ -427,10 +427,10 @@ inline bool operator < (const directory_iterator&, const directory_iterator&)
#endif
-} // namespace re_detail
-using boost::re_detail::directory_iterator;
-using boost::re_detail::file_iterator;
-using boost::re_detail::mapfile;
+} // namespace BOOST_REGEX_DETAIL_NS
+using boost::BOOST_REGEX_DETAIL_NS::directory_iterator;
+using boost::BOOST_REGEX_DETAIL_NS::file_iterator;
+using boost::BOOST_REGEX_DETAIL_NS::mapfile;
} // namespace boost
#endif // BOOST_REGEX_NO_FILEITER
diff --git a/boost/regex/v4/instances.hpp b/boost/regex/v4/instances.hpp
index 6fa811d232..f66b237cb9 100644
--- a/boost/regex/v4/instances.hpp
+++ b/boost/regex/v4/instances.hpp
@@ -54,7 +54,7 @@ namespace boost{
template class BOOST_REGEX_DECL basic_regex< BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >;
template class BOOST_REGEX_DECL match_results< const BOOST_REGEX_CHAR_T* >;
#ifndef BOOST_NO_STD_ALLOCATOR
-template class BOOST_REGEX_DECL ::boost::re_detail::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
+template class BOOST_REGEX_DECL ::boost::BOOST_REGEX_DETAIL_NS::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
#endif
# ifndef BOOST_REGEX_INSTANTIATE
@@ -94,7 +94,7 @@ template class BOOST_REGEX_TEMPLATE_DECL basic_regex< BOOST_REGEX_CHAR_T BOOST_R
template class BOOST_REGEX_TEMPLATE_DECL match_results< const BOOST_REGEX_CHAR_T* >;
#ifndef BOOST_NO_STD_ALLOCATOR
-template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
+template class BOOST_REGEX_TEMPLATE_DECL ::boost::BOOST_REGEX_DETAIL_NS::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
#endif
#if !(defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB <= 1))\
&& !(defined(BOOST_INTEL_CXX_VERSION) && (BOOST_INTEL_CXX_VERSION <= 800))\
@@ -102,7 +102,7 @@ template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher<BOOST_
&& !defined(BOOST_REGEX_ICU_INSTANCES)
template class BOOST_REGEX_TEMPLATE_DECL match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >;
#ifndef BOOST_NO_STD_ALLOCATOR
-template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >;
+template class BOOST_REGEX_TEMPLATE_DECL ::boost::BOOST_REGEX_DETAIL_NS::perl_matcher< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >;
#endif
#endif
@@ -119,6 +119,11 @@ template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher< std::
#elif (defined(__GNUC__) && (__GNUC__ >= 3)) || !defined(BOOST_NO_CXX11_EXTERN_TEMPLATE)
+#ifdef __clang__
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wkeyword-macro"
+#endif
+
# ifndef BOOST_REGEX_INSTANTIATE
# ifdef __GNUC__
# define template __extension__ extern template
@@ -128,7 +133,7 @@ template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher< std::
# endif
#if !defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_REGEX_ICU_INSTANCES)
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template BOOST_REGEX_DECL
std::locale cpp_regex_traits_base<BOOST_REGEX_CHAR_T>::imbue(const std::locale& l);
@@ -177,7 +182,7 @@ template BOOST_REGEX_DECL void BOOST_REGEX_CALL
match_results<const BOOST_REGEX_CHAR_T*>::maybe_assign(
const match_results<const BOOST_REGEX_CHAR_T*>& m);
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template BOOST_REGEX_DECL void perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::construct_init(
const basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >& e, match_flag_type f);
template BOOST_REGEX_DECL bool perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::match();
@@ -193,7 +198,7 @@ template BOOST_REGEX_DECL void BOOST_REGEX_CALL
match_results<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator>::maybe_assign(
const match_results<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator>& m);
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template BOOST_REGEX_DECL void perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::construct_init(
const basic_regex<BOOST_REGEX_CHAR_T>& e, match_flag_type f);
template BOOST_REGEX_DECL bool perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::match();
@@ -205,7 +210,9 @@ template BOOST_REGEX_DECL bool perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T
# undef template
# endif
-
+#ifdef __clang__
+#pragma clang diagnostic pop
+#endif
#endif
} // namespace boost
diff --git a/boost/regex/v4/iterator_traits.hpp b/boost/regex/v4/iterator_traits.hpp
index 53e1376041..ae45ecb80c 100644
--- a/boost/regex/v4/iterator_traits.hpp
+++ b/boost/regex/v4/iterator_traits.hpp
@@ -31,7 +31,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
#if defined(BOOST_NO_STD_ITERATOR_TRAITS)
@@ -117,7 +117,7 @@ struct regex_iterator_traits : public std::iterator_traits<T> {};
#endif
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/match_results.hpp b/boost/regex/v4/match_results.hpp
index 3e79b7a766..c8233bdd87 100644
--- a/boost/regex/v4/match_results.hpp
+++ b/boost/regex/v4/match_results.hpp
@@ -39,7 +39,7 @@ namespace boost{
# endif
#endif
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
class named_subexpressions;
@@ -64,14 +64,14 @@ public:
typedef const_reference reference;
typedef typename vector_type::const_iterator const_iterator;
typedef const_iterator iterator;
- typedef typename re_detail::regex_iterator_traits<
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<
BidiIterator>::difference_type difference_type;
typedef typename Allocator::size_type size_type;
typedef Allocator allocator_type;
- typedef typename re_detail::regex_iterator_traits<
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<
BidiIterator>::value_type char_type;
typedef std::basic_string<char_type> string_type;
- typedef re_detail::named_subexpressions named_sub_type;
+ typedef BOOST_REGEX_DETAIL_NS::named_subexpressions named_sub_type;
// construct/copy/destroy:
explicit match_results(const Allocator& a = Allocator())
@@ -158,7 +158,7 @@ public:
const sub_match<BidiIterator>& s = m_subs[sub];
if(s.matched || (sub == 2))
{
- return ::boost::re_detail::distance((BidiIterator)(m_base), (BidiIterator)(s.first));
+ return ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)(m_base), (BidiIterator)(s.first));
}
}
return ~static_cast<difference_type>(0);
@@ -237,7 +237,7 @@ public:
//
if(m_is_singular)
raise_logic_error();
- re_detail::named_subexpressions::range_type r = m_named_subs->equal_range(i, j);
+ BOOST_REGEX_DETAIL_NS::named_subexpressions::range_type r = m_named_subs->equal_range(i, j);
while((r.first != r.second) && ((*this)[r.first->index].matched == false))
++r.first;
return r.first != r.second ? (*this)[r.first->index] : m_null;
@@ -262,7 +262,7 @@ public:
//
if(m_is_singular)
raise_logic_error();
- re_detail::named_subexpressions::range_type s, r;
+ BOOST_REGEX_DETAIL_NS::named_subexpressions::range_type s, r;
s = r = m_named_subs->equal_range(i, j);
while((r.first != r.second) && ((*this)[r.first->index].matched == false))
++r.first;
@@ -345,7 +345,7 @@ public:
{
if(m_is_singular)
raise_logic_error();
- typedef typename re_detail::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, OutputIterator>::type F;
+ typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, OutputIterator>::type F;
F func(fmt);
return func(*this, out, flags);
}
@@ -355,9 +355,9 @@ public:
if(m_is_singular)
raise_logic_error();
std::basic_string<char_type> result;
- re_detail::string_out_iterator<std::basic_string<char_type> > i(result);
+ BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> > i(result);
- typedef typename re_detail::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, re_detail::string_out_iterator<std::basic_string<char_type> > >::type F;
+ typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> > >::type F;
F func(fmt);
func(*this, i, flags);
@@ -373,7 +373,7 @@ public:
if(m_is_singular)
raise_logic_error();
typedef ::boost::regex_traits_wrapper<typename RegexT::traits_type> traits_type;
- typedef typename re_detail::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, OutputIterator, traits_type>::type F;
+ typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, OutputIterator, traits_type>::type F;
F func(fmt);
return func(*this, out, flags, re.get_traits());
}
@@ -386,9 +386,9 @@ public:
raise_logic_error();
typedef ::boost::regex_traits_wrapper<typename RegexT::traits_type> traits_type;
std::basic_string<char_type> result;
- re_detail::string_out_iterator<std::basic_string<char_type> > i(result);
+ BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> > i(result);
- typedef typename re_detail::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, re_detail::string_out_iterator<std::basic_string<char_type> >, traits_type >::type F;
+ typedef typename BOOST_REGEX_DETAIL_NS::compute_functor_type<Functor, match_results<BidiIterator, Allocator>, BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<char_type> >, traits_type >::type F;
F func(fmt);
func(*this, i, flags, re.get_traits());
@@ -639,15 +639,15 @@ void BOOST_REGEX_CALL match_results<BidiIterator, Allocator>::maybe_assign(const
// p1 better than p2, and no need to calculate distances:
return;
}
- base1 = ::boost::re_detail::distance(l_base, p1->first);
- base2 = ::boost::re_detail::distance(l_base, p2->first);
+ base1 = ::boost::BOOST_REGEX_DETAIL_NS::distance(l_base, p1->first);
+ base2 = ::boost::BOOST_REGEX_DETAIL_NS::distance(l_base, p2->first);
BOOST_ASSERT(base1 >= 0);
BOOST_ASSERT(base2 >= 0);
if(base1 < base2) return;
if(base2 < base1) break;
- len1 = ::boost::re_detail::distance((BidiIterator)p1->first, (BidiIterator)p1->second);
- len2 = ::boost::re_detail::distance((BidiIterator)p2->first, (BidiIterator)p2->second);
+ len1 = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)p1->first, (BidiIterator)p1->second);
+ len2 = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)p2->first, (BidiIterator)p2->second);
BOOST_ASSERT(len1 >= 0);
BOOST_ASSERT(len2 >= 0);
if((len1 != len2) || ((p1->matched == false) && (p2->matched == true)))
diff --git a/boost/regex/v4/mem_block_cache.hpp b/boost/regex/v4/mem_block_cache.hpp
index 222142dd69..dc54915062 100644
--- a/boost/regex/v4/mem_block_cache.hpp
+++ b/boost/regex/v4/mem_block_cache.hpp
@@ -28,7 +28,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
struct mem_block_node
{
diff --git a/boost/regex/v4/perl_matcher.hpp b/boost/regex/v4/perl_matcher.hpp
index b7b3b58e62..a7298fbd7a 100644
--- a/boost/regex/v4/perl_matcher.hpp
+++ b/boost/regex/v4/perl_matcher.hpp
@@ -31,7 +31,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
//
// error checking API:
@@ -253,23 +253,40 @@ class repeater_count
int state_id;
std::size_t count; // the number of iterations so far
BidiIterator start_pos; // where the last repeat started
+
+ repeater_count* unwind_until(int n, repeater_count* p, int current_recursion_id)
+ {
+ while(p && (p->state_id != n))
+ {
+ if(-2 - current_recursion_id == p->state_id)
+ return 0;
+ p = p->next;
+ if(p && (p->state_id < 0))
+ {
+ p = unwind_until(p->state_id, p, current_recursion_id);
+ if(!p)
+ return p;
+ p = p->next;
+ }
+ }
+ return p;
+ }
public:
repeater_count(repeater_count** s) : stack(s), next(0), state_id(-1), count(0), start_pos() {}
-
- repeater_count(int i, repeater_count** s, BidiIterator start)
+
+ repeater_count(int i, repeater_count** s, BidiIterator start, int current_recursion_id)
: start_pos(start)
{
state_id = i;
stack = s;
next = *stack;
*stack = this;
- if(state_id > next->state_id)
+ if((state_id > next->state_id) && (next->state_id >= 0))
count = 0;
else
{
repeater_count* p = next;
- while(p && (p->state_id != state_id))
- p = p->next;
+ p = unwind_until(state_id, p, current_recursion_id);
if(p)
{
count = p->count;
@@ -426,6 +443,11 @@ private:
bool backtrack_till_match(std::size_t count);
#endif
bool match_recursion();
+ bool match_fail();
+ bool match_accept();
+ bool match_commit();
+ bool match_then();
+ bool skip_until_paren(int index, bool match = true);
// find procs stored in s_find_vtable:
bool find_restart_any();
@@ -483,7 +505,12 @@ private:
unsigned char match_any_mask;
// recursion information:
std::vector<recursion_info<results_type> > recursion_stack;
-
+#ifdef BOOST_REGEX_RECURSIVE
+ // Set to false by a (*COMMIT):
+ bool m_can_backtrack;
+ bool m_have_accept;
+ bool m_have_then;
+#endif
#ifdef BOOST_REGEX_NON_RECURSIVE
//
// additional members for non-recursive version:
@@ -508,6 +535,8 @@ private:
bool unwind_non_greedy_repeat(bool);
bool unwind_recursion(bool);
bool unwind_recursion_pop(bool);
+ bool unwind_commit(bool);
+ bool unwind_then(bool);
void destroy_single_repeat();
void push_matched_paren(int index, const sub_match<BidiIterator>& sub);
void push_recursion_stopper();
@@ -523,11 +552,17 @@ private:
saved_state* m_stack_base;
// pointer to current stack position:
saved_state* m_backup_state;
+ // how many memory blocks have we used up?:
+ unsigned used_block_count;
// determines what value to return when unwinding from recursion,
// allows for mixed recursive/non-recursive algorithm:
bool m_recursive_result;
- // how many memory blocks have we used up?:
- unsigned used_block_count;
+ // We have unwound to a lookahead/lookbehind, used by COMMIT/PRUNE/SKIP:
+ bool m_unwound_lookahead;
+ // We have unwound to an alternative, used by THEN:
+ bool m_unwound_alt;
+ // We are unwinding a commit - used by independent subs to determine whether to stop there or carry on unwinding:
+ //bool m_unwind_commit;
#endif
// these operations aren't allowed, so are declared private,
@@ -544,7 +579,7 @@ private:
#pragma warning(pop)
#endif
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
#ifdef BOOST_MSVC
#pragma warning(push)
diff --git a/boost/regex/v4/perl_matcher_common.hpp b/boost/regex/v4/perl_matcher_common.hpp
index 480d8f145d..f3949ccf93 100644
--- a/boost/regex/v4/perl_matcher_common.hpp
+++ b/boost/regex/v4/perl_matcher_common.hpp
@@ -40,7 +40,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class BidiIterator, class Allocator, class traits>
void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_regex<char_type, traits>& e, match_flag_type f)
@@ -80,11 +80,17 @@ void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_r
#ifdef BOOST_REGEX_NON_RECURSIVE
m_stack_base = 0;
m_backup_state = 0;
+#elif defined(BOOST_REGEX_RECURSIVE)
+ m_can_backtrack = true;
+ m_have_accept = false;
#endif
// find the value to use for matching word boundaries:
m_word_mask = re.get_data().m_word_mask;
// find bitmask to use for matching '.':
- match_any_mask = static_cast<unsigned char>((f & match_not_dot_newline) ? re_detail::test_not_newline : re_detail::test_newline);
+ match_any_mask = static_cast<unsigned char>((f & match_not_dot_newline) ? BOOST_REGEX_DETAIL_NS::test_not_newline : BOOST_REGEX_DETAIL_NS::test_newline);
+ // Disable match_any if requested in the state machine:
+ if(e.get_data().m_disable_match_any)
+ m_match_flags &= ~regex_constants::match_any;
}
template <class BidiIterator, class Allocator, class traits>
@@ -101,7 +107,7 @@ void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(std
// Calculate NS^2 first:
//
static const std::ptrdiff_t k = 100000;
- std::ptrdiff_t dist = boost::re_detail::distance(base, last);
+ std::ptrdiff_t dist = boost::BOOST_REGEX_DETAIL_NS::distance(base, last);
if(dist == 0)
dist = 1;
std::ptrdiff_t states = re.size();
@@ -165,7 +171,7 @@ template <class BidiIterator, class Allocator, class traits>
inline bool perl_matcher<BidiIterator, Allocator, traits>::protected_call(
protected_proc_type proc)
{
- ::boost::re_detail::concrete_protected_call
+ ::boost::BOOST_REGEX_DETAIL_NS::concrete_protected_call
<perl_matcher<BidiIterator, Allocator, traits> >
obj(this, proc);
return obj.execute();
@@ -348,6 +354,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_prefix()
#endif
if(!m_has_found_match)
position = restart; // reset search postion
+#ifdef BOOST_REGEX_RECURSIVE
+ m_can_backtrack = true; // reset for further searches
+#endif
return m_has_found_match;
}
@@ -703,7 +712,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_backstep()
#endif
if( ::boost::is_random_access_iterator<BidiIterator>::value)
{
- std::ptrdiff_t maxlen = ::boost::re_detail::distance(backstop, position);
+ std::ptrdiff_t maxlen = ::boost::BOOST_REGEX_DETAIL_NS::distance(backstop, position);
if(maxlen < static_cast<const re_brace*>(pstate)->index)
return false;
std::advance(position, -static_cast<const re_brace*>(pstate)->index);
@@ -793,6 +802,25 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case()
return true;
}
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_fail()
+{
+ // Just force a backtrack:
+ return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_accept()
+{
+ if(!recursion_stack.empty())
+ {
+ return skip_until_paren(recursion_stack.back().idx);
+ }
+ else
+ {
+ return skip_until_paren(INT_MAX);
+ }
+}
template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any()
@@ -966,7 +994,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit()
return false;
}
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
diff --git a/boost/regex/v4/perl_matcher_non_recursive.hpp b/boost/regex/v4/perl_matcher_non_recursive.hpp
index 5c1f7a98b0..bf77eaa57b 100644
--- a/boost/regex/v4/perl_matcher_non_recursive.hpp
+++ b/boost/regex/v4/perl_matcher_non_recursive.hpp
@@ -34,11 +34,11 @@
#endif
#ifdef BOOST_MSVC
# pragma warning(push)
-# pragma warning(disable: 4800)
+# pragma warning(disable: 4800 4706)
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class T>
inline void inplace_destroy(T* p)
@@ -87,8 +87,8 @@ template <class BidiIterator>
struct saved_repeater : public saved_state
{
repeater_count<BidiIterator> count;
- saved_repeater(int i, repeater_count<BidiIterator>** s, BidiIterator start)
- : saved_state(saved_state_repeater_count), count(i,s,start){}
+ saved_repeater(int i, repeater_count<BidiIterator>** s, BidiIterator start, int current_recursion_id)
+ : saved_state(saved_state_repeater_count), count(i, s, start, current_recursion_id){}
};
struct saved_extra_block : public saved_state
@@ -141,7 +141,7 @@ struct saved_recursion : public saved_state
template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
{
- static matcher_proc_type const s_match_vtable[30] =
+ static matcher_proc_type const s_match_vtable[34] =
{
(&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
&perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
@@ -177,6 +177,10 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
&perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
&perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
&perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_fail,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_accept,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_commit,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_then,
};
push_recursion_stopper();
@@ -309,7 +313,7 @@ inline void perl_matcher<BidiIterator, Allocator, traits>::push_repeater_count(i
pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
--pmp;
}
- (void) new (pmp)saved_repeater<BidiIterator>(i, s, position);
+ (void) new (pmp)saved_repeater<BidiIterator>(i, s, position, this->recursion_stack.size() ? this->recursion_stack.back().idx : (INT_MIN + 3));
m_backup_state = pmp;
}
@@ -370,6 +374,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
pstate = pstate->next.p->next.p;
bool r = match_all_states();
+ if(!r && !m_independent)
+ {
+ // Must be unwinding from a COMMIT/SKIP/PRUNE and the independent
+ // sub failed, need to unwind everything else:
+ while(unwind(false));
+ return false;
+ }
pstate = next_pstate;
m_independent = old_independent;
#ifdef BOOST_REGEX_MATCH_EXTRA
@@ -652,7 +663,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
const re_repeat* rep = static_cast<const re_repeat*>(pstate);
bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- unsigned count = static_cast<unsigned>((std::min)(static_cast<unsigned>(::boost::re_detail::distance(position, last)), static_cast<unsigned>(greedy ? rep->max : rep->min)));
+ unsigned count = static_cast<unsigned>((std::min)(static_cast<unsigned>(::boost::BOOST_REGEX_DETAIL_NS::distance(position, last)), static_cast<unsigned>(greedy ? rep->max : rep->min)));
if(rep->min > count)
{
position = last;
@@ -705,7 +716,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
BidiIterator end = position;
// Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
+ std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
if(desired >= len)
end = last;
else
@@ -715,7 +726,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
{
++position;
}
- count = (unsigned)::boost::re_detail::distance(origin, position);
+ count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
}
else
{
@@ -779,7 +790,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
BidiIterator end = position;
// Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
+ std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
if(desired >= len)
end = last;
else
@@ -789,7 +800,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
{
++position;
}
- count = (unsigned)::boost::re_detail::distance(origin, position);
+ count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
}
else
{
@@ -854,7 +865,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
BidiIterator end = position;
// Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
+ std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
if(desired >= len)
end = last;
else
@@ -864,7 +875,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
{
++position;
}
- count = (unsigned)::boost::re_detail::distance(origin, position);
+ count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
}
else
{
@@ -923,12 +934,12 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
recursion_stack.push_back(recursion_info<results_type>());
recursion_stack.back().preturn_address = pstate->next.p;
recursion_stack.back().results = *m_presult;
- if(static_cast<const re_recurse*>(pstate)->state_id > 0)
- {
- push_repeater_count(static_cast<const re_recurse*>(pstate)->state_id, &next_count);
- }
pstate = static_cast<const re_jump*>(pstate)->alt.p;
recursion_stack.back().idx = static_cast<const re_brace*>(pstate)->index;
+ //if(static_cast<const re_recurse*>(pstate)->state_id > 0)
+ {
+ push_repeater_count(-(2 + static_cast<const re_brace*>(pstate)->index), &next_count);
+ }
return true;
}
@@ -952,6 +963,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_endmark()
*m_presult = recursion_stack.back().results;
push_recursion(recursion_stack.back().idx, recursion_stack.back().preturn_address, &recursion_stack.back().results);
recursion_stack.pop_back();
+ push_repeater_count(-(2 + index), &next_count);
}
}
}
@@ -1003,6 +1015,103 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
return true;
}
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_commit()
+{
+ // Ideally we would just junk all the states that are on the stack,
+ // however we might not unwind correctly in that case, so for now,
+ // just mark that we don't backtrack into whatever is left (or rather
+ // we'll unwind it unconditionally without pausing to try other matches).
+
+ switch(static_cast<const re_commit*>(pstate)->action)
+ {
+ case commit_commit:
+ restart = last;
+ break;
+ case commit_skip:
+ if(base != position)
+ {
+ restart = position;
+ // Have to decrement restart since it will get incremented again later:
+ --restart;
+ }
+ break;
+ case commit_prune:
+ break;
+ }
+
+ saved_state* pmp = m_backup_state;
+ --pmp;
+ if(pmp < m_stack_base)
+ {
+ extend_stack();
+ pmp = m_backup_state;
+ --pmp;
+ }
+ (void) new (pmp)saved_state(16);
+ m_backup_state = pmp;
+ pstate = pstate->next.p;
+ return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_then()
+{
+ // Just leave a mark that we need to skip to next alternative:
+ saved_state* pmp = m_backup_state;
+ --pmp;
+ if(pmp < m_stack_base)
+ {
+ extend_stack();
+ pmp = m_backup_state;
+ --pmp;
+ }
+ (void) new (pmp)saved_state(17);
+ m_backup_state = pmp;
+ pstate = pstate->next.p;
+ return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index, bool have_match)
+{
+ while(pstate)
+ {
+ if(pstate->type == syntax_element_endmark)
+ {
+ if(static_cast<const re_brace*>(pstate)->index == index)
+ {
+ if(have_match)
+ return this->match_endmark();
+ pstate = pstate->next.p;
+ return true;
+ }
+ else
+ {
+ // Unenclosed closing ), occurs when (*ACCEPT) is inside some other
+ // parenthesis which may or may not have other side effects associated with it.
+ match_endmark();
+ if(!pstate)
+ {
+ unwind(true);
+ }
+ }
+ continue;
+ }
+ else if(pstate->type == syntax_element_match)
+ return true;
+ else if(pstate->type == syntax_element_startmark)
+ {
+ int idx = static_cast<const re_brace*>(pstate)->index;
+ pstate = pstate->next.p;
+ skip_until_paren(idx, false);
+ continue;
+ }
+ pstate = pstate->next.p;
+ }
+ return true;
+}
+
/****************************************************************************
Unwind and associated proceedures follow, these perform what normal stack
@@ -1013,7 +1122,7 @@ unwinding does in the recursive implementation.
template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::unwind(bool have_match)
{
- static unwind_proc_type const s_unwind_table[18] =
+ static unwind_proc_type const s_unwind_table[19] =
{
&perl_matcher<BidiIterator, Allocator, traits>::unwind_end,
&perl_matcher<BidiIterator, Allocator, traits>::unwind_paren,
@@ -1031,9 +1140,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind(bool have_match)
&perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat,
&perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion,
&perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_pop,
+ &perl_matcher<BidiIterator, Allocator, traits>::unwind_commit,
+ &perl_matcher<BidiIterator, Allocator, traits>::unwind_then,
};
m_recursive_result = have_match;
+ m_unwound_lookahead = false;
+ m_unwound_alt = false;
unwind_proc_type unwinder;
bool cont;
//
@@ -1076,14 +1189,14 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_paren(bool have_match
#endif
// unwind stack:
m_backup_state = pmp+1;
- boost::re_detail::inplace_destroy(pmp);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp);
return true; // keep looking
}
template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper(bool)
{
- boost::re_detail::inplace_destroy(m_backup_state++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(m_backup_state++);
pstate = 0; // nothing left to search
return false; // end of stack nothing more to search
}
@@ -1096,8 +1209,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion(bool r)
position = pmp->position;
bool result = (r == pmp->positive);
m_recursive_result = pmp->positive ? r : !r;
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
+ m_unwound_lookahead = true;
return !result; // return false if the assertion was matched to stop search.
}
@@ -1110,8 +1224,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_alt(bool r)
pstate = pmp->pstate;
position = pmp->position;
}
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
+ m_unwound_alt = !r;
return r;
}
@@ -1119,7 +1234,7 @@ template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool)
{
saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
return true; // keep looking
}
@@ -1131,7 +1246,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block(bool)
void* condemmed = m_stack_base;
m_stack_base = pmp->base;
m_backup_state = pmp->end;
- boost::re_detail::inplace_destroy(pmp);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp);
put_mem_block(condemmed);
return true; // keep looking
}
@@ -1140,7 +1255,7 @@ template <class BidiIterator, class Allocator, class traits>
inline void perl_matcher<BidiIterator, Allocator, traits>::destroy_single_repeat()
{
saved_single_repeat<BidiIterator>* p = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
- boost::re_detail::inplace_destroy(p++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(p++);
m_backup_state = p;
}
@@ -1532,7 +1647,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat(boo
pstate = pmp->pstate;
++(*next_count);
}
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
return r;
}
@@ -1548,7 +1663,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion(bool r)
recursion_stack.back().preturn_address = pmp->preturn_address;
recursion_stack.back().results = pmp->results;
}
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
return true;
}
@@ -1561,7 +1676,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_pop(bool r)
{
recursion_stack.pop_back();
}
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
return true;
}
@@ -1580,6 +1695,48 @@ void perl_matcher<BidiIterator, Allocator, traits>::push_recursion_pop()
(void) new (pmp)saved_state(15);
m_backup_state = pmp;
}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_commit(bool b)
+{
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(m_backup_state++);
+ while(unwind(b) && !m_unwound_lookahead){}
+ if(m_unwound_lookahead && pstate)
+ {
+ //
+ // If we stop because we just unwound an assertion, put the
+ // commit state back on the stack again:
+ //
+ saved_state* pmp = m_backup_state;
+ --pmp;
+ if(pmp < m_stack_base)
+ {
+ extend_stack();
+ pmp = m_backup_state;
+ --pmp;
+ }
+ (void) new (pmp)saved_state(16);
+ m_backup_state = pmp;
+ }
+ // This prevents us from stopping when we exit from an independent sub-expression:
+ m_independent = false;
+ return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_then(bool b)
+{
+ // Unwind everything till we hit an alternative:
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(m_backup_state++);
+ bool result = false;
+ while((result = unwind(b)) && !m_unwound_alt){}
+ // We're now pointing at the next alternative, need one more backtrack
+ // since *all* the other alternatives must fail once we've reached a THEN clause:
+ if(result && m_unwound_alt)
+ unwind(b);
+ return false;
+}
+
/*
template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::unwind_parenthesis_pop(bool r)
@@ -1589,7 +1746,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_parenthesis_pop(bool
{
--parenthesis_stack_position;
}
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
return true;
}
@@ -1617,7 +1774,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::unwind_parenthesis_push(bool
{
parenthesis_stack[parenthesis_stack_position++] = pmp->position;
}
- boost::re_detail::inplace_destroy(pmp++);
+ boost::BOOST_REGEX_DETAIL_NS::inplace_destroy(pmp++);
m_backup_state = pmp;
return true;
}
@@ -1637,7 +1794,7 @@ inline void perl_matcher<BidiIterator, Allocator, traits>::push_parenthesis_push
m_backup_state = pmp;
}
*/
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/perl_matcher_recursive.hpp b/boost/regex/v4/perl_matcher_recursive.hpp
index 8e0e182b56..3893837df3 100644
--- a/boost/regex/v4/perl_matcher_recursive.hpp
+++ b/boost/regex/v4/perl_matcher_recursive.hpp
@@ -37,7 +37,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class BidiIterator>
class backup_subex
@@ -60,7 +60,7 @@ public:
template <class BidiIterator, class Allocator, class traits>
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
{
- static matcher_proc_type const s_match_vtable[30] =
+ static matcher_proc_type const s_match_vtable[34] =
{
(&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
&perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
@@ -96,6 +96,10 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
&perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
&perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
&perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_fail,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_accept,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_commit,
+ &perl_matcher<BidiIterator, Allocator, traits>::match_then,
};
if(state_count > max_state_count)
@@ -139,6 +143,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
r = false;
else
r = true;
+ if(r && m_have_accept)
+ r = skip_until_paren(INT_MAX);
break;
}
case -3:
@@ -148,7 +154,10 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
m_independent = true;
const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
pstate = pstate->next.p->next.p;
+ bool can_backtrack = m_can_backtrack;
r = match_all_states();
+ if(r)
+ m_can_backtrack = can_backtrack;
pstate = next_pstate;
m_independent = old_independent;
#ifdef BOOST_REGEX_MATCH_EXTRA
@@ -178,6 +187,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
}
}
#endif
+ if(r && m_have_accept)
+ r = skip_until_paren(INT_MAX);
break;
}
case -4:
@@ -278,12 +289,20 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
BidiIterator oldposition(position);
const re_syntax_base* old_pstate = jmp->alt.p;
pstate = pstate->next.p;
+ m_have_then = false;
if(!match_all_states())
{
pstate = old_pstate;
position = oldposition;
+ if(m_have_then)
+ {
+ m_can_backtrack = true;
+ m_have_then = false;
+ return false;
+ }
}
- return true;
+ m_have_then = false;
+ return m_can_backtrack;
}
pstate = pstate->next.p;
return true;
@@ -308,7 +327,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
// Always copy the repeat count, so that the state is restored
// when we exit this scope:
//
- repeater_count<BidiIterator> r(rep->state_id, &next_count, position);
+ repeater_count<BidiIterator> r(rep->state_id, &next_count, position, this->recursion_stack.size() ? this->recursion_stack.back().idx : INT_MIN + 3);
//
// If we've had at least one repeat already, and the last one
// matched the NULL string then set the repeat count to
@@ -354,6 +373,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
pstate = rep->next.p;
if(match_all_states())
return true;
+ if(!m_can_backtrack)
+ return false;
// failed repeat, reset posistion and fall through for alternative:
position = pos;
}
@@ -374,6 +395,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
pstate = rep->alt.p;
if(match_all_states())
return true;
+ if(!m_can_backtrack)
+ return false;
// failed alternative, reset posistion and fall through for repeat:
position = pos;
}
@@ -438,7 +461,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
++state_count;
if(match_all_states())
return true;
- if(count >= rep->max)
+ if((count >= rep->max) || !m_can_backtrack)
return false;
++count;
pstate = psingle;
@@ -472,7 +495,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
#pragma warning(disable:4267)
#endif
bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);
- std::size_t count = (std::min)(static_cast<std::size_t>(::boost::re_detail::distance(position, last)), static_cast<std::size_t>(greedy ? rep->max : rep->min));
+ std::size_t count = (std::min)(static_cast<std::size_t>(::boost::BOOST_REGEX_DETAIL_NS::distance(position, last)), static_cast<std::size_t>(greedy ? rep->max : rep->min));
if(rep->min > count)
{
position = last;
@@ -503,7 +526,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
++state_count;
if(match_all_states())
return true;
- if(count >= rep->max)
+ if((count >= rep->max) || !m_can_backtrack)
return false;
if(save_pos == last)
return false;
@@ -539,7 +562,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
desired =
(std::min)(
(std::size_t)(greedy ? rep->max : rep->min),
- (std::size_t)::boost::re_detail::distance(position, last));
+ (std::size_t)::boost::BOOST_REGEX_DETAIL_NS::distance(position, last));
count = desired;
++desired;
if(icase)
@@ -597,7 +620,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
++state_count;
if(match_all_states())
return true;
- if(count >= rep->max)
+ if((count >= rep->max) || !m_can_backtrack)
return false;
position = save_pos;
if(position == last)
@@ -643,7 +666,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
BidiIterator end = position;
// Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
+ std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
if(desired >= len)
end = last;
else
@@ -653,7 +676,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
{
++position;
}
- count = (unsigned)::boost::re_detail::distance(origin, position);
+ count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
}
else
{
@@ -692,7 +715,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
++state_count;
if(match_all_states())
return true;
- if(count >= rep->max)
+ if((count >= rep->max) || !m_can_backtrack)
return false;
position = save_pos;
if(position == last)
@@ -739,7 +762,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
BidiIterator end = position;
// Move end forward by "desired", preferably without using distance or advance if we can
// as these can be slow for some iterator types.
- std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::re_detail::distance(position, last);
+ std::size_t len = (desired == (std::numeric_limits<std::size_t>::max)()) ? 0u : ::boost::BOOST_REGEX_DETAIL_NS::distance(position, last);
if(desired >= len)
end = last;
else
@@ -749,7 +772,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
{
++position;
}
- count = (unsigned)::boost::re_detail::distance(origin, position);
+ count = (unsigned)::boost::BOOST_REGEX_DETAIL_NS::distance(origin, position);
}
else
{
@@ -788,7 +811,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
++state_count;
if(match_all_states())
return true;
- if(count >= rep->max)
+ if((count >= rep->max) || !m_can_backtrack)
return false;
position = save_pos;
if(position == last)
@@ -818,6 +841,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::backtrack_till_match(std::si
#pragma warning(push)
#pragma warning(disable:4127)
#endif
+ if(!m_can_backtrack)
+ return false;
if((m_match_flags & match_partial) && (position == last))
m_has_partial_match = true;
@@ -883,7 +908,9 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
repeater_count<BidiIterator>* saved = next_count;
repeater_count<BidiIterator> r(&next_count); // resets all repeat counts since we're recursing and starting fresh on those
next_count = &r;
+ bool can_backtrack = m_can_backtrack;
bool result = match_all_states();
+ m_can_backtrack = can_backtrack;
next_count = saved;
if(!result)
@@ -980,9 +1007,76 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
return true;
}
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_commit()
+{
+ m_can_backtrack = false;
+ int action = static_cast<const re_commit*>(pstate)->action;
+ switch(action)
+ {
+ case commit_commit:
+ restart = last;
+ break;
+ case commit_skip:
+ restart = position;
+ break;
+ }
+ pstate = pstate->next.p;
+ return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_then()
+{
+ pstate = pstate->next.p;
+ if(match_all_states())
+ return true;
+ m_can_backtrack = false;
+ m_have_then = true;
+ return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index, bool have_match)
+{
+ while(pstate)
+ {
+ if(pstate->type == syntax_element_endmark)
+ {
+ if(static_cast<const re_brace*>(pstate)->index == index)
+ {
+ if(have_match)
+ return this->match_endmark();
+ pstate = pstate->next.p;
+ return true;
+ }
+ else
+ {
+ // Unenclosed closing ), occurs when (*ACCEPT) is inside some other
+ // parenthesis which may or may not have other side effects associated with it.
+ bool r = match_endmark();
+ m_have_accept = true;
+ if(!pstate)
+ return r;
+ }
+ continue;
+ }
+ else if(pstate->type == syntax_element_match)
+ return true;
+ else if(pstate->type == syntax_element_startmark)
+ {
+ int idx = static_cast<const re_brace*>(pstate)->index;
+ pstate = pstate->next.p;
+ skip_until_paren(idx, false);
+ continue;
+ }
+ pstate = pstate->next.p;
+ }
+ return true;
+}
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#ifdef BOOST_MSVC
#pragma warning(pop)
diff --git a/boost/regex/v4/primary_transform.hpp b/boost/regex/v4/primary_transform.hpp
index 989f500c1d..3e7cac549b 100644
--- a/boost/regex/v4/primary_transform.hpp
+++ b/boost/regex/v4/primary_transform.hpp
@@ -32,7 +32,7 @@
#endif
namespace boost{
- namespace re_detail{
+ namespace BOOST_REGEX_DETAIL_NS{
enum{
@@ -122,7 +122,7 @@ unsigned find_sort_syntax(const traits* pt, charT* delim)
}
- } // namespace re_detail
+ } // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/protected_call.hpp b/boost/regex/v4/protected_call.hpp
index ebf15ba370..9d47514f81 100644
--- a/boost/regex/v4/protected_call.hpp
+++ b/boost/regex/v4/protected_call.hpp
@@ -32,7 +32,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
class BOOST_REGEX_DECL abstract_protected_call
{
diff --git a/boost/regex/v4/regex_format.hpp b/boost/regex/v4/regex_format.hpp
index a34c40ad24..e9006a7bd2 100644
--- a/boost/regex/v4/regex_format.hpp
+++ b/boost/regex/v4/regex_format.hpp
@@ -55,7 +55,7 @@ namespace boost{
template <class BidiIterator, class Allocator = BOOST_DEDUCED_TYPENAME std::vector<sub_match<BidiIterator> >::allocator_type >
class match_results;
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
//
// struct trivial_format_traits:
@@ -73,11 +73,11 @@ struct trivial_format_traits
}
static charT tolower(charT c)
{
- return ::boost::re_detail::global_lower(c);
+ return ::boost::BOOST_REGEX_DETAIL_NS::global_lower(c);
}
static charT toupper(charT c)
{
- return ::boost::re_detail::global_upper(c);
+ return ::boost::BOOST_REGEX_DETAIL_NS::global_upper(c);
}
static int value(const charT c, int radix)
{
@@ -359,7 +359,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
default:
// see if we have a number:
{
- std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+ std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
//len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
int v = this->toi(m_position, m_position + len, 10);
if((v < 0) || (have_brace && ((m_position == m_end) || (*m_position != '}'))))
@@ -570,7 +570,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
}
else
{
- std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+ std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
int val = this->toi(m_position, m_position + len, 16);
if(val < 0)
@@ -634,7 +634,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
break;
}
// see if we have a \n sed style backreference:
- std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+ std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
len = (std::min)(static_cast<std::ptrdiff_t>(1), len);
int v = this->toi(m_position, m_position+len, 10);
if((v > 0) || ((v == 0) && (m_flags & ::boost::regex_constants::format_sed)))
@@ -646,7 +646,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
{
// octal ecape sequence:
--m_position;
- len = ::boost::re_detail::distance(m_position, m_end);
+ len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
len = (std::min)(static_cast<std::ptrdiff_t>(4), len);
v = this->toi(m_position, m_position + len, 8);
BOOST_ASSERT(v >= 0);
@@ -693,7 +693,7 @@ void basic_regex_formatter<OutputIterator, Results, traits, ForwardIter>::format
}
else
{
- std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+ std::ptrdiff_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance(m_position, m_end);
len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
v = this->toi(m_position, m_position + len, 10);
}
@@ -835,10 +835,10 @@ OutputIterator regex_format_imp(OutputIterator out,
{
if(flags & regex_constants::format_literal)
{
- return re_detail::copy(p1, p2, out);
+ return BOOST_REGEX_DETAIL_NS::copy(p1, p2, out);
}
- re_detail::basic_regex_formatter<
+ BOOST_REGEX_DETAIL_NS::basic_regex_formatter<
OutputIterator,
match_results<Iterator, Alloc>,
traits, ForwardIter> f(out, m, t);
@@ -1028,7 +1028,7 @@ struct format_functor1
template <class S, class OutputIter>
OutputIter do_format_string(const S& s, OutputIter i)
{
- return re_detail::copy(s.begin(), s.end(), i);
+ return BOOST_REGEX_DETAIL_NS::copy(s.begin(), s.end(), i);
}
template <class S, class OutputIter>
inline OutputIter do_format_string(const S* s, OutputIter i)
@@ -1085,7 +1085,7 @@ struct format_functor_container
OutputIter operator()(const Match& m, OutputIter i, boost::regex_constants::match_flag_type f, const Traits& t = Traits())
{
//typedef typename Match::char_type char_type;
- return re_detail::regex_format_imp(i, m, func.begin(), func.end(), f, t);
+ return BOOST_REGEX_DETAIL_NS::regex_format_imp(i, m, func.begin(), func.end(), f, t);
}
private:
const Container& func;
@@ -1093,7 +1093,7 @@ private:
format_functor_container& operator=(const format_functor_container&);
};
-template <class Func, class Match, class OutputIterator, class Traits = re_detail::trivial_format_traits<typename Match::char_type> >
+template <class Func, class Match, class OutputIterator, class Traits = BOOST_REGEX_DETAIL_NS::trivial_format_traits<typename Match::char_type> >
struct compute_functor_type
{
typedef typename format_traits<Func, Match, OutputIterator>::type tag;
@@ -1114,7 +1114,7 @@ struct compute_functor_type
>::type type;
};
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
template <class OutputIterator, class Iterator, class Allocator, class Functor>
inline OutputIterator regex_format(OutputIterator out,
diff --git a/boost/regex/v4/regex_grep.hpp b/boost/regex/v4/regex_grep.hpp
index 3a3d906ecb..c5cb054e58 100644
--- a/boost/regex/v4/regex_grep.hpp
+++ b/boost/regex/v4/regex_grep.hpp
@@ -50,7 +50,7 @@ inline unsigned int regex_grep(Predicate foo,
typedef typename match_results<BidiIterator>::allocator_type match_allocator_type;
match_results<BidiIterator> m;
- re_detail::perl_matcher<BidiIterator, match_allocator_type, traits> matcher(first, last, m, e, flags, first);
+ BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, match_allocator_type, traits> matcher(first, last, m, e, flags, first);
unsigned int count = 0;
while(matcher.find())
{
diff --git a/boost/regex/v4/regex_iterator.hpp b/boost/regex/v4/regex_iterator.hpp
index 09e75c697d..0d10a1b98f 100644
--- a/boost/regex/v4/regex_iterator.hpp
+++ b/boost/regex/v4/regex_iterator.hpp
@@ -82,14 +82,14 @@ private:
};
template <class BidirectionalIterator,
- class charT = BOOST_DEDUCED_TYPENAME re_detail::regex_iterator_traits<BidirectionalIterator>::value_type,
+ class charT = BOOST_DEDUCED_TYPENAME BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::value_type,
class traits = regex_traits<charT> >
class regex_iterator
#ifndef BOOST_NO_STD_ITERATOR
: public std::iterator<
std::forward_iterator_tag,
match_results<BidirectionalIterator>,
- typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type,
const match_results<BidirectionalIterator>*,
const match_results<BidirectionalIterator>& >
#endif
@@ -100,7 +100,7 @@ private:
public:
typedef basic_regex<charT, traits> regex_type;
typedef match_results<BidirectionalIterator> value_type;
- typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
difference_type;
typedef const value_type* pointer;
typedef const value_type& reference;
diff --git a/boost/regex/v4/regex_match.hpp b/boost/regex/v4/regex_match.hpp
index e947a15225..a50daa2aa5 100644
--- a/boost/regex/v4/regex_match.hpp
+++ b/boost/regex/v4/regex_match.hpp
@@ -46,7 +46,7 @@ bool regex_match(BidiIterator first, BidiIterator last,
const basic_regex<charT, traits>& e,
match_flag_type flags = match_default)
{
- re_detail::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, first);
+ BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, first);
return matcher.match();
}
template <class iterator, class charT, class traits>
diff --git a/boost/regex/v4/regex_raw_buffer.hpp b/boost/regex/v4/regex_raw_buffer.hpp
index c7792e3d2e..fcdb856a55 100644
--- a/boost/regex/v4/regex_raw_buffer.hpp
+++ b/boost/regex/v4/regex_raw_buffer.hpp
@@ -29,7 +29,7 @@
#include <cstddef>
namespace boost{
- namespace re_detail{
+ namespace BOOST_REGEX_DETAIL_NS{
#ifdef BOOST_MSVC
#pragma warning(push)
@@ -198,7 +198,7 @@ inline raw_storage::raw_storage(size_type n)
#pragma warning(pop)
#endif
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
#endif
diff --git a/boost/regex/v4/regex_replace.hpp b/boost/regex/v4/regex_replace.hpp
index ac8e3c81e2..415c58b634 100644
--- a/boost/regex/v4/regex_replace.hpp
+++ b/boost/regex/v4/regex_replace.hpp
@@ -48,7 +48,7 @@ OutputIterator regex_replace(OutputIterator out,
if(i == j)
{
if(!(flags & regex_constants::format_no_copy))
- out = re_detail::copy(first, last, out);
+ out = BOOST_REGEX_DETAIL_NS::copy(first, last, out);
}
else
{
@@ -56,7 +56,7 @@ OutputIterator regex_replace(OutputIterator out,
while(i != j)
{
if(!(flags & regex_constants::format_no_copy))
- out = re_detail::copy(i->prefix().first, i->prefix().second, out);
+ out = BOOST_REGEX_DETAIL_NS::copy(i->prefix().first, i->prefix().second, out);
out = i->format(out, fmt, flags, e);
last_m = (*i)[0].second;
if(flags & regex_constants::format_first_only)
@@ -64,7 +64,7 @@ OutputIterator regex_replace(OutputIterator out,
++i;
}
if(!(flags & regex_constants::format_no_copy))
- out = re_detail::copy(last_m, last, out);
+ out = BOOST_REGEX_DETAIL_NS::copy(last_m, last, out);
}
return out;
}
@@ -76,7 +76,7 @@ std::basic_string<charT> regex_replace(const std::basic_string<charT>& s,
match_flag_type flags = match_default)
{
std::basic_string<charT> result;
- re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+ BOOST_REGEX_DETAIL_NS::string_out_iterator<std::basic_string<charT> > i(result);
regex_replace(i, s.begin(), s.end(), e, fmt, flags);
return result;
}
diff --git a/boost/regex/v4/regex_search.hpp b/boost/regex/v4/regex_search.hpp
index cf5579d2c7..0725d3ec3f 100644
--- a/boost/regex/v4/regex_search.hpp
+++ b/boost/regex/v4/regex_search.hpp
@@ -52,7 +52,7 @@ bool regex_search(BidiIterator first, BidiIterator last,
if(e.flags() & regex_constants::failbit)
return false;
- re_detail::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, base);
+ BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, base);
return matcher.find();
}
@@ -141,7 +141,7 @@ bool regex_search(BidiIterator first, BidiIterator last,
match_results<BidiIterator> m;
typedef typename match_results<BidiIterator>::allocator_type match_alloc_type;
- re_detail::perl_matcher<BidiIterator, match_alloc_type, traits> matcher(first, last, m, e, flags | regex_constants::match_any, first);
+ BOOST_REGEX_DETAIL_NS::perl_matcher<BidiIterator, match_alloc_type, traits> matcher(first, last, m, e, flags | regex_constants::match_any, first);
return matcher.find();
}
diff --git a/boost/regex/v4/regex_split.hpp b/boost/regex/v4/regex_split.hpp
index c12d7baa24..65b2c64abf 100644
--- a/boost/regex/v4/regex_split.hpp
+++ b/boost/regex/v4/regex_split.hpp
@@ -39,7 +39,7 @@ namespace boost{
# pragma warning(disable: 4800)
#endif
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class charT>
const basic_regex<charT>& get_default_expression(charT)
@@ -97,7 +97,7 @@ bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator()
return true;
}
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
std::size_t regex_split(OutputIterator out,
@@ -110,7 +110,7 @@ std::size_t regex_split(OutputIterator out,
//typedef typename match_results<ci_t>::allocator_type match_allocator;
ci_t last = s.begin();
std::size_t init_size = max_split;
- re_detail::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
+ BOOST_REGEX_DETAIL_NS::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
ci_t i, j;
i = s.begin();
j = s.end();
@@ -147,7 +147,7 @@ template <class OutputIterator, class charT, class Traits1, class Alloc1>
inline std::size_t regex_split(OutputIterator out,
std::basic_string<charT, Traits1, Alloc1>& s)
{
- return regex_split(out, s, re_detail::get_default_expression(charT(0)), match_default, UINT_MAX);
+ return regex_split(out, s, BOOST_REGEX_DETAIL_NS::get_default_expression(charT(0)), match_default, UINT_MAX);
}
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/regex_token_iterator.hpp b/boost/regex/v4/regex_token_iterator.hpp
index dbb0803742..1d75604bf1 100644
--- a/boost/regex/v4/regex_token_iterator.hpp
+++ b/boost/regex/v4/regex_token_iterator.hpp
@@ -164,14 +164,14 @@ private:
};
template <class BidirectionalIterator,
- class charT = BOOST_DEDUCED_TYPENAME re_detail::regex_iterator_traits<BidirectionalIterator>::value_type,
+ class charT = BOOST_DEDUCED_TYPENAME BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::value_type,
class traits = regex_traits<charT> >
class regex_token_iterator
#ifndef BOOST_NO_STD_ITERATOR
: public std::iterator<
std::forward_iterator_tag,
sub_match<BidirectionalIterator>,
- typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type,
const sub_match<BidirectionalIterator>*,
const sub_match<BidirectionalIterator>& >
#endif
@@ -182,7 +182,7 @@ private:
public:
typedef basic_regex<charT, traits> regex_type;
typedef sub_match<BidirectionalIterator> value_type;
- typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
difference_type;
typedef const value_type* pointer;
typedef const value_type& reference;
diff --git a/boost/regex/v4/regex_traits.hpp b/boost/regex/v4/regex_traits.hpp
index 8b1cb6ffe1..45a4bdf626 100644
--- a/boost/regex/v4/regex_traits.hpp
+++ b/boost/regex/v4/regex_traits.hpp
@@ -82,7 +82,7 @@ struct regex_traits : public implementationT
// interfaces that we support, in addition to the
// required "standard" ones:
//
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
#if !BOOST_WORKAROUND(__HP_aCC, < 60000)
BOOST_MPL_HAS_XXX_TRAIT_DEF(boost_extensions_tag)
#else
@@ -99,7 +99,7 @@ struct default_wrapper : public BaseT
typedef typename BaseT::char_type char_type;
std::string error_string(::boost::regex_constants::error_type e)const
{
- return ::boost::re_detail::get_default_error_string(e);
+ return ::boost::BOOST_REGEX_DETAIL_NS::get_default_error_string(e);
}
::boost::regex_constants::syntax_type syntax_type(char_type c)const
{
@@ -111,7 +111,7 @@ struct default_wrapper : public BaseT
}
int toi(const char_type*& p1, const char_type* p2, int radix)const
{
- return ::boost::re_detail::global_toi(p1, p2, radix, *this);
+ return ::boost::BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
}
char_type translate(char_type c, bool icase)const
{
@@ -123,11 +123,11 @@ struct default_wrapper : public BaseT
}
char_type tolower(char_type c)const
{
- return ::boost::re_detail::global_lower(c);
+ return ::boost::BOOST_REGEX_DETAIL_NS::global_lower(c);
}
char_type toupper(char_type c)const
{
- return ::boost::re_detail::global_upper(c);
+ return ::boost::BOOST_REGEX_DETAIL_NS::global_upper(c);
}
};
@@ -157,13 +157,13 @@ struct compute_wrapper_base<c_regex_traits<wchar_t>, false>
#endif
#endif
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
template <class BaseT>
struct regex_traits_wrapper
- : public ::boost::re_detail::compute_wrapper_base<
+ : public ::boost::BOOST_REGEX_DETAIL_NS::compute_wrapper_base<
BaseT,
- ::boost::re_detail::has_boost_extensions_tag<BaseT>::value
+ ::boost::BOOST_REGEX_DETAIL_NS::has_boost_extensions_tag<BaseT>::value
>::type
{
regex_traits_wrapper(){}
diff --git a/boost/regex/v4/regex_traits_defaults.hpp b/boost/regex/v4/regex_traits_defaults.hpp
index a087d78449..1821883717 100644
--- a/boost/regex/v4/regex_traits_defaults.hpp
+++ b/boost/regex/v4/regex_traits_defaults.hpp
@@ -30,12 +30,15 @@
#pragma warning(pop)
#endif
+#include <boost/regex/config.hpp>
+
#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
#include <boost/regex/v4/syntax_type.hpp>
#endif
#ifndef BOOST_REGEX_ERROR_TYPE_HPP
#include <boost/regex/v4/error_type.hpp>
#endif
+#include <boost/type_traits/make_unsigned.hpp>
#ifdef BOOST_NO_STDC_NAMESPACE
namespace std{
@@ -43,7 +46,7 @@ namespace std{
}
#endif
-namespace boost{ namespace re_detail{
+namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
//
@@ -51,7 +54,10 @@ namespace boost{ namespace re_detail{
//
template <class charT>
inline bool is_extended(charT c)
-{ return c > 256; }
+{
+ typedef typename make_unsigned<charT>::type unsigned_type;
+ return (sizeof(charT) > 1) && (static_cast<unsigned_type>(c) >= 256u);
+}
inline bool is_extended(char)
{ return false; }
@@ -153,7 +159,7 @@ struct character_pointer_range
// calling std::equal, but there is no other algorithm available:
// not even a non-standard MS one. So forward to unchecked_equal
// in the MS case.
- return ((p2 - p1) == (r.p2 - r.p1)) && re_detail::equal(p1, p2, r.p1);
+ return ((p2 - p1) == (r.p2 - r.p1)) && BOOST_REGEX_DETAIL_NS::equal(p1, p2, r.p1);
}
};
template <class charT>
@@ -354,7 +360,7 @@ inline const char* get_escape_R_string<char>()
#endif
}
-} // re_detail
+} // BOOST_REGEX_DETAIL_NS
} // boost
#ifdef BOOST_MSVC
diff --git a/boost/regex/v4/regex_workaround.hpp b/boost/regex/v4/regex_workaround.hpp
index fc57472a38..821be608c1 100644
--- a/boost/regex/v4/regex_workaround.hpp
+++ b/boost/regex/v4/regex_workaround.hpp
@@ -42,6 +42,7 @@
#include <boost/scoped_array.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/mpl/bool_fwd.hpp>
+#include <boost/regex/config.hpp>
#ifndef BOOST_NO_STD_LOCALE
# include <locale>
#endif
@@ -52,7 +53,7 @@ namespace std{
}
#endif
-namespace boost{ namespace re_detail{
+namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
#ifdef BOOST_NO_STD_DISTANCE
template <class T>
std::ptrdiff_t distance(const T& x, const T& y)
@@ -94,7 +95,7 @@ namespace std{
****************************************************************************/
#ifdef __cplusplus
-namespace boost{ namespace re_detail{
+namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
#ifdef BOOST_MSVC
#pragma warning (push)
@@ -123,7 +124,7 @@ inline void pointer_construct(T* p, const T& t)
****************************************************************************/
#ifdef __cplusplus
-namespace boost{ namespace re_detail{
+namespace boost{ namespace BOOST_REGEX_DETAIL_NS{
#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && BOOST_WORKAROUND(BOOST_MSVC, <1600) && defined(_CPPLIB_VER) && defined(BOOST_DINKUMWARE_STDLIB) && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))
//
// MSVC 8 will either emit warnings or else refuse to compile
diff --git a/boost/regex/v4/states.hpp b/boost/regex/v4/states.hpp
index 38690b2299..b56d013476 100644
--- a/boost/regex/v4/states.hpp
+++ b/boost/regex/v4/states.hpp
@@ -31,7 +31,7 @@
#endif
namespace boost{
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
/*** mask_type *******************************************************
Whenever we have a choice of two alternatives, we use an array of bytes
@@ -120,7 +120,12 @@ enum syntax_element_type
syntax_element_assert_backref = syntax_element_backstep + 1,
syntax_element_toggle_case = syntax_element_assert_backref + 1,
// a recursive expression:
- syntax_element_recurse = syntax_element_toggle_case + 1
+ syntax_element_recurse = syntax_element_toggle_case + 1,
+ // Verbs:
+ syntax_element_fail = syntax_element_recurse + 1,
+ syntax_element_accept = syntax_element_fail + 1,
+ syntax_element_commit = syntax_element_accept + 1,
+ syntax_element_then = syntax_element_commit + 1
};
#ifdef BOOST_REGEX_DEBUG
@@ -256,6 +261,21 @@ struct re_recurse : public re_jump
int state_id; // identifier of first nested repeat within the recursion.
};
+/*** struct re_commit *************************************************
+Used for the PRUNE, SKIP and COMMIT verbs which basically differ only in what happens
+if no match is found and we start searching forward.
+**********************************************************************/
+enum commit_type
+{
+ commit_prune,
+ commit_skip,
+ commit_commit
+};
+struct re_commit : public re_syntax_base
+{
+ commit_type action;
+};
+
/*** enum re_jump_size_type *******************************************
Provides compiled size of re_jump structure (allowing for trailing alignment).
We provide this so we know how manybytes to insert when constructing the machine
@@ -281,7 +301,7 @@ iterator BOOST_REGEX_CALL re_is_set_member(iterator next,
const re_set_long<char_classT>* set_,
const regex_data<charT, traits_type>& e, bool icase);
-} // namespace re_detail
+} // namespace BOOST_REGEX_DETAIL_NS
} // namespace boost
diff --git a/boost/regex/v4/sub_match.hpp b/boost/regex/v4/sub_match.hpp
index 7ce8d5397e..ff8a8e467b 100644
--- a/boost/regex/v4/sub_match.hpp
+++ b/boost/regex/v4/sub_match.hpp
@@ -35,11 +35,11 @@ namespace boost{
template <class BidiIterator>
struct sub_match : public std::pair<BidiIterator, BidiIterator>
{
- typedef typename re_detail::regex_iterator_traits<BidiIterator>::value_type value_type;
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidiIterator>::value_type value_type;
#if defined(BOOST_NO_STD_ITERATOR_TRAITS)
typedef std::ptrdiff_t difference_type;
#else
- typedef typename re_detail::regex_iterator_traits<BidiIterator>::difference_type difference_type;
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidiIterator>::difference_type difference_type;
#endif
typedef BidiIterator iterator_type;
typedef BidiIterator iterator;
@@ -65,7 +65,7 @@ struct sub_match : public std::pair<BidiIterator, BidiIterator>
#endif
difference_type BOOST_REGEX_CALL length()const
{
- difference_type n = matched ? ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second) : 0;
+ difference_type n = matched ? ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)this->first, (BidiIterator)this->second) : 0;
return n;
}
std::basic_string<value_type> str()const
@@ -73,7 +73,7 @@ struct sub_match : public std::pair<BidiIterator, BidiIterator>
std::basic_string<value_type> result;
if(matched)
{
- std::size_t len = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);
+ std::size_t len = ::boost::BOOST_REGEX_DETAIL_NS::distance((BidiIterator)this->first, (BidiIterator)this->second);
result.reserve(len);
BidiIterator i = this->first;
while(i != this->second)
@@ -162,6 +162,11 @@ public:
#endif
return *this;
}
+ //
+ // Make this type a range, for both Boost.Range, and C++11:
+ //
+ BidiIterator begin()const { return this->first; }
+ BidiIterator end()const { return this->second; }
#ifdef BOOST_OLD_REGEX_H
@@ -190,235 +195,235 @@ typedef sub_match<std::wstring::const_iterator> wssub_match;
// comparison to std::basic_string<> part 1:
template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator == (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline bool operator == (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{ return s.compare(m.str()) == 0; }
template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator != (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline bool operator != (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{ return s.compare(m.str()) != 0; }
template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator < (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline bool operator < (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{ return s.compare(m.str()) < 0; }
template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator <= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline bool operator <= (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{ return s.compare(m.str()) <= 0; }
template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator >= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline bool operator >= (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{ return s.compare(m.str()) >= 0; }
template <class RandomAccessIterator, class traits, class Allocator>
-inline bool operator > (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline bool operator > (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{ return s.compare(m.str()) > 0; }
// comparison to std::basic_string<> part 2:
template <class RandomAccessIterator, class traits, class Allocator>
inline bool operator == (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{ return m.str().compare(s) == 0; }
template <class RandomAccessIterator, class traits, class Allocator>
inline bool operator != (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{ return m.str().compare(s) != 0; }
template <class RandomAccessIterator, class traits, class Allocator>
inline bool operator < (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{ return m.str().compare(s) < 0; }
template <class RandomAccessIterator, class traits, class Allocator>
inline bool operator > (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{ return m.str().compare(s) > 0; }
template <class RandomAccessIterator, class traits, class Allocator>
inline bool operator <= (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{ return m.str().compare(s) <= 0; }
template <class RandomAccessIterator, class traits, class Allocator>
inline bool operator >= (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{ return m.str().compare(s) >= 0; }
// comparison to const charT* part 1:
template <class RandomAccessIterator>
inline bool operator == (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
{ return m.str().compare(s) == 0; }
template <class RandomAccessIterator>
inline bool operator != (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
{ return m.str().compare(s) != 0; }
template <class RandomAccessIterator>
inline bool operator > (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
{ return m.str().compare(s) > 0; }
template <class RandomAccessIterator>
inline bool operator < (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
{ return m.str().compare(s) < 0; }
template <class RandomAccessIterator>
inline bool operator >= (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
{ return m.str().compare(s) >= 0; }
template <class RandomAccessIterator>
inline bool operator <= (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
{ return m.str().compare(s) <= 0; }
// comparison to const charT* part 2:
template <class RandomAccessIterator>
-inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline bool operator == (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(s) == 0; }
template <class RandomAccessIterator>
-inline bool operator != (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline bool operator != (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(s) != 0; }
template <class RandomAccessIterator>
-inline bool operator < (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline bool operator < (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(s) > 0; }
template <class RandomAccessIterator>
-inline bool operator > (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline bool operator > (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(s) < 0; }
template <class RandomAccessIterator>
-inline bool operator <= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline bool operator <= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(s) >= 0; }
template <class RandomAccessIterator>
-inline bool operator >= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline bool operator >= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(s) <= 0; }
// comparison to const charT& part 1:
template <class RandomAccessIterator>
inline bool operator == (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{ return m.str().compare(0, m.length(), &s, 1) == 0; }
template <class RandomAccessIterator>
inline bool operator != (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{ return m.str().compare(0, m.length(), &s, 1) != 0; }
template <class RandomAccessIterator>
inline bool operator > (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{ return m.str().compare(0, m.length(), &s, 1) > 0; }
template <class RandomAccessIterator>
inline bool operator < (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{ return m.str().compare(0, m.length(), &s, 1) < 0; }
template <class RandomAccessIterator>
inline bool operator >= (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{ return m.str().compare(0, m.length(), &s, 1) >= 0; }
template <class RandomAccessIterator>
inline bool operator <= (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{ return m.str().compare(0, m.length(), &s, 1) <= 0; }
// comparison to const charT* part 2:
template <class RandomAccessIterator>
-inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline bool operator == (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(0, m.length(), &s, 1) == 0; }
template <class RandomAccessIterator>
-inline bool operator != (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline bool operator != (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(0, m.length(), &s, 1) != 0; }
template <class RandomAccessIterator>
-inline bool operator < (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline bool operator < (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(0, m.length(), &s, 1) > 0; }
template <class RandomAccessIterator>
-inline bool operator > (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline bool operator > (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(0, m.length(), &s, 1) < 0; }
template <class RandomAccessIterator>
-inline bool operator <= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline bool operator <= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(0, m.length(), &s, 1) >= 0; }
template <class RandomAccessIterator>
-inline bool operator >= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline bool operator >= (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{ return m.str().compare(0, m.length(), &s, 1) <= 0; }
// addition operators:
template <class RandomAccessIterator, class traits, class Allocator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
-operator + (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
+operator + (const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
const sub_match<RandomAccessIterator>& m)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
result.reserve(s.size() + m.length() + 1);
return result.append(s).append(m.first, m.second);
}
template <class RandomAccessIterator, class traits, class Allocator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>
operator + (const sub_match<RandomAccessIterator>& m,
- const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+ const std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
result.reserve(s.size() + m.length() + 1);
return result.append(m.first, m.second).append(s);
}
#if !(defined(__GNUC__) && defined(BOOST_NO_STD_LOCALE))
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
+operator + (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(std::char_traits<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+ result.reserve(std::char_traits<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
return result.append(s).append(m.first, m.second);
}
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
operator + (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
- result.reserve(std::char_traits<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+ result.reserve(std::char_traits<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
return result.append(m.first, m.second).append(s);
}
#else
// worwaround versions:
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
+operator + (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
const sub_match<RandomAccessIterator>& m)
{
return s + m.str();
}
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
operator + (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
{
return m.str() + s;
}
#endif
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
-operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
+operator + (typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
const sub_match<RandomAccessIterator>& m)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
result.reserve(m.length() + 2);
return result.append(1, s).append(m.first, m.second);
}
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
operator + (const sub_match<RandomAccessIterator>& m,
- typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
result.reserve(m.length() + 2);
return result.append(m.first, m.second).append(1, s);
}
template <class RandomAccessIterator>
-inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>
+inline std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type>
operator + (const sub_match<RandomAccessIterator>& m1,
const sub_match<RandomAccessIterator>& m2)
{
- std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+ std::basic_string<typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<RandomAccessIterator>::value_type> result;
result.reserve(m1.length() + m2.length() + 1);
return result.append(m1.first, m1.second).append(m2.first, m2.second);
}
@@ -440,7 +445,7 @@ std::ostream& operator << (std::ostream& os,
#endif
#ifdef BOOST_OLD_REGEX_H
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
template <class BidiIterator, class charT>
int do_toi(BidiIterator i, BidiIterator j, char c, int radix)
{
@@ -479,7 +484,7 @@ sub_match<BidiIterator>::operator int()const
neg = -1;
++i;
}
- neg *= re_detail::do_toi(i, j, *i);
+ neg *= BOOST_REGEX_DETAIL_NS::do_toi(i, j, *i);
if(i != j)raise_regex_exception("Bad sub-expression");
return neg;
}
@@ -490,7 +495,7 @@ sub_match<BidiIterator>::operator unsigned int()const
BidiIterator j = second;
if(i == j)
raise_regex_exception("Bad sub-expression");
- return re_detail::do_toi(i, j, *first);
+ return BOOST_REGEX_DETAIL_NS::do_toi(i, j, *first);
}
#endif
diff --git a/boost/regex/v4/u32regex_iterator.hpp b/boost/regex/v4/u32regex_iterator.hpp
index 65ebd7f8ea..701ef3d80e 100644
--- a/boost/regex/v4/u32regex_iterator.hpp
+++ b/boost/regex/v4/u32regex_iterator.hpp
@@ -76,7 +76,7 @@ class u32regex_iterator
: public std::iterator<
std::forward_iterator_tag,
match_results<BidirectionalIterator>,
- typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type,
const match_results<BidirectionalIterator>*,
const match_results<BidirectionalIterator>& >
#endif
@@ -87,7 +87,7 @@ private:
public:
typedef u32regex regex_type;
typedef match_results<BidirectionalIterator> value_type;
- typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
difference_type;
typedef const value_type* pointer;
typedef const value_type& reference;
diff --git a/boost/regex/v4/u32regex_token_iterator.hpp b/boost/regex/v4/u32regex_token_iterator.hpp
index e8649f323d..9eabbe48a1 100644
--- a/boost/regex/v4/u32regex_token_iterator.hpp
+++ b/boost/regex/v4/u32regex_token_iterator.hpp
@@ -159,7 +159,7 @@ class u32regex_token_iterator
: public std::iterator<
std::forward_iterator_tag,
sub_match<BidirectionalIterator>,
- typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+ typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type,
const sub_match<BidirectionalIterator>*,
const sub_match<BidirectionalIterator>& >
#endif
@@ -170,7 +170,7 @@ private:
public:
typedef u32regex regex_type;
typedef sub_match<BidirectionalIterator> value_type;
- typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type
+ typedef typename BOOST_REGEX_DETAIL_NS::regex_iterator_traits<BidirectionalIterator>::difference_type
difference_type;
typedef const value_type* pointer;
typedef const value_type& reference;
diff --git a/boost/regex/v4/w32_regex_traits.hpp b/boost/regex/v4/w32_regex_traits.hpp
index ef934b75cc..560cc217bb 100644
--- a/boost/regex/v4/w32_regex_traits.hpp
+++ b/boost/regex/v4/w32_regex_traits.hpp
@@ -19,6 +19,8 @@
#ifndef BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
#define BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
+#ifndef BOOST_REGEX_NO_WIN32_LOCALE
+
#ifndef BOOST_RE_PAT_EXCEPT_HPP
#include <boost/regex/pattern_except.hpp>
#endif
@@ -60,7 +62,7 @@ namespace boost{
template <class charT>
class w32_regex_traits;
-namespace re_detail{
+namespace BOOST_REGEX_DETAIL_NS{
//
// start by typedeffing the types we'll need:
@@ -164,19 +166,19 @@ public:
map_iterator_type i = m_char_map.find(c);
if(i == m_char_map.end())
{
- if(::boost::re_detail::w32_is_lower(c, this->m_locale)) return regex_constants::escape_type_class;
- if(::boost::re_detail::w32_is_upper(c, this->m_locale)) return regex_constants::escape_type_not_class;
+ if(::boost::BOOST_REGEX_DETAIL_NS::w32_is_lower(c, this->m_locale)) return regex_constants::escape_type_class;
+ if(::boost::BOOST_REGEX_DETAIL_NS::w32_is_upper(c, this->m_locale)) return regex_constants::escape_type_not_class;
return 0;
}
return i->second;
}
charT tolower(charT c)const
{
- return ::boost::re_detail::w32_tolower(c, this->m_locale);
+ return ::boost::BOOST_REGEX_DETAIL_NS::w32_tolower(c, this->m_locale);
}
bool isctype(boost::uint32_t mask, charT c)const
{
- return ::boost::re_detail::w32_is(this->m_locale, mask, c);
+ return ::boost::BOOST_REGEX_DETAIL_NS::w32_is(this->m_locale, mask, c);
}
private:
@@ -186,7 +188,7 @@ private:
};
template <class charT>
-w32_regex_traits_char_layer<charT>::w32_regex_traits_char_layer(::boost::re_detail::lcid_type l)
+w32_regex_traits_char_layer<charT>::w32_regex_traits_char_layer(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
: w32_regex_traits_base<charT>(l)
{
// we need to start by initialising our syntax map so we know which
@@ -195,12 +197,12 @@ w32_regex_traits_char_layer<charT>::w32_regex_traits_char_layer(::boost::re_deta
std::string cat_name(w32_regex_traits<charT>::get_catalog_name());
if(cat_name.size())
{
- cat = ::boost::re_detail::w32_cat_open(cat_name);
+ cat = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_open(cat_name);
if(!cat)
{
std::string m("Unable to open message catalog: ");
std::runtime_error err(m + cat_name);
- boost::re_detail::raise_runtime_error(err);
+ boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
}
}
//
@@ -210,7 +212,7 @@ w32_regex_traits_char_layer<charT>::w32_regex_traits_char_layer(::boost::re_deta
{
for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
{
- string_type mss = ::boost::re_detail::w32_cat_get(cat, this->m_locale, i, get_default_message(i));
+ string_type mss = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, i, get_default_message(i));
for(typename string_type::size_type j = 0; j < mss.size(); ++j)
{
this->m_char_map[mss[j]] = i;
@@ -253,7 +255,7 @@ class BOOST_REGEX_DECL w32_regex_traits_char_layer<char> : public w32_regex_trai
{
typedef std::string string_type;
public:
- w32_regex_traits_char_layer(::boost::re_detail::lcid_type l)
+ w32_regex_traits_char_layer(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
: w32_regex_traits_base<char>(l)
{
init();
@@ -300,7 +302,7 @@ public:
typedef std::basic_string<charT> string_type;
typedef charT char_type;
- w32_regex_traits_implementation(::boost::re_detail::lcid_type l);
+ w32_regex_traits_implementation(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l);
std::string error_string(regex_constants::error_type n) const
{
if(!m_error_strings.empty())
@@ -327,7 +329,7 @@ public:
string_type transform_primary(const charT* p1, const charT* p2) const;
string_type transform(const charT* p1, const charT* p2) const
{
- return ::boost::re_detail::w32_transform(this->m_locale, p1, p2);
+ return ::boost::BOOST_REGEX_DETAIL_NS::w32_transform(this->m_locale, p1, p2);
}
private:
std::map<int, std::string> m_error_strings; // error messages indexed by numberic ID
@@ -430,19 +432,19 @@ typename w32_regex_traits_implementation<charT>::string_type
}
template <class charT>
-w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost::re_detail::lcid_type l)
+w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
: w32_regex_traits_char_layer<charT>(l)
{
cat_type cat;
std::string cat_name(w32_regex_traits<charT>::get_catalog_name());
if(cat_name.size())
{
- cat = ::boost::re_detail::w32_cat_open(cat_name);
+ cat = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_open(cat_name);
if(!cat)
{
std::string m("Unable to open message catalog: ");
std::runtime_error err(m + cat_name);
- boost::re_detail::raise_runtime_error(err);
+ boost::BOOST_REGEX_DETAIL_NS::raise_runtime_error(err);
}
}
//
@@ -464,7 +466,7 @@ w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost:
default_message.append(1, static_cast<charT>(*p));
++p;
}
- string_type s = ::boost::re_detail::w32_cat_get(cat, this->m_locale, i+200, default_message);
+ string_type s = ::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, i+200, default_message);
std::string result;
for(std::string::size_type j = 0; j < s.size(); ++j)
{
@@ -495,7 +497,7 @@ w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost:
static const string_type null_string;
for(unsigned int j = 0; j <= 13; ++j)
{
- string_type s(::boost::re_detail::w32_cat_get(cat, this->m_locale, j+300, null_string));
+ string_type s(::boost::BOOST_REGEX_DETAIL_NS::w32_cat_get(cat, this->m_locale, j+300, null_string));
if(s.size())
this->m_custom_class_names[s] = masks[j];
}
@@ -503,7 +505,7 @@ w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost:
//
// get the collation format used by m_pcollate:
//
- m_collate_type = re_detail::find_sort_syntax(this, &m_collate_delim);
+ m_collate_type = BOOST_REGEX_DETAIL_NS::find_sort_syntax(this, &m_collate_delim);
}
template <class charT>
@@ -542,7 +544,7 @@ typename w32_regex_traits_implementation<charT>::char_class_type
if(pos != m_custom_class_names.end())
return pos->second;
}
- std::size_t state_id = 1 + re_detail::get_default_class_id(p1, p2);
+ std::size_t state_id = 1 + BOOST_REGEX_DETAIL_NS::get_default_class_id(p1, p2);
if(state_id < sizeof(masks) / sizeof(masks[0]))
return masks[state_id];
return masks[0];
@@ -550,13 +552,13 @@ typename w32_regex_traits_implementation<charT>::char_class_type
template <class charT>
-boost::shared_ptr<const w32_regex_traits_implementation<charT> > create_w32_regex_traits(::boost::re_detail::lcid_type l)
+boost::shared_ptr<const w32_regex_traits_implementation<charT> > create_w32_regex_traits(::boost::BOOST_REGEX_DETAIL_NS::lcid_type l)
{
// TODO: create a cache for previously constructed objects.
- return boost::object_cache< ::boost::re_detail::lcid_type, w32_regex_traits_implementation<charT> >::get(l, 5);
+ return boost::object_cache< ::boost::BOOST_REGEX_DETAIL_NS::lcid_type, w32_regex_traits_implementation<charT> >::get(l, 5);
}
-} // re_detail
+} // BOOST_REGEX_DETAIL_NS
template <class charT>
class w32_regex_traits
@@ -565,13 +567,13 @@ public:
typedef charT char_type;
typedef std::size_t size_type;
typedef std::basic_string<char_type> string_type;
- typedef ::boost::re_detail::lcid_type locale_type;
+ typedef ::boost::BOOST_REGEX_DETAIL_NS::lcid_type locale_type;
typedef boost::uint_least32_t char_class_type;
struct boost_extensions_tag{};
w32_regex_traits()
- : m_pimpl(re_detail::create_w32_regex_traits<charT>(::boost::re_detail::w32_get_default_locale()))
+ : m_pimpl(BOOST_REGEX_DETAIL_NS::create_w32_regex_traits<charT>(::boost::BOOST_REGEX_DETAIL_NS::w32_get_default_locale()))
{ }
static size_type length(const char_type* p)
{
@@ -603,11 +605,11 @@ public:
}
charT toupper(charT c) const
{
- return ::boost::re_detail::w32_toupper(c, this->m_pimpl->m_locale);
+ return ::boost::BOOST_REGEX_DETAIL_NS::w32_toupper(c, this->m_pimpl->m_locale);
}
string_type transform(const charT* p1, const charT* p2) const
{
- return ::boost::re_detail::w32_transform(this->m_pimpl->m_locale, p1, p2);
+ return ::boost::BOOST_REGEX_DETAIL_NS::w32_transform(this->m_pimpl->m_locale, p1, p2);
}
string_type transform_primary(const charT* p1, const charT* p2) const
{
@@ -623,34 +625,34 @@ public:
}
bool isctype(charT c, char_class_type f) const
{
- if((f & re_detail::w32_regex_traits_implementation<charT>::mask_base)
- && (this->m_pimpl->isctype(f & re_detail::w32_regex_traits_implementation<charT>::mask_base, c)))
+ if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_base)
+ && (this->m_pimpl->isctype(f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_base, c)))
return true;
- else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_unicode) && re_detail::is_extended(c))
+ else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_unicode) && BOOST_REGEX_DETAIL_NS::is_extended(c))
return true;
- else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_word) && (c == '_'))
+ else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_word) && (c == '_'))
return true;
- else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_vertical)
- && (::boost::re_detail::is_separator(c) || (c == '\v')))
+ else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_vertical)
+ && (::boost::BOOST_REGEX_DETAIL_NS::is_separator(c) || (c == '\v')))
return true;
- else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_horizontal)
- && this->isctype(c, 0x0008u) && !this->isctype(c, re_detail::w32_regex_traits_implementation<charT>::mask_vertical))
+ else if((f & BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_horizontal)
+ && this->isctype(c, 0x0008u) && !this->isctype(c, BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT>::mask_vertical))
return true;
return false;
}
int toi(const charT*& p1, const charT* p2, int radix)const
{
- return ::boost::re_detail::global_toi(p1, p2, radix, *this);
+ return ::boost::BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
}
int value(charT c, int radix)const
{
- int result = ::boost::re_detail::global_value(c);
+ int result = ::boost::BOOST_REGEX_DETAIL_NS::global_value(c);
return result < radix ? result : -1;
}
locale_type imbue(locale_type l)
{
- ::boost::re_detail::lcid_type result(getloc());
- m_pimpl = re_detail::create_w32_regex_traits<charT>(l);
+ ::boost::BOOST_REGEX_DETAIL_NS::lcid_type result(getloc());
+ m_pimpl = BOOST_REGEX_DETAIL_NS::create_w32_regex_traits<charT>(l);
return result;
}
locale_type getloc()const
@@ -670,7 +672,7 @@ public:
static std::string get_catalog_name();
private:
- boost::shared_ptr<const re_detail::w32_regex_traits_implementation<charT> > m_pimpl;
+ boost::shared_ptr<const BOOST_REGEX_DETAIL_NS::w32_regex_traits_implementation<charT> > m_pimpl;
//
// catalog name handler:
//
@@ -736,4 +738,6 @@ static_mutex& w32_regex_traits<charT>::get_mutex_inst()
#pragma warning(pop)
#endif
+#endif // BOOST_REGEX_NO_WIN32_LOCALE
+
#endif
diff --git a/boost/serialization/archive_input_unordered_map.hpp b/boost/serialization/archive_input_unordered_map.hpp
new file mode 100644
index 0000000000..7ea06e1a68
--- /dev/null
+++ b/boost/serialization/archive_input_unordered_map.hpp
@@ -0,0 +1,85 @@
+#ifndef BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_MAP_HPP
+#define BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/unordered_map.hpp:
+// serialization for stl unordered_map templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <boost/serialization/utility.hpp>
+
+namespace boost {
+namespace serialization {
+namespace stl {
+
+// map input
+template<class Archive, class Container>
+struct archive_input_unordered_map
+{
+ inline void operator()(
+ Archive &ar,
+ Container &s,
+ const unsigned int v
+ ){
+ typedef typename Container::value_type type;
+ detail::stack_construct<Archive, type> t(ar, v);
+ // borland fails silently w/o full namespace
+ ar >> boost::serialization::make_nvp("item", t.reference());
+ std::pair<typename Container::const_iterator, bool> result =
+ s.insert(t.reference());
+ // note: the following presumes that the map::value_type was NOT tracked
+ // in the archive. This is the usual case, but here there is no way
+ // to determine that.
+ if(result.second){
+ ar.reset_object_address(
+ & (result.first->second),
+ & t.reference().second
+ );
+ }
+ }
+};
+
+// multimap input
+template<class Archive, class Container>
+struct archive_input_unordered_multimap
+{
+ inline void operator()(
+ Archive &ar,
+ Container &s,
+ const unsigned int v
+ ){
+ typedef typename Container::value_type type;
+ detail::stack_construct<Archive, type> t(ar, v);
+ // borland fails silently w/o full namespace
+ ar >> boost::serialization::make_nvp("item", t.reference());
+ typename Container::const_iterator result
+ = s.insert(t.reference());
+ // note: the following presumes that the map::value_type was NOT tracked
+ // in the archive. This is the usual case, but here there is no way
+ // to determine that.
+ ar.reset_object_address(
+ & result->second,
+ & t.reference()
+ );
+ }
+};
+
+} // stl
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_MAP_HPP
diff --git a/boost/serialization/archive_input_unordered_set.hpp b/boost/serialization/archive_input_unordered_set.hpp
new file mode 100644
index 0000000000..353507e3a2
--- /dev/null
+++ b/boost/serialization/archive_input_unordered_set.hpp
@@ -0,0 +1,70 @@
+#ifndef BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_SET_HPP
+#define BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_SET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// archive_input_unordered_set.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+namespace boost {
+namespace serialization {
+
+namespace stl {
+
+// unordered_set input
+template<class Archive, class Container>
+struct archive_input_unordered_set
+{
+ inline void operator()(
+ Archive &ar,
+ Container &s,
+ const unsigned int v
+ ){
+ typedef typename Container::value_type type;
+ detail::stack_construct<Archive, type> t(ar, v);
+ // borland fails silently w/o full namespace
+ ar >> boost::serialization::make_nvp("item", t.reference());
+ std::pair<typename Container::const_iterator, bool> result =
+ s.insert(t.reference());
+ if(result.second)
+ ar.reset_object_address(& (* result.first), & t.reference());
+ }
+};
+
+// unordered_multiset input
+template<class Archive, class Container>
+struct archive_input_unordered_multiset
+{
+ inline void operator()(
+ Archive &ar,
+ Container &s,
+ const unsigned int v
+ ){
+ typedef typename Container::value_type type;
+ detail::stack_construct<Archive, type> t(ar, v);
+ // borland fails silently w/o full namespace
+ ar >> boost::serialization::make_nvp("item", t.reference());
+ typename Container::const_iterator result
+ = s.insert(t.reference());
+ ar.reset_object_address(& (* result), & t.reference());
+ }
+};
+
+} // stl
+} // serialization
+} // boost
+
+#endif // BOOST_SERIALIZATION_ARCHIVE_INPUT_UNORDERED_SET_HPP
diff --git a/boost/serialization/boost_unordered_map.hpp b/boost/serialization/boost_unordered_map.hpp
new file mode 100644
index 0000000000..8913b31f9e
--- /dev/null
+++ b/boost/serialization/boost_unordered_map.hpp
@@ -0,0 +1,154 @@
+#ifndef BOOST_SERIALIZATION_UNORDERED_MAP_HPP
+#define BOOST_SERIALIZATION_UNORDERED_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/unordered_map.hpp:
+// serialization for stl unordered_map templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <boost/unordered_map.hpp>
+
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/unordered_collections_save_imp.hpp>
+#include <boost/serialization/unordered_collections_load_imp.hpp>
+#include <boost/serialization/archive_input_unordered_map.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost {
+namespace serialization {
+
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void save(
+ Archive & ar,
+ const boost::unordered_map<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::save_unordered_collection<
+ Archive,
+ boost::unordered_map<Key, HashFcn, EqualKey, Allocator>
+ >(ar, t);
+}
+
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void load(
+ Archive & ar,
+ boost::unordered_map<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::load_unordered_collection<
+ Archive,
+ boost::unordered_map<Key, HashFcn, EqualKey, Allocator>,
+ boost::serialization::stl::archive_input_unordered_map<
+ Archive,
+ boost::unordered_map<Key, HashFcn, EqualKey, Allocator>
+ >
+ >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void serialize(
+ Archive & ar,
+ boost::unordered_map<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int file_version
+){
+ boost::serialization::split_free(ar, t, file_version);
+}
+
+// unordered_multimap
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void save(
+ Archive & ar,
+ const boost::unordered_multimap<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::save_unordered_collection<
+ Archive,
+ boost::unordered_multimap<Key, HashFcn, EqualKey, Allocator>
+ >(ar, t);
+}
+
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void load(
+ Archive & ar,
+ boost::unordered_multimap<
+ Key, HashFcn, EqualKey, Allocator
+ > &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::load_unordered_collection<
+ Archive,
+ boost::unordered_multimap<Key, HashFcn, EqualKey, Allocator>,
+ boost::serialization::stl::archive_input_unordered_multimap<
+ Archive,
+ boost::unordered_multimap<Key, HashFcn, EqualKey, Allocator>
+ >
+ >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void serialize(
+ Archive & ar,
+ boost::unordered_multimap<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int file_version
+){
+ boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_UNORDERED_MAP_HPP
diff --git a/boost/serialization/boost_unordered_set.hpp b/boost/serialization/boost_unordered_set.hpp
new file mode 100644
index 0000000000..307c7819cb
--- /dev/null
+++ b/boost/serialization/boost_unordered_set.hpp
@@ -0,0 +1,150 @@
+#ifndef BOOST_SERIALIZATION_BOOST_UNORDERED_SET_HPP
+#define BOOST_SERIALIZATION_BOOST_UNORDERED_SET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// unordered_set.hpp: serialization for boost unordered_set templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// (C) Copyright 2014 Jim Bell
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <boost/unordered_set.hpp>
+
+#include <boost/serialization/unordered_collections_save_imp.hpp>
+#include <boost/serialization/unordered_collections_load_imp.hpp>
+#include <boost/serialization/archive_input_unordered_set.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost {
+namespace serialization {
+
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void save(
+ Archive & ar,
+ const boost::unordered_set<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::save_unordered_collection<
+ Archive,
+ boost::unordered_set<Key, HashFcn, EqualKey, Allocator>
+ >(ar, t);
+}
+
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void load(
+ Archive & ar,
+ boost::unordered_set<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::load_unordered_collection<
+ Archive,
+ boost::unordered_set<Key, HashFcn, EqualKey, Allocator>,
+ boost::serialization::stl::archive_input_unordered_set<
+ Archive,
+ boost::unordered_set<Key, HashFcn, EqualKey, Allocator>
+ >
+ >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void serialize(
+ Archive & ar,
+ boost::unordered_set<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int file_version
+){
+ boost::serialization::split_free(ar, t, file_version);
+}
+
+// unordered_multiset
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void save(
+ Archive & ar,
+ const boost::unordered_multiset<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::save_unordered_collection<
+ Archive,
+ boost::unordered_multiset<Key, HashFcn, EqualKey, Allocator>
+ >(ar, t);
+}
+
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void load(
+ Archive & ar,
+ boost::unordered_multiset<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int /*file_version*/
+){
+ boost::serialization::stl::load_unordered_collection<
+ Archive,
+ boost::unordered_multiset<Key, HashFcn, EqualKey, Allocator>,
+ boost::serialization::stl::archive_input_unordered_multiset<
+ Archive,
+ boost::unordered_multiset<Key, HashFcn, EqualKey, Allocator>
+ >
+ >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+ class Archive,
+ class Key,
+ class HashFcn,
+ class EqualKey,
+ class Allocator
+>
+inline void serialize(
+ Archive & ar,
+ boost::unordered_multiset<Key, HashFcn, EqualKey, Allocator> &t,
+ const unsigned int file_version
+){
+ boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_BOOST_UNORDERED_SET_HPP
diff --git a/boost/serialization/collections_load_imp.hpp b/boost/serialization/collections_load_imp.hpp
index 246b64ed65..93d64d72b9 100644
--- a/boost/serialization/collections_load_imp.hpp
+++ b/boost/serialization/collections_load_imp.hpp
@@ -63,7 +63,7 @@ collection_load_impl(
Archive & ar,
T & t,
collection_size_type count,
- item_version_type item_version
+ item_version_type
){
t.resize(count);
typename T::iterator hint;
diff --git a/boost/serialization/deque.hpp b/boost/serialization/deque.hpp
index f4b58c325f..4d0a21f55c 100644
--- a/boost/serialization/deque.hpp
+++ b/boost/serialization/deque.hpp
@@ -20,6 +20,8 @@
#include <boost/config.hpp>
+#include <boost/archive/basic_archive.hpp>
+
#include <boost/serialization/collections_save_imp.hpp>
#include <boost/serialization/collections_load_imp.hpp>
#include <boost/serialization/detail/stack_constructor.hpp>
diff --git a/boost/serialization/detail/get_data.hpp b/boost/serialization/detail/get_data.hpp
index da8921355f..37da7fc3c4 100644
--- a/boost/serialization/detail/get_data.hpp
+++ b/boost/serialization/detail/get_data.hpp
@@ -54,8 +54,6 @@ const T* get_data(STD::valarray<T> const& v)
} // serialization
} // boost
-#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
#undef STD
-#endif
#endif // BOOST_SERIALIZATION_DETAIL_GET_DATA_HPP
diff --git a/boost/serialization/extended_type_info.hpp b/boost/serialization/extended_type_info.hpp
index c96a576e60..bb2a190d46 100644
--- a/boost/serialization/extended_type_info.hpp
+++ b/boost/serialization/extended_type_info.hpp
@@ -65,11 +65,7 @@ protected:
const unsigned int type_info_key,
const char * key
);
- // account for bogus gcc warning
- #if defined(__GNUC__)
- virtual
- #endif
- BOOST_SERIALIZATION_DECL ~extended_type_info();
+ virtual BOOST_SERIALIZATION_DECL ~extended_type_info();
public:
const char * get_key() const {
return m_key;
diff --git a/boost/serialization/extended_type_info_typeid.hpp b/boost/serialization/extended_type_info_typeid.hpp
index d9e99e03c8..8ee591b316 100644
--- a/boost/serialization/extended_type_info_typeid.hpp
+++ b/boost/serialization/extended_type_info_typeid.hpp
@@ -84,7 +84,9 @@ class extended_type_info_typeid :
{
public:
extended_type_info_typeid() :
- typeid_system::extended_type_info_typeid_0(get_key())
+ typeid_system::extended_type_info_typeid_0(
+ boost::serialization::guid< T >()
+ )
{
type_register(typeid(T));
key_register();
diff --git a/boost/serialization/singleton.hpp b/boost/serialization/singleton.hpp
index a397da5771..db32395ce2 100644
--- a/boost/serialization/singleton.hpp
+++ b/boost/serialization/singleton.hpp
@@ -123,13 +123,13 @@ class singleton : public singleton_module
private:
BOOST_DLLEXPORT static T & instance;
// include this to provoke instantiation at pre-execution time
- static void use(T const &) {}
+ static void use(T const *) {}
BOOST_DLLEXPORT static T & get_instance() {
static detail::singleton_wrapper< T > t;
// refer to instance, causing it to be instantiated (and
// initialized at startup on working compilers)
BOOST_ASSERT(! detail::singleton_wrapper< T >::m_is_destroyed);
- use(instance);
+ use(& instance);
return static_cast<T &>(t);
}
public:
diff --git a/boost/serialization/static_warning.hpp b/boost/serialization/static_warning.hpp
index cbbcb826cb..2d49de1c2d 100644
--- a/boost/serialization/static_warning.hpp
+++ b/boost/serialization/static_warning.hpp
@@ -96,7 +96,7 @@ struct BOOST_SERIALIZATION_SS {};
#define BOOST_SERIALIZATION_BSW(B, L) \
typedef boost::serialization::BOOST_SERIALIZATION_SS< \
sizeof( boost::serialization::static_warning_test< B, L > ) \
- > BOOST_JOIN(STATIC_WARNING_LINE, L) BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE;
+ > BOOST_JOIN(STATIC_WARNING_LINE, L) BOOST_ATTRIBUTE_UNUSED;
#define BOOST_STATIC_WARNING(B) BOOST_SERIALIZATION_BSW(B, __LINE__)
#endif // BOOST_SERIALIZATION_STATIC_WARNING_HPP
diff --git a/boost/serialization/unordered_map.hpp b/boost/serialization/unordered_map.hpp
index f3959104d9..4fdbddd7b6 100644
--- a/boost/serialization/unordered_map.hpp
+++ b/boost/serialization/unordered_map.hpp
@@ -25,67 +25,12 @@
#include <boost/serialization/utility.hpp>
#include <boost/serialization/unordered_collections_save_imp.hpp>
#include <boost/serialization/unordered_collections_load_imp.hpp>
+#include <boost/serialization/archive_input_unordered_map.hpp>
#include <boost/serialization/split_free.hpp>
namespace boost {
namespace serialization {
-namespace stl {
-
-// map input
-template<class Archive, class Container>
-struct archive_input_unordered_map
-{
- inline void operator()(
- Archive &ar,
- Container &s,
- const unsigned int v
- ){
- typedef typename Container::value_type type;
- detail::stack_construct<Archive, type> t(ar, v);
- // borland fails silently w/o full namespace
- ar >> boost::serialization::make_nvp("item", t.reference());
- std::pair<typename Container::const_iterator, bool> result =
- s.insert(t.reference());
- // note: the following presumes that the map::value_type was NOT tracked
- // in the archive. This is the usual case, but here there is no way
- // to determine that.
- if(result.second){
- ar.reset_object_address(
- & (result.first->second),
- & t.reference().second
- );
- }
- }
-};
-
-// multimap input
-template<class Archive, class Container>
-struct archive_input_unordered_multimap
-{
- inline void operator()(
- Archive &ar,
- Container &s,
- const unsigned int v
- ){
- typedef typename Container::value_type type;
- detail::stack_construct<Archive, type> t(ar, v);
- // borland fails silently w/o full namespace
- ar >> boost::serialization::make_nvp("item", t.reference());
- typename Container::const_iterator result
- = s.insert(t.reference());
- // note: the following presumes that the map::value_type was NOT tracked
- // in the archive. This is the usual case, but here there is no way
- // to determine that.
- ar.reset_object_address(
- & result->second,
- & t.reference()
- );
- }
-};
-
-} // stl
-
template<
class Archive,
class Key,
@@ -95,16 +40,12 @@ template<
>
inline void save(
Archive & ar,
- const std::unordered_map<
- Key, HashFcn, EqualKey, Allocator
- > &t,
+ const std::unordered_map<Key, HashFcn, EqualKey, Allocator> &t,
const unsigned int /*file_version*/
){
boost::serialization::stl::save_unordered_collection<
Archive,
- std::unordered_map<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_map<Key, HashFcn, EqualKey, Allocator>
>(ar, t);
}
@@ -117,21 +58,15 @@ template<
>
inline void load(
Archive & ar,
- std::unordered_map<
- Key, HashFcn, EqualKey, Allocator
- > &t,
+ std::unordered_map<Key, HashFcn, EqualKey, Allocator> &t,
const unsigned int /*file_version*/
){
boost::serialization::stl::load_unordered_collection<
Archive,
- std::unordered_map<
- Key, HashFcn, EqualKey, Allocator
- >,
+ std::unordered_map<Key, HashFcn, EqualKey, Allocator>,
boost::serialization::stl::archive_input_unordered_map<
Archive,
- std::unordered_map<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_map<Key, HashFcn, EqualKey, Allocator>
>
>(ar, t);
}
@@ -147,9 +82,7 @@ template<
>
inline void serialize(
Archive & ar,
- std::unordered_map<
- Key, HashFcn, EqualKey, Allocator
- > &t,
+ std::unordered_map<Key, HashFcn, EqualKey, Allocator> &t,
const unsigned int file_version
){
boost::serialization::split_free(ar, t, file_version);
@@ -172,9 +105,7 @@ inline void save(
){
boost::serialization::stl::save_unordered_collection<
Archive,
- std::unordered_multimap<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_multimap<Key, HashFcn, EqualKey, Allocator>
>(ar, t);
}
@@ -199,9 +130,7 @@ inline void load(
>,
boost::serialization::stl::archive_input_unordered_multimap<
Archive,
- std::unordered_multimap<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_multimap<Key, HashFcn, EqualKey, Allocator>
>
>(ar, t);
}
diff --git a/boost/serialization/unordered_set.hpp b/boost/serialization/unordered_set.hpp
index 535194fb72..adfee609cb 100644
--- a/boost/serialization/unordered_set.hpp
+++ b/boost/serialization/unordered_set.hpp
@@ -23,54 +23,12 @@
#include <boost/serialization/unordered_collections_save_imp.hpp>
#include <boost/serialization/unordered_collections_load_imp.hpp>
+#include <boost/serialization/archive_input_unordered_set.hpp>
#include <boost/serialization/split_free.hpp>
namespace boost {
namespace serialization {
-namespace stl {
-
-// unordered_set input
-template<class Archive, class Container>
-struct archive_input_unordered_set
-{
- inline void operator()(
- Archive &ar,
- Container &s,
- const unsigned int v
- ){
- typedef typename Container::value_type type;
- detail::stack_construct<Archive, type> t(ar, v);
- // borland fails silently w/o full namespace
- ar >> boost::serialization::make_nvp("item", t.reference());
- std::pair<typename Container::const_iterator, bool> result =
- s.insert(t.reference());
- if(result.second)
- ar.reset_object_address(& (* result.first), & t.reference());
- }
-};
-
-// unordered_multiset input
-template<class Archive, class Container>
-struct archive_input_unordered_multiset
-{
- inline void operator()(
- Archive &ar,
- Container &s,
- const unsigned int v
- ){
- typedef typename Container::value_type type;
- detail::stack_construct<Archive, type> t(ar, v);
- // borland fails silently w/o full namespace
- ar >> boost::serialization::make_nvp("item", t.reference());
- typename Container::const_iterator result
- = s.insert(t.reference());
- ar.reset_object_address(& (* result), & t.reference());
- }
-};
-
-} // stl
-
template<
class Archive,
class Key,
@@ -87,9 +45,7 @@ inline void save(
){
boost::serialization::stl::save_unordered_collection<
Archive,
- std::unordered_set<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_set<Key, HashFcn, EqualKey, Allocator>
>(ar, t);
}
@@ -109,10 +65,8 @@ inline void load(
){
boost::serialization::stl::load_unordered_collection<
Archive,
- std::unordered_set<
- Key, HashFcn, EqualKey, Allocator
- >,
- boost::serialization::stl::archive_input_unordered_set<
+ std::unordered_set<Key, HashFcn, EqualKey, Allocator>,
+ stl::archive_input_unordered_set<
Archive,
std::unordered_set<
Key, HashFcn, EqualKey, Allocator
@@ -137,7 +91,7 @@ inline void serialize(
> &t,
const unsigned int file_version
){
- boost::serialization::split_free(ar, t, file_version);
+ split_free(ar, t, file_version);
}
// unordered_multiset
@@ -155,11 +109,9 @@ inline void save(
> &t,
const unsigned int /*file_version*/
){
- boost::serialization::stl::save_unordered_collection<
+ stl::save_unordered_collection<
Archive,
- std::unordered_multiset<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_multiset<Key, HashFcn, EqualKey, Allocator>
>(ar, t);
}
@@ -179,14 +131,10 @@ inline void load(
){
boost::serialization::stl::load_unordered_collection<
Archive,
- std::unordered_multiset<
- Key, HashFcn, EqualKey, Allocator
- >,
+ std::unordered_multiset<Key, HashFcn, EqualKey, Allocator>,
boost::serialization::stl::archive_input_unordered_multiset<
Archive,
- std::unordered_multiset<
- Key, HashFcn, EqualKey, Allocator
- >
+ std::unordered_multiset<Key, HashFcn, EqualKey, Allocator>
>
>(ar, t);
}
@@ -202,9 +150,7 @@ template<
>
inline void serialize(
Archive & ar,
- std::unordered_multiset<
- Key, HashFcn, EqualKey, Allocator
- > &t,
+ std::unordered_multiset<Key, HashFcn, EqualKey, Allocator> &t,
const unsigned int file_version
){
boost::serialization::split_free(ar, t, file_version);
diff --git a/boost/serialization/variant.hpp b/boost/serialization/variant.hpp
index 70e395e211..dce6f3d49e 100644
--- a/boost/serialization/variant.hpp
+++ b/boost/serialization/variant.hpp
@@ -66,7 +66,6 @@ void save(
){
int which = v.which();
ar << BOOST_SERIALIZATION_NVP(which);
- typedef typename boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
variant_save_visitor<Archive> visitor(ar);
v.apply_visitor(visitor);
}
diff --git a/boost/signals2/detail/auto_buffer.hpp b/boost/signals2/detail/auto_buffer.hpp
index 8007b3c6b9..0970d3da90 100644
--- a/boost/signals2/detail/auto_buffer.hpp
+++ b/boost/signals2/detail/auto_buffer.hpp
@@ -98,7 +98,7 @@ namespace detail
}
template< class SizeType >
- static bool should_shrink( SizeType size, SizeType capacity )
+ static bool should_shrink( SizeType, SizeType )
{
//
// @remark: when defining a new grow policy, one might
@@ -257,7 +257,7 @@ namespace detail
auto_buffer_destroy( buffer );
}
- void destroy_back_n( size_type n, const boost::true_type& )
+ void destroy_back_n( size_type, const boost::true_type& )
{ }
void destroy_back_n( size_type n )
diff --git a/boost/signals2/detail/variadic_slot_invoker.hpp b/boost/signals2/detail/variadic_slot_invoker.hpp
index c115a63df5..ab1dfeea6c 100644
--- a/boost/signals2/detail/variadic_slot_invoker.hpp
+++ b/boost/signals2/detail/variadic_slot_invoker.hpp
@@ -30,6 +30,16 @@
#define BOOST_SIGNALS2_GET std::get
#endif
+// vc12 seems to erroneously report formal parameters as unreferenced (warning C4100)
+// if parameters of variadic template functions are only referenced by calling
+// other varadic template functions. silence these warnings:
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#if BOOST_MSVC >= 1800
+#pragma warning(disable:4100)
+#endif
+#endif
+
namespace boost
{
namespace signals2
@@ -130,4 +140,9 @@ namespace boost
} // namespace signals2
} // namespace boost
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+
#endif // BOOST_SIGNALS2_DETAIL_VARIADIC_SLOT_INVOKER_HPP
diff --git a/boost/signals2/postconstructible.hpp b/boost/signals2/postconstructible.hpp
index faa144446b..f6422302b1 100644
--- a/boost/signals2/postconstructible.hpp
+++ b/boost/signals2/postconstructible.hpp
@@ -37,7 +37,7 @@ namespace boost
public:
friend void detail::do_postconstruct(const postconstructible *ptr);
template<typename T>
- friend void adl_postconstruct(const shared_ptr<T> &sp, postconstructible *p)
+ friend void adl_postconstruct(const shared_ptr<T> &, postconstructible *p)
{
p->postconstruct();
}
diff --git a/boost/smart_ptr/detail/operator_bool.hpp b/boost/smart_ptr/detail/operator_bool.hpp
index 8ae1527e7c..c0289b870b 100644
--- a/boost/smart_ptr/detail/operator_bool.hpp
+++ b/boost/smart_ptr/detail/operator_bool.hpp
@@ -6,7 +6,8 @@
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
-#if !defined( BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS ) && !defined( BOOST_NO_CXX11_NULLPTR )
+#if !defined( BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS ) && !defined( BOOST_NO_CXX11_NULLPTR )\
+ && !(defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5130))
explicit operator bool () const BOOST_NOEXCEPT
{
diff --git a/boost/smart_ptr/detail/shared_count.hpp b/boost/smart_ptr/detail/shared_count.hpp
index cd07ed65fc..7996aa4325 100644
--- a/boost/smart_ptr/detail/shared_count.hpp
+++ b/boost/smart_ptr/detail/shared_count.hpp
@@ -28,6 +28,7 @@
#include <boost/smart_ptr/bad_weak_ptr.hpp>
#include <boost/smart_ptr/detail/sp_counted_base.hpp>
#include <boost/smart_ptr/detail/sp_counted_impl.hpp>
+#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
#include <boost/detail/workaround.hpp>
// In order to avoid circular dependencies with Boost.TR1
// we make sure that our include of <memory> doesn't try to
@@ -42,6 +43,11 @@
#include <boost/core/addressof.hpp>
+#if defined( BOOST_SP_DISABLE_DEPRECATED )
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
namespace boost
{
@@ -692,6 +698,10 @@ inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_(
} // namespace boost
+#if defined( BOOST_SP_DISABLE_DEPRECATED )
+#pragma GCC diagnostic pop
+#endif
+
#ifdef __BORLANDC__
# pragma warn .8027 // Functions containing try are not expanded inline
#endif
diff --git a/boost/smart_ptr/detail/sp_disable_deprecated.hpp b/boost/smart_ptr/detail/sp_disable_deprecated.hpp
new file mode 100644
index 0000000000..f79bdf38a8
--- /dev/null
+++ b/boost/smart_ptr/detail/sp_disable_deprecated.hpp
@@ -0,0 +1,40 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+// boost/smart_ptr/detail/sp_disable_deprecated.hpp
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/config.hpp>
+
+#if defined( __GNUC__ ) && ( defined( __GXX_EXPERIMENTAL_CXX0X__ ) || ( __cplusplus >= 201103L ) )
+
+# if defined( BOOST_GCC )
+
+# if BOOST_GCC >= 40600
+# define BOOST_SP_DISABLE_DEPRECATED
+# endif
+
+# elif defined( __clang__ ) && defined( __has_warning )
+
+# if __has_warning( "-Wdeprecated-declarations" )
+# define BOOST_SP_DISABLE_DEPRECATED
+# endif
+
+# endif
+
+#endif
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_DISABLE_DEPRECATED_HPP_INCLUDED
diff --git a/boost/smart_ptr/detail/sp_interlocked.hpp b/boost/smart_ptr/detail/sp_interlocked.hpp
index 814b0c2e93..79cae14a37 100644
--- a/boost/smart_ptr/detail/sp_interlocked.hpp
+++ b/boost/smart_ptr/detail/sp_interlocked.hpp
@@ -111,6 +111,17 @@ extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long
extern "C" long __cdecl _InterlockedExchange( long volatile *, long );
extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long );
+# if defined( BOOST_MSVC ) && BOOST_MSVC == 1310
+//From MSDN, Visual Studio .NET 2003 spedific: To declare one of the interlocked functions
+//for use as an intrinsic, the function must be declared with the leading underscore and
+//the new function must appear in a #pragma intrinsic statement.
+# pragma intrinsic( _InterlockedIncrement )
+# pragma intrinsic( _InterlockedDecrement )
+# pragma intrinsic( _InterlockedCompareExchange )
+# pragma intrinsic( _InterlockedExchange )
+# pragma intrinsic( _InterlockedExchangeAdd )
+# endif
+
#endif
# define BOOST_SP_INTERLOCKED_INCREMENT _InterlockedIncrement
diff --git a/boost/smart_ptr/detail/yield_k.hpp b/boost/smart_ptr/detail/yield_k.hpp
index 2dabc9f443..44d1836478 100644
--- a/boost/smart_ptr/detail/yield_k.hpp
+++ b/boost/smart_ptr/detail/yield_k.hpp
@@ -60,7 +60,16 @@ namespace detail
{
#if !defined( BOOST_USE_WINDOWS_H ) && !BOOST_PLAT_WINDOWS_RUNTIME
+#if !BOOST_COMP_CLANG || !defined __MINGW32__
extern "C" void __stdcall Sleep( unsigned long ms );
+#else
+#include <_mingw.h>
+#if !defined __MINGW64_VERSION_MAJOR
+ extern "C" void __stdcall Sleep( unsigned long ms );
+#else
+ extern "C" __declspec(dllimport) void __stdcall Sleep( unsigned long ms );
+#endif
+#endif
#endif
inline void yield( unsigned k )
diff --git a/boost/smart_ptr/scoped_ptr.hpp b/boost/smart_ptr/scoped_ptr.hpp
index be6722d5f5..d5d8720f52 100644
--- a/boost/smart_ptr/scoped_ptr.hpp
+++ b/boost/smart_ptr/scoped_ptr.hpp
@@ -15,12 +15,18 @@
#include <boost/assert.hpp>
#include <boost/checked_delete.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
+#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
#include <boost/detail/workaround.hpp>
#ifndef BOOST_NO_AUTO_PTR
# include <memory> // for std::auto_ptr
#endif
+#if defined( BOOST_SP_DISABLE_DEPRECATED )
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
namespace boost
{
@@ -154,4 +160,8 @@ template<class T> inline T * get_pointer(scoped_ptr<T> const & p) BOOST_NOEXCEPT
} // namespace boost
+#if defined( BOOST_SP_DISABLE_DEPRECATED )
+#pragma GCC diagnostic pop
+#endif
+
#endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
diff --git a/boost/smart_ptr/shared_ptr.hpp b/boost/smart_ptr/shared_ptr.hpp
index 991ca3dad3..47bc33d517 100644
--- a/boost/smart_ptr/shared_ptr.hpp
+++ b/boost/smart_ptr/shared_ptr.hpp
@@ -29,6 +29,7 @@
#include <boost/detail/workaround.hpp>
#include <boost/smart_ptr/detail/sp_convertible.hpp>
#include <boost/smart_ptr/detail/sp_nullptr_t.hpp>
+#include <boost/smart_ptr/detail/sp_disable_deprecated.hpp>
#if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
#include <boost/smart_ptr/detail/spinlock_pool.hpp>
@@ -47,6 +48,11 @@
#endif
#endif
+#if defined( BOOST_SP_DISABLE_DEPRECATED )
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#endif
+
namespace boost
{
@@ -1064,4 +1070,8 @@ template< class T > std::size_t hash_value( boost::shared_ptr<T> const & p ) BOO
} // namespace boost
+#if defined( BOOST_SP_DISABLE_DEPRECATED )
+#pragma GCC diagnostic pop
+#endif
+
#endif // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED
diff --git a/boost/sort/spreadsort/detail/float_sort.hpp b/boost/sort/spreadsort/detail/float_sort.hpp
index 8af8a174bd..03dcbaf4f6 100644
--- a/boost/sort/spreadsort/detail/float_sort.hpp
+++ b/boost/sort/spreadsort/detail/float_sort.hpp
@@ -56,12 +56,36 @@ namespace spreadsort {
Div_type & max, Div_type & min, Right_shift rshift)
{
min = max = rshift(*current, 0);
- Div_type prev = min;
+ RandomAccessIter prev = current;
bool sorted = true;
while (++current < last) {
Div_type value = rshift(*current, 0);
- sorted &= value >= prev;
- prev = value;
+ sorted &= *current >= *prev;
+ prev = current;
+ if (max < value)
+ max = value;
+ else if (value < min)
+ min = value;
+ }
+ return sorted;
+ }
+
+ // Return true if the list is sorted. Otherwise, find the minimum and
+ // maximum. Uses comp to check if the data is already sorted.
+ template <class RandomAccessIter, class Div_type, class Right_shift,
+ class Compare>
+ inline bool
+ is_sorted_or_find_extremes(RandomAccessIter current, RandomAccessIter last,
+ Div_type & max, Div_type & min,
+ Right_shift rshift, Compare comp)
+ {
+ min = max = rshift(*current, 0);
+ RandomAccessIter prev = current;
+ bool sorted = true;
+ while (++current < last) {
+ Div_type value = rshift(*current, 0);
+ sorted &= !comp(*current, *prev);
+ prev = current;
if (max < value)
max = value;
else if (value < min)
@@ -123,12 +147,12 @@ namespace spreadsort {
Cast_type & max, Cast_type & min)
{
min = max = cast_float_iter<Cast_type, RandomAccessIter>(current);
- Cast_type prev = min;
+ RandomAccessIter prev = current;
bool sorted = true;
while (++current < last) {
Cast_type value = cast_float_iter<Cast_type, RandomAccessIter>(current);
- sorted &= value >= prev;
- prev = value;
+ sorted &= *current >= *prev;
+ prev = current;
if (max < value)
max = value;
else if (value < min)
@@ -205,8 +229,9 @@ namespace spreadsort {
{
Div_type max, min;
if (is_sorted_or_find_extremes<RandomAccessIter, Div_type>(first, last,
- max, min))
+ max, min))
return;
+
unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
last - first, rough_log_2_size(Size_type(max - min)));
Div_type div_min = min >> log_divisor;
@@ -323,7 +348,7 @@ namespace spreadsort {
size_t *bin_sizes, Right_shift rshift, Compare comp)
{
Div_type max, min;
- if (is_sorted_or_find_extremes(first, last, max, min, rshift))
+ if (is_sorted_or_find_extremes(first, last, max, min, rshift, comp))
return;
unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
last - first, rough_log_2_size(Size_type(max - min)));
@@ -578,7 +603,7 @@ namespace spreadsort {
size_t *bin_sizes, Right_shift rshift, Compare comp)
{
Div_type max, min;
- if (is_sorted_or_find_extremes(first, last, max, min, rshift))
+ if (is_sorted_or_find_extremes(first, last, max, min, rshift, comp))
return;
unsigned log_divisor = get_log_divisor<float_log_mean_bin_size>(
last - first, rough_log_2_size(Size_type(max - min)));
@@ -679,7 +704,7 @@ namespace spreadsort {
void >::type
float_sort(RandomAccessIter first, RandomAccessIter last)
{
- size_t bin_sizes[1 << max_splits];
+ size_t bin_sizes[1 << max_finishing_splits];
std::vector<RandomAccessIter> bin_cache;
float_sort_rec<RandomAccessIter, boost::int32_t, boost::uint32_t>
(first, last, bin_cache, 0, bin_sizes);
@@ -694,7 +719,7 @@ namespace spreadsort {
void >::type
float_sort(RandomAccessIter first, RandomAccessIter last)
{
- size_t bin_sizes[1 << max_splits];
+ size_t bin_sizes[1 << max_finishing_splits];
std::vector<RandomAccessIter> bin_cache;
float_sort_rec<RandomAccessIter, boost::int64_t, boost::uint64_t>
(first, last, bin_cache, 0, bin_sizes);
@@ -727,7 +752,7 @@ namespace spreadsort {
float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
Right_shift rshift)
{
- size_t bin_sizes[1 << max_splits];
+ size_t bin_sizes[1 << max_finishing_splits];
std::vector<RandomAccessIter> bin_cache;
float_sort_rec<RandomAccessIter, Div_type, Right_shift, size_t>
(first, last, bin_cache, 0, bin_sizes, rshift);
@@ -740,7 +765,7 @@ namespace spreadsort {
float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
Right_shift rshift)
{
- size_t bin_sizes[1 << max_splits];
+ size_t bin_sizes[1 << max_finishing_splits];
std::vector<RandomAccessIter> bin_cache;
float_sort_rec<RandomAccessIter, Div_type, Right_shift, boost::uintmax_t>
(first, last, bin_cache, 0, bin_sizes, rshift);
@@ -765,7 +790,7 @@ namespace spreadsort {
float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
Right_shift rshift, Compare comp)
{
- size_t bin_sizes[1 << max_splits];
+ size_t bin_sizes[1 << max_finishing_splits];
std::vector<RandomAccessIter> bin_cache;
float_sort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
size_t>
@@ -780,7 +805,7 @@ namespace spreadsort {
float_sort(RandomAccessIter first, RandomAccessIter last, Div_type,
Right_shift rshift, Compare comp)
{
- size_t bin_sizes[1 << max_splits];
+ size_t bin_sizes[1 << max_finishing_splits];
std::vector<RandomAccessIter> bin_cache;
float_sort_rec<RandomAccessIter, Div_type, Right_shift, Compare,
boost::uintmax_t>
diff --git a/boost/sort/spreadsort/detail/string_sort.hpp b/boost/sort/spreadsort/detail/string_sort.hpp
index a5a40f056d..ef943b8ec4 100644
--- a/boost/sort/spreadsort/detail/string_sort.hpp
+++ b/boost/sort/spreadsort/detail/string_sort.hpp
@@ -42,7 +42,7 @@ namespace spreadsort {
{
const int char_size = sizeof(Unsigned_char_type);
size_t nextOffset = char_offset;
- int step_size = max_step_size;
+ int step_size = max_step_size / char_size;
while (true) {
RandomAccessIter curr = first;
do {
diff --git a/boost/sort/spreadsort/spreadsort.hpp b/boost/sort/spreadsort/spreadsort.hpp
index 678fba44f1..48377123e3 100644
--- a/boost/sort/spreadsort/spreadsort.hpp
+++ b/boost/sort/spreadsort/spreadsort.hpp
@@ -88,8 +88,8 @@ namespace spreadsort {
}
/*!
- \brief Generic @c spreadsort variant detecting string element type so call to @c string_sort for @c std::strings and @c std::wstrings.
- \details If the data type provided is a string or wstring, @c string_sort is used.
+ \brief Generic @c spreadsort variant detecting string element type so call to @c string_sort for @c std::strings.
+ \details If the data type provided is a string, @c string_sort is used.
\note Sorting other data types requires picking between @c integer_sort, @c float_sort and @c string_sort directly,
as @c spreadsort won't accept types that don't have the appropriate @c type_traits.
@@ -107,13 +107,38 @@ namespace spreadsort {
template <class RandomAccessIter>
inline typename boost::enable_if_c<
is_same<typename std::iterator_traits<RandomAccessIter>::value_type,
- typename std::string>::value ||
- is_same<typename std::iterator_traits<RandomAccessIter>::value_type,
- typename std::wstring>::value, void >::type
+ typename std::string>::value, void >::type
spreadsort(RandomAccessIter first, RandomAccessIter last)
{
string_sort(first, last);
}
+
+ /*!
+ \brief Generic @c spreadsort variant detecting string element type so call to @c string_sort for @c std::wstrings.
+ \details If the data type provided is a wstring, @c string_sort is used.
+ \note Sorting other data types requires picking between @c integer_sort, @c float_sort and @c string_sort directly,
+ as @c spreadsort won't accept types that don't have the appropriate @c type_traits. Also, 2-byte wide-characters are the limit above which string_sort is inefficient, so on platforms with wider characters, this will not accept wstrings.
+
+ \param[in] first Iterator pointer to first element.
+ \param[in] last Iterator pointing to one beyond the end of data.
+
+ \pre [@c first, @c last) is a valid range.
+ \pre @c RandomAccessIter @c value_type is mutable.
+ \pre @c RandomAccessIter @c value_type is <a href="http://en.cppreference.com/w/cpp/concept/LessThanComparable">LessThanComparable</a>
+ \pre @c RandomAccessIter @c value_type supports the @c operator>>,
+ which returns an integer-type right-shifted a specified number of bits.
+ \post The elements in the range [@c first, @c last) are sorted in ascending order.
+ */
+ template <class RandomAccessIter>
+ inline typename boost::enable_if_c<
+ is_same<typename std::iterator_traits<RandomAccessIter>::value_type,
+ typename std::wstring>::value &&
+ sizeof(wchar_t) == 2, void >::type
+ spreadsort(RandomAccessIter first, RandomAccessIter last)
+ {
+ boost::uint16_t unused = 0;
+ string_sort(first, last, unused);
+ }
} // namespace spreadsort
} // namespace sort
} // namespace boost
diff --git a/boost/spirit/home/classic/tree/parse_tree.hpp b/boost/spirit/home/classic/tree/parse_tree.hpp
index dcca9b3fb4..754d74a4aa 100644
--- a/boost/spirit/home/classic/tree/parse_tree.hpp
+++ b/boost/spirit/home/classic/tree/parse_tree.hpp
@@ -76,7 +76,6 @@ struct pt_tree_policy :
template<typename MatchAT, typename MatchBT>
static void concat(MatchAT& a, MatchBT const& b)
{
- typedef typename match_t::attr_t attr_t;
BOOST_SPIRIT_ASSERT(a && b);
std::copy(b.trees.begin(), b.trees.end(),
diff --git a/boost/spirit/home/karma/directive/duplicate.hpp b/boost/spirit/home/karma/directive/duplicate.hpp
index 8d9f3725a3..3a71592e4d 100644
--- a/boost/spirit/home/karma/directive/duplicate.hpp
+++ b/boost/spirit/home/karma/directive/duplicate.hpp
@@ -68,7 +68,7 @@ namespace boost { namespace spirit { namespace karma
template <typename T
, bool IsSequence = fusion::traits::is_sequence<T>::value>
struct first_attribute_of_subject
- : fusion::result_of::at_c<T, 0>
+ : remove_reference<typename fusion::result_of::at_c<T, 0>::type>
{};
template <typename T>
diff --git a/boost/spirit/home/karma/directive/left_alignment.hpp b/boost/spirit/home/karma/directive/left_alignment.hpp
index 40b5d24d9a..949255f1ce 100644
--- a/boost/spirit/home/karma/directive/left_alignment.hpp
+++ b/boost/spirit/home/karma/directive/left_alignment.hpp
@@ -275,10 +275,10 @@ namespace boost { namespace spirit { namespace karma
template <typename Terminal>
result_type operator()(Terminal const& term, Subject const& subject
- , unused_type) const
+ , Modifiers const& modifiers) const
{
return result_type(subject
- , compile<karma::domain>(fusion::at_c<1>(term.args))
+ , compile<karma::domain>(fusion::at_c<1>(term.args), modifiers)
, fusion::at_c<0>(term.args));
}
};
diff --git a/boost/spirit/home/karma/string/lit.hpp b/boost/spirit/home/karma/string/lit.hpp
index 0b9a6414ce..bd84bb848e 100644
--- a/boost/spirit/home/karma/string/lit.hpp
+++ b/boost/spirit/home/karma/string/lit.hpp
@@ -175,9 +175,6 @@ namespace boost { namespace spirit { namespace karma
// fail if attribute isn't matched by immediate literal
typedef typename attribute<Context>::type attribute_type;
- typedef typename spirit::result_of::extract_from<attribute_type, Attribute>::type
- extracted_string_type;
-
using spirit::traits::get_c_string;
if (!detail::string_compare(
get_c_string(
diff --git a/boost/spirit/home/qi/detail/assign_to.hpp b/boost/spirit/home/qi/detail/assign_to.hpp
index 38142bf1b3..7e5b162d06 100644
--- a/boost/spirit/home/qi/detail/assign_to.hpp
+++ b/boost/spirit/home/qi/detail/assign_to.hpp
@@ -18,6 +18,7 @@
#include <boost/spirit/home/qi/detail/attributes.hpp>
#include <boost/spirit/home/support/container.hpp>
#include <boost/fusion/include/copy.hpp>
+#include <boost/fusion/adapted/struct/detail/extension.hpp>
#include <boost/ref.hpp>
#include <boost/range/iterator_range.hpp>
@@ -203,6 +204,16 @@ namespace boost { namespace spirit { namespace traits
}
};
+ template <typename Attribute, int N, bool Const, typename T>
+ struct assign_to_attribute_from_value<fusion::extension::adt_attribute_proxy<Attribute, N, Const>, T>
+ {
+ static void
+ call(T const& val, typename fusion::extension::adt_attribute_proxy<Attribute, N, Const>& attr)
+ {
+ attr = val;
+ }
+ };
+
namespace detail
{
template <typename A, typename B>
diff --git a/boost/spirit/home/qi/detail/attributes.hpp b/boost/spirit/home/qi/detail/attributes.hpp
index 0a66a65586..6e8ce13f83 100644
--- a/boost/spirit/home/qi/detail/attributes.hpp
+++ b/boost/spirit/home/qi/detail/attributes.hpp
@@ -90,7 +90,7 @@ namespace boost { namespace spirit { namespace qi
static void post(boost::optional<Exposed>&, Transformed const&) {}
static void fail(boost::optional<Exposed>& val)
{
- val = none_t(); // leave optional uninitialized if rhs failed
+ val = none; // leave optional uninitialized if rhs failed
}
};
diff --git a/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp b/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp
index 7e96a3757f..ce9ad0f953 100644
--- a/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp
+++ b/boost/spirit/home/qi/numeric/detail/numeric_utils.hpp
@@ -31,6 +31,7 @@
#include <boost/mpl/bool.hpp>
#include <boost/mpl/and.hpp>
#include <boost/limits.hpp>
+#include <boost/integer_traits.hpp>
#if defined(BOOST_MSVC)
# pragma warning(push)
@@ -115,6 +116,12 @@ namespace boost { namespace spirit { namespace qi { namespace detail
return spirit::char_encoding::ascii::tolower(ch) - 'a' + 10;
}
};
+
+ template <typename T, T Val>
+ struct constexpr_int
+ {
+ BOOST_STATIC_CONSTEXPR T value = Val;
+ };
///////////////////////////////////////////////////////////////////////////
// positive_accumulator/negative_accumulator: Accumulator policies for
@@ -135,17 +142,17 @@ namespace boost { namespace spirit { namespace qi { namespace detail
inline static bool add(T& n, Char ch, mpl::true_) // checked add
{
// Ensure n *= Radix will not overflow
- static T const max = (std::numeric_limits<T>::max)();
- static T const val = max / Radix;
+ typedef constexpr_int<T, boost::integer_traits<T>::const_max> max;
+ typedef constexpr_int<T, max::value / Radix> val;
- if (n > val)
+ if (n > val::value)
return false;
n *= Radix;
// Ensure n += digit will not overflow
const int digit = radix_traits<Radix>::digit(ch);
- if (n > max - digit)
+ if (n > max::value - digit)
return false;
n += static_cast<T>(digit);
@@ -167,16 +174,17 @@ namespace boost { namespace spirit { namespace qi { namespace detail
inline static bool add(T& n, Char ch, mpl::true_) // checked subtract
{
// Ensure n *= Radix will not underflow
- static T const min = (std::numeric_limits<T>::min)();
- static T const val = (min + 1) / T(Radix);
- if (n < val)
+ typedef constexpr_int<T, boost::integer_traits<T>::const_min> min;
+ typedef constexpr_int<T, (min::value + 1) / T(Radix)> val;
+
+ if (n < val::value)
return false;
n *= Radix;
// Ensure n -= digit will not underflow
int const digit = radix_traits<Radix>::digit(ch);
- if (n < min + digit)
+ if (n < min::value + digit)
return false;
n -= static_cast<T>(digit);
@@ -194,10 +202,9 @@ namespace boost { namespace spirit { namespace qi { namespace detail
inline static bool
call(Char ch, std::size_t count, T& n, mpl::true_)
{
- static std::size_t const
- overflow_free = digits_traits<T, Radix>::value - 1;
+ typedef constexpr_int<std::size_t, digits_traits<T, Radix>::value - 1> overflow_free;
- if (!AlwaysCheckOverflow && (count < overflow_free))
+ if (!AlwaysCheckOverflow && (count < overflow_free::value))
{
Accumulator::add(n, ch, mpl::false_());
}
@@ -316,7 +323,7 @@ namespace boost { namespace spirit { namespace qi { namespace detail
if (!Accumulate)
{
// skip leading zeros
- while (it != last && *it == '0' && leading_zeros < MaxDigits)
+ while (it != last && *it == '0' && (MaxDigits < 0 || leading_zeros < static_cast< std::size_t >(MaxDigits)))
{
++it;
++leading_zeros;
diff --git a/boost/spirit/home/qi/numeric/detail/real_impl.hpp b/boost/spirit/home/qi/numeric/detail/real_impl.hpp
index cf92712a24..485df2727f 100644
--- a/boost/spirit/home/qi/numeric/detail/real_impl.hpp
+++ b/boost/spirit/home/qi/numeric/detail/real_impl.hpp
@@ -65,7 +65,7 @@ namespace boost { namespace spirit { namespace traits
{
if (exp >= 0)
{
- std::size_t max_exp = std::numeric_limits<T>::max_exponent10;
+ int max_exp = std::numeric_limits<T>::max_exponent10;
// return false if exp exceeds the max_exp
// do this check only for primitive types!
@@ -284,7 +284,7 @@ namespace boost { namespace spirit { namespace qi { namespace detail
// If there is no number, disregard the exponent altogether.
// by resetting 'first' prior to the exponent prefix (e|E)
first = e_pos;
- n = acc_n;
+ n = static_cast<T>(acc_n);
}
}
else if (frac_digits)
@@ -306,11 +306,11 @@ namespace boost { namespace spirit { namespace qi { namespace detail
return true; // got a NaN or Inf, return immediately
}
- n = acc_n;
+ n = static_cast<T>(acc_n);
}
else
{
- n = acc_n;
+ n = static_cast<T>(acc_n);
}
// If we got a negative sign, negate the number
diff --git a/boost/spirit/home/support/attributes.hpp b/boost/spirit/home/support/attributes.hpp
index 163f11cfe2..889e3a370b 100644
--- a/boost/spirit/home/support/attributes.hpp
+++ b/boost/spirit/home/support/attributes.hpp
@@ -1060,12 +1060,13 @@ namespace boost { namespace spirit { namespace traits
typedef T type;
};
+#if !defined(BOOST_FUSION_HAS_VARIADIC_VECTOR)
template <typename T>
struct strip_single_element_vector<fusion::vector1<T> >
{
typedef T type;
};
-
+#endif
template <typename T>
struct strip_single_element_vector<fusion::vector<T> >
{
@@ -1153,7 +1154,7 @@ namespace boost { namespace spirit { namespace traits
static void call(boost::optional<T>& val)
{
if (val)
- val = none_t(); // leave optional uninitialized
+ val = none; // leave optional uninitialized
}
};
diff --git a/boost/spirit/home/support/char_encoding/ascii.hpp b/boost/spirit/home/support/char_encoding/ascii.hpp
index 8bd6c11350..4e6aace036 100644
--- a/boost/spirit/home/support/char_encoding/ascii.hpp
+++ b/boost/spirit/home/support/char_encoding/ascii.hpp
@@ -167,6 +167,14 @@ namespace boost { namespace spirit { namespace char_encoding
/* } 125 7d */ BOOST_CC_PUNCT,
/* ~ 126 7e */ BOOST_CC_PUNCT,
/* DEL 127 7f */ BOOST_CC_CTRL,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
///////////////////////////////////////////////////////////////////////////
@@ -191,7 +199,7 @@ namespace boost { namespace spirit { namespace char_encoding
static bool
isalnum(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_ALPHA)
|| (ascii_char_types[ch] & BOOST_CC_DIGIT);
}
@@ -199,28 +207,28 @@ namespace boost { namespace spirit { namespace char_encoding
static bool
isalpha(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_ALPHA) ? true : false;
}
static bool
isdigit(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_DIGIT) ? true : false;
}
static bool
isxdigit(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_XDIGIT) ? true : false;
}
static bool
iscntrl(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_CTRL) ? true : false;
}
@@ -233,7 +241,7 @@ namespace boost { namespace spirit { namespace char_encoding
static bool
islower(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_LOWER) ? true : false;
}
@@ -246,14 +254,14 @@ namespace boost { namespace spirit { namespace char_encoding
static bool
ispunct(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_PUNCT) ? true : false;
}
static bool
isspace(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_SPACE) ? true : false;
}
@@ -266,7 +274,7 @@ namespace boost { namespace spirit { namespace char_encoding
static bool
isupper(int ch)
{
- BOOST_ASSERT(isascii_(ch));
+ BOOST_ASSERT(0 == (ch & ~UCHAR_MAX));
return (ascii_char_types[ch] & BOOST_CC_UPPER) ? true : false;
}
@@ -277,14 +285,12 @@ namespace boost { namespace spirit { namespace char_encoding
static int
tolower(int ch)
{
- BOOST_ASSERT(isascii_(ch));
return isupper(ch) ? (ch - 'A' + 'a') : ch;
}
static int
toupper(int ch)
{
- BOOST_ASSERT(isascii_(ch));
return islower(ch) ? (ch - 'a' + 'A') : ch;
}
@@ -310,4 +316,3 @@ namespace boost { namespace spirit { namespace char_encoding
#undef BOOST_CC_SPACE
#endif
-
diff --git a/boost/spirit/home/support/detail/endian/endian.hpp b/boost/spirit/home/support/detail/endian/endian.hpp
index c806b58473..ac1c13f86a 100644
--- a/boost/spirit/home/support/detail/endian/endian.hpp
+++ b/boost/spirit/home/support/detail/endian/endian.hpp
@@ -41,6 +41,7 @@
#undef BOOST_NO_IO_COVER_OPERATORS
#undef BOOST_MINIMAL_INTEGER_COVER_OPERATORS
#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
#include <boost/cstdint.hpp>
#include <boost/static_assert.hpp>
#include <boost/spirit/home/support/detail/scoped_enum_emulation.hpp>
@@ -70,9 +71,9 @@ namespace boost { namespace spirit
{
typedef unrolled_byte_loops<T, n_bytes - 1, sign> next;
- static T load_big(const unsigned char* bytes)
+ static typename boost::make_unsigned<T>::type load_big(const unsigned char* bytes)
{ return *(bytes - 1) | (next::load_big(bytes - 1) << 8); }
- static T load_little(const unsigned char* bytes)
+ static typename boost::make_unsigned<T>::type load_little(const unsigned char* bytes)
{ return *bytes | (next::load_little(bytes + 1) << 8); }
static void store_big(char* bytes, T value)
@@ -104,10 +105,10 @@ namespace boost { namespace spirit
template <typename T>
struct unrolled_byte_loops<T, 1, true>
{
- static T load_big(const unsigned char* bytes)
- { return *reinterpret_cast<const signed char*>(bytes - 1); }
- static T load_little(const unsigned char* bytes)
- { return *reinterpret_cast<const signed char*>(bytes); }
+ static typename boost::make_unsigned<T>::type load_big(const unsigned char* bytes)
+ { return *(bytes - 1); }
+ static typename boost::make_unsigned<T>::type load_little(const unsigned char* bytes)
+ { return *bytes; }
static void store_big(char* bytes, T value)
{ *(bytes - 1) = static_cast<char>(value); }
static void store_little(char* bytes, T value)
@@ -118,8 +119,8 @@ namespace boost { namespace spirit
inline
T load_big_endian(const void* bytes)
{
- return unrolled_byte_loops<T, n_bytes>::load_big
- (static_cast<const unsigned char*>(bytes) + n_bytes);
+ return static_cast<T>(unrolled_byte_loops<T, n_bytes>::load_big
+ (static_cast<const unsigned char*>(bytes) + n_bytes));
}
template <>
@@ -164,8 +165,8 @@ namespace boost { namespace spirit
inline
T load_little_endian(const void* bytes)
{
- return unrolled_byte_loops<T, n_bytes>::load_little
- (static_cast<const unsigned char*>(bytes));
+ return static_cast<T>(unrolled_byte_loops<T, n_bytes>::load_little
+ (static_cast<const unsigned char*>(bytes)));
}
template <>
diff --git a/boost/spirit/home/support/terminal.hpp b/boost/spirit/home/support/terminal.hpp
index 3ef8c83ae2..0497d5faf4 100644
--- a/boost/spirit/home/support/terminal.hpp
+++ b/boost/spirit/home/support/terminal.hpp
@@ -16,7 +16,6 @@
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
#include <boost/proto/proto.hpp>
-#include <boost/fusion/include/void.hpp>
#include <boost/spirit/home/support/meta_compiler.hpp>
#include <boost/spirit/home/support/detail/make_vector.hpp>
#include <boost/spirit/home/support/unused.hpp>
@@ -236,12 +235,9 @@ namespace boost { namespace spirit
: to_nonlazy_arg<A>
{};
+ // incomplete type: should not be appeared unused_type in nonlazy arg.
template <>
- struct to_nonlazy_arg<unused_type>
- {
- // unused arg: make_vector wants fusion::void_
- typedef fusion::void_ type;
- };
+ struct to_nonlazy_arg<unused_type>;
}
template <typename Terminal>
@@ -268,13 +264,45 @@ namespace boost { namespace spirit
template <
bool Lazy
, typename A0
- , typename A1
- , typename A2
+ , typename A1 = unused_type
+ , typename A2 = unused_type
>
struct result_helper;
template <
typename A0
+ >
+ struct result_helper<false, A0>
+ {
+ typedef typename
+ proto::terminal<
+ terminal_ex<
+ Terminal
+ , typename detail::result_of::make_vector<
+ typename detail::to_nonlazy_arg<A0>::type>::type>
+ >::type
+ type;
+ };
+
+ template <
+ typename A0
+ , typename A1
+ >
+ struct result_helper<false, A0, A1>
+ {
+ typedef typename
+ proto::terminal<
+ terminal_ex<
+ Terminal
+ , typename detail::result_of::make_vector<
+ typename detail::to_nonlazy_arg<A0>::type
+ , typename detail::to_nonlazy_arg<A1>::type>::type>
+ >::type
+ type;
+ };
+
+ template <
+ typename A0
, typename A1
, typename A2
>
diff --git a/boost/spirit/home/x3/char/char_set.hpp b/boost/spirit/home/x3/char/char_set.hpp
index 5a37ff6bea..3a8f986456 100644
--- a/boost/spirit/home/x3/char/char_set.hpp
+++ b/boost/spirit/home/x3/char/char_set.hpp
@@ -42,8 +42,8 @@ namespace boost { namespace spirit { namespace x3
char_type ch = char_type(ch_); // optimize for token based parsing
return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch_))
- && (get_case_compare<encoding>(context)(ch, from) > 0 )
- && (get_case_compare<encoding>(context)(ch , to) < 0 );
+ && (get_case_compare<encoding>(context)(ch, from) >= 0 )
+ && (get_case_compare<encoding>(context)(ch , to) <= 0 );
}
char_type from, to;
diff --git a/boost/static_assert.hpp b/boost/static_assert.hpp
index d083a9c37d..07d461d492 100644
--- a/boost/static_assert.hpp
+++ b/boost/static_assert.hpp
@@ -30,7 +30,7 @@
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)
# else
-# define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
+# define BOOST_STATIC_ASSERT_MSG( B, Msg ) static_assert( B, Msg )
# endif
#else
# define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
@@ -64,14 +64,6 @@
# define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
# endif
#endif
-//
-// If the compiler warns about unused typedefs then enable this:
-//
-#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
-# define BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE __attribute__((unused))
-#else
-# define BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
-#endif
#ifndef BOOST_NO_CXX11_STATIC_ASSERT
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
@@ -117,14 +109,7 @@ template<int x> struct static_assert_test{};
//
#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)
-#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
-// __LINE__ macro broken when -ZI is used see Q199057
-// fortunately MSVC ignores duplicate typedef's.
-#define BOOST_STATIC_ASSERT( B ) \
- typedef ::boost::static_assert_test<\
- sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >)\
- > boost_static_assert_typedef_
-#elif defined(BOOST_MSVC) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
+#if defined(BOOST_MSVC) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
#define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\
@@ -167,12 +152,12 @@ template<int x> struct static_assert_test{};
# define BOOST_STATIC_ASSERT( ... ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >)>\
- BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
+ BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
# else
# define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
- BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_STATIC_ASSERT_UNUSED_ATTRIBUTE
+ BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
# endif
#endif
diff --git a/boost/test/auto_unit_test.hpp b/boost/test/auto_unit_test.hpp
index df41743962..99acd162ab 100644
--- a/boost/test/auto_unit_test.hpp
+++ b/boost/test/auto_unit_test.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/data/config.hpp b/boost/test/data/config.hpp
index bedfae5de0..7a9d03be98 100644
--- a/boost/test/data/config.hpp
+++ b/boost/test/data/config.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -19,7 +19,6 @@
// STL
#include <stdexcept> // for std::logic_error
-
// availability on features: preprocessed by doxygen
#if defined(BOOST_NO_CXX11_HDR_RANDOM) || defined(BOOST_TEST_DOXYGEN_DOC__)
@@ -28,7 +27,6 @@
#endif
-
#if defined(BOOST_NO_CXX11_HDR_TUPLE) || defined(BOOST_TEST_DOXYGEN_DOC__)
//! Defined when grid composition of datasets is not available
@@ -41,8 +39,7 @@
//____________________________________________________________________________//
-#define BOOST_TEST_DS_ERROR( msg ) BOOST_TEST_IMPL_THROW( std::logic_error( msg ) )
-#define BOOST_TEST_DS_ASSERT( cond, msg ) if( cond ) {} else BOOST_TEST_DS_ERROR( msg )
+#define BOOST_TEST_DS_ERROR( msg ) BOOST_TEST_I_THROW( std::logic_error( msg ) )
+#define BOOST_TEST_DS_ASSERT( cond, msg ) BOOST_TEST_I_ASSRT( cond, std::logic_error( msg ) )
#endif // BOOST_TEST_DATA_CONFIG_HPP_112611GER
-
diff --git a/boost/test/data/dataset.hpp b/boost/test/data/dataset.hpp
index 390cf5bf3f..3f576ab357 100644
--- a/boost/test/data/dataset.hpp
+++ b/boost/test/data/dataset.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/data/for_each_sample.hpp b/boost/test/data/for_each_sample.hpp
new file mode 100644
index 0000000000..8bc1964311
--- /dev/null
+++ b/boost/test/data/for_each_sample.hpp
@@ -0,0 +1,71 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+/// @file
+/// Defines for_each_sample algorithm
+// ***************************************************************************
+
+#ifndef BOOST_TEST_DATA_FOR_EACH_SAMPLE_HPP_102211GER
+#define BOOST_TEST_DATA_FOR_EACH_SAMPLE_HPP_102211GER
+
+// Boost.Test
+#include <boost/test/data/config.hpp>
+#include <boost/test/data/traits.hpp>
+#include <boost/test/data/size.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+// needed for std::min
+#include <algorithm>
+
+//____________________________________________________________________________//
+
+namespace boost {
+namespace unit_test {
+namespace data {
+
+// ************************************************************************** //
+// ************** for_each_sample ************** //
+// ************************************************************************** //
+
+template<typename DataSet, typename Action>
+inline typename std::enable_if<monomorphic::is_dataset<DataSet>::value,void>::type
+for_each_sample( DataSet const& samples,
+ Action const& act,
+ data::size_t number_of_samples = BOOST_TEST_DS_INFINITE_SIZE )
+{
+ data::size_t size = (std::min)( samples.size(), number_of_samples );
+ BOOST_TEST_DS_ASSERT( !size.is_inf(), "Dataset has infinite size. Please specify the number of samples" );
+
+ auto it = samples.begin();
+
+ while( size-- > 0 ) {
+ data::traits<typename DataSet::sample>::invoke_action( *it, act );
+ ++it;
+ }
+}
+
+//____________________________________________________________________________//
+
+template<typename DataSet, typename Action>
+inline typename std::enable_if<!monomorphic::is_dataset<DataSet>::value,void>::type
+for_each_sample( DataSet const& samples,
+ Action const& act,
+ data::size_t number_of_samples = BOOST_TEST_DS_INFINITE_SIZE )
+{
+ data::for_each_sample( data::make( samples ), act, number_of_samples );
+}
+
+} // namespace data
+} // namespace unit_test
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_DATA_FOR_EACH_SAMPLE_HPP_102211GER
+
diff --git a/boost/test/data/generators.hpp b/boost/test/data/generators.hpp
index ff8ad07400..e9bd4c17b5 100644
--- a/boost/test/data/generators.hpp
+++ b/boost/test/data/generators.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/data/monomorphic.hpp b/boost/test/data/monomorphic.hpp
index 487b2a9cce..31d7b01b32 100644
--- a/boost/test/data/monomorphic.hpp
+++ b/boost/test/data/monomorphic.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -15,6 +15,7 @@
// Boost.Test
#include <boost/test/data/monomorphic/array.hpp>
#include <boost/test/data/monomorphic/collection.hpp>
+#include <boost/test/data/monomorphic/initializer_list.hpp>
#include <boost/test/data/monomorphic/generate.hpp>
#include <boost/test/data/monomorphic/generators.hpp>
#include <boost/test/data/monomorphic/grid.hpp>
diff --git a/boost/test/data/monomorphic/array.hpp b/boost/test/data/monomorphic/array.hpp
index 87c55e7653..6f7ed8eb3b 100644
--- a/boost/test/data/monomorphic/array.hpp
+++ b/boost/test/data/monomorphic/array.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -14,7 +14,7 @@
// Boost.Test
#include <boost/test/data/config.hpp>
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
@@ -29,41 +29,25 @@ namespace monomorphic {
// ************** array ************** //
// ************************************************************************** //
-/// Dataset view of an C array
+/// Dataset view of a C array
template<typename T>
-class array : public monomorphic::dataset<T> {
- typedef monomorphic::dataset<T> base;
- typedef typename base::iter_ptr iter_ptr;
-
- struct iterator : public base::iterator {
- // Constructor
- explicit iterator( T const* begin, data::size_t size )
- : m_it( begin )
- , m_singleton( size == 1 )
- {}
-
- // forward iterator interface
- virtual T const& operator*() { return *m_it; }
- virtual void operator++() { if( !m_singleton ) ++m_it; }
-
- private:
- // Data members
- T const* m_it;
- bool m_singleton;
- };
-
+class array {
public:
+ typedef T sample;
+
enum { arity = 1 };
+ typedef T const* iterator;
+
// Constructor
- array( T const* arr, std::size_t size )
- : m_arr( arr )
- , m_size( size )
+ array( T const* arr_, std::size_t size_ )
+ : m_arr( arr_ )
+ , m_size( size_ )
{}
// dataset interface
- virtual data::size_t size() const { return m_size; }
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( m_arr, m_size ); }
+ data::size_t size() const { return m_size; }
+ iterator begin() const { return m_arr; }
private:
// Data members
@@ -75,34 +59,20 @@ private:
//! An array dataset is a dataset
template<typename T>
-struct is_dataset<array<T> > : mpl::true_ {};
+struct is_dataset<array<T>> : mpl::true_ {};
} // namespace monomorphic
+//____________________________________________________________________________//
//! @overload boost::unit_test::data::make()
template<typename T, std::size_t size>
-inline monomorphic::array< typename boost::remove_const<T>::type > make( T (&a)[size] )
-{
- return monomorphic::array< typename boost::remove_const<T>::type >( a, size );
-}
-
-//! @overload boost::unit_test::data::make()
-template<typename T, std::size_t size>
-inline monomorphic::array< typename boost::remove_const<T>::type > make( T const (&a)[size] )
-{
- return monomorphic::array<T>( a, size );
-}
-
-template<typename T, std::size_t size>
-inline monomorphic::array< typename boost::remove_const<T>::type > make( T a[size] )
+inline monomorphic::array<typename boost::remove_const<T>::type>
+make( T (&a)[size] )
{
- return monomorphic::array<T>( a, size );
+ return monomorphic::array<typename boost::remove_const<T>::type>( a, size );
}
-
-//____________________________________________________________________________//
-
} // namespace data
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/data/monomorphic/collection.hpp b/boost/test/data/monomorphic/collection.hpp
index 5666a62f8d..49e81458bf 100644
--- a/boost/test/data/monomorphic/collection.hpp
+++ b/boost/test/data/monomorphic/collection.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -14,7 +14,7 @@
// Boost.Test
#include <boost/test/data/config.hpp>
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
@@ -35,54 +35,28 @@ namespace monomorphic {
//! This dataset is applicable to any container implementing a forward iterator. Note that
//! container with one element will be considered as singletons.
//! This dataset is constructible with the @ref boost::unit_test::data::make function.
-//!
-//! For compilers supporting r-value references, the collection is moved instead of copied.
template<typename C>
-class collection : public monomorphic::dataset<typename boost::decay<C>::type::value_type> {
+class collection {
typedef typename boost::decay<C>::type col_type;
- typedef typename col_type::value_type T;
- typedef monomorphic::dataset<T> base;
- typedef typename base::iter_ptr iter_ptr;
-
- struct iterator : public base::iterator {
- // Constructor
- explicit iterator( collection<C> const& owner )
- : m_iter( owner.col().begin() )
- , m_singleton( owner.col().size() == 1 )
- {}
-
- // forward iterator interface
- virtual T const& operator*() { return *m_iter; }
- virtual void operator++() { if( !m_singleton ) ++m_iter; }
-
- private:
- // Data members
- typename col_type::const_iterator m_iter;
- bool m_singleton;
- };
-
public:
+ typedef typename col_type::value_type sample;
+
enum { arity = 1 };
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- //! Constructor
- //! The collection is moved
- explicit collection( C&& col ) : m_col( std::forward<C>(col) ) {}
+ typedef typename col_type::const_iterator iterator;
+
+ //! Constructor consumed a temporary collection or stores a reference
+ explicit collection( C&& col ) : m_col( std::forward<C>(col) ) {}
//! Move constructor
collection( collection&& c ) : m_col( std::forward<C>( c.m_col ) ) {}
-#else
- //! Constructor
- //! The collection is copied
- explicit collection( C const& col ) : m_col( col ) {}
-#endif
//! Returns the underlying collection
- C const& col() const { return m_col; }
+ C const& col() const { return m_col; }
- // dataset interface
- virtual data::size_t size() const { return m_col.size(); }
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( *this ); }
+ //! dataset interface
+ data::size_t size() const { return m_col.size(); }
+ iterator begin() const { return m_col.begin(); }
private:
// Data members
@@ -93,27 +67,19 @@ private:
//! A collection from a forward iterable container is a dataset.
template<typename C>
-struct is_dataset<collection<C> > : mpl::true_ {};
+struct is_dataset<collection<C>> : mpl::true_ {};
} // namespace monomorphic
+//____________________________________________________________________________//
+
//! @overload boost::unit_test::data::make()
template<typename C>
-inline typename BOOST_TEST_ENABLE_IF<is_forward_iterable<C>::value,
- monomorphic::collection<C> >::type
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+inline typename std::enable_if<is_forward_iterable<C>::value,monomorphic::collection<C>>::type
make( C&& c )
{
return monomorphic::collection<C>( std::forward<C>(c) );
}
-#else
-make( C const& c )
-{
- return monomorphic::collection<C>( c );
-}
-#endif
-
-//____________________________________________________________________________//
} // namespace data
} // namespace unit_test
diff --git a/boost/test/data/monomorphic/dataset.hpp b/boost/test/data/monomorphic/dataset.hpp
deleted file mode 100644
index 122dbea8c5..0000000000
--- a/boost/test/data/monomorphic/dataset.hpp
+++ /dev/null
@@ -1,174 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-/// @file
-/// Defines monomorphic dataset interface
-//
-// ***************************************************************************
-
-#ifndef BOOST_TEST_DATA_MONOMORPHIC_DATASET_HPP_102211GER
-#define BOOST_TEST_DATA_MONOMORPHIC_DATASET_HPP_102211GER
-
-// Boost.Test
-#include <boost/test/data/config.hpp>
-#include <boost/test/data/monomorphic/fwd.hpp>
-
-// STL
-#ifndef BOOST_NO_CXX11_HDR_TUPLE
-#include <tuple>
-#endif
-//#include <stdexcept>
-
-#include <boost/test/detail/suppress_warnings.hpp>
-
-//____________________________________________________________________________//
-
-namespace boost {
-namespace unit_test {
-namespace data {
-namespace monomorphic {
-
-// ************************************************************************** //
-// ************** monomorphic::traits ************** //
-// ************************************************************************** //
-
-template<typename T>
-struct traits {
- // type of the reference to sample returned by iterator
- typedef T const& ref_type;
-
- template<typename Action>
- static void
- invoke_action( ref_type arg, Action const& action )
- {
- action( arg );
- }
-};
-
-//____________________________________________________________________________//
-
-#ifndef BOOST_NO_CXX11_HDR_TUPLE
-// !! ?? reimplement using variadics
-template<typename T1, typename T2>
-struct traits<std::tuple<T1,T2>> {
- // type of the reference to sample returned by iterator
- typedef std::tuple<T1 const&,T2 const&> ref_type;
-
- template<typename Action>
- static void
- invoke_action( ref_type arg, Action const& action )
- {
- action( std::get<0>(arg), std::get<1>(arg) );
- }
-};
-
-//____________________________________________________________________________//
-
-template<typename T1, typename T2, typename T3>
-struct traits<std::tuple<T1,T2,T3>> {
- // type of the reference to sample returned by iterator
- typedef std::tuple<T1 const&,T2 const&,T3 const&> ref_type;
-
- template<typename Action>
- static void
- invoke_action( ref_type arg, Action const& action )
- {
- action( std::get<0>(arg), std::get<1>(arg), std::get<2>(arg) );
- }
-};
-
-//____________________________________________________________________________//
-
-#endif
-
-// ************************************************************************** //
-// ************** monomorphic::dataset ************** //
-// ************************************************************************** //
-
-//!@brief Dataset base class
-//!
-//! This class defines the dataset concept, which is an implementation of a sequence.
-//! Each dataset should implement
-//! - the @c size
-//! - the @c begin function, which provides a forward iterator on the beginning of the sequence. The returned
-//! iterator should be incrementable a number of times corresponding to the returned size.
-//!
-template<typename T>
-class dataset {
-public:
- //! Type of the samples in this dataset
- typedef T data_type;
-
- virtual ~dataset()
- {}
-
- //! Interface of the dataset iterator
- class iterator {
- public:
- typedef typename monomorphic::traits<T>::ref_type ref_type;
-
- virtual ~iterator() {}
-
- // forward iterator interface
- virtual ref_type operator*() = 0;
- virtual void operator++() = 0;
- };
-
- //! Type of the iterator
- typedef boost::shared_ptr<iterator> iter_ptr;
-
- //! Dataset size
- virtual data::size_t size() const = 0;
-
- //! Iterator to use to iterate over this dataset
- virtual iter_ptr begin() const = 0;
-};
-
-} // namespace monomorphic
-
-// ************************************************************************** //
-// ************** for_each_sample ************** //
-// ************************************************************************** //
-
-template<typename SampleType, typename Action>
-inline void
-for_each_sample( monomorphic::dataset<SampleType> const& ds,
- Action const& act,
- data::size_t number_of_samples = BOOST_TEST_DS_INFINITE_SIZE )
-{
- data::size_t size = (std::min)( ds.size(), number_of_samples );
- BOOST_TEST_DS_ASSERT( !size.is_inf(), "Dataset has infinite size. Please specify the number of samples" );
-
- typename monomorphic::dataset<SampleType>::iter_ptr it = ds.begin();
-
- while( size-- > 0 ) {
- monomorphic::traits<SampleType>::invoke_action( **it, act );
- ++(*it);
- }
-}
-
-//____________________________________________________________________________//
-
-template<typename SampleType, typename Action>
-inline typename BOOST_TEST_ENABLE_IF<!monomorphic::is_dataset<SampleType>::value,void>::type
-for_each_sample( SampleType const& samples,
- Action const& act,
- data::size_t number_of_samples = BOOST_TEST_DS_INFINITE_SIZE )
-{
- data::for_each_sample( data::make( samples ), act, number_of_samples );
-}
-
-//____________________________________________________________________________//
-
-} // namespace data
-} // namespace unit_test
-} // namespace boost
-
-#include <boost/test/detail/enable_warnings.hpp>
-
-#endif // BOOST_TEST_DATA_MONOMORPHIC_DATASET_HPP_102211GER
-
diff --git a/boost/test/data/monomorphic/fwd.hpp b/boost/test/data/monomorphic/fwd.hpp
index 9ff4955432..26c36743df 100644
--- a/boost/test/data/monomorphic/fwd.hpp
+++ b/boost/test/data/monomorphic/fwd.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2012-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -18,22 +18,17 @@
#include <boost/test/utils/is_forward_iterable.hpp>
-
// Boost
-#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
-#include <boost/utility/enable_if.hpp>
-#include <boost/type_traits/add_const.hpp>
-#else
-#include <boost/utility/declval.hpp>
-#endif
#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/is_array.hpp>
#include <boost/mpl/bool.hpp>
-#include <boost/smart_ptr/make_shared.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/type_traits/decay.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
+// STL
+#include <initializer_list>
+
//____________________________________________________________________________//
namespace boost {
@@ -44,10 +39,8 @@ namespace monomorphic {
#if !defined(BOOST_TEST_DOXYGEN_DOC__)
-template<typename T>
-struct traits;
-template<typename T>
+template<typename T, typename Specific>
class dataset;
template<typename T>
@@ -58,12 +51,10 @@ class collection;
template<typename T>
class array;
-#endif
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-# define BOOST_TEST_ENABLE_IF std::enable_if
-#else
-# define BOOST_TEST_ENABLE_IF boost::enable_if_c
+template<typename T>
+class init_list;
+
#endif
// ************************************************************************** //
@@ -74,25 +65,24 @@ class array;
template<typename DataSet>
struct is_dataset : mpl::false_ {};
+//____________________________________________________________________________//
+
//! A reference to a dataset is a dataset
template<typename DataSet>
struct is_dataset<DataSet&> : is_dataset<DataSet> {};
+//____________________________________________________________________________//
+
//! A const dataset is a dataset
template<typename DataSet>
struct is_dataset<DataSet const> : is_dataset<DataSet> {};
-//____________________________________________________________________________//
-
} // namespace monomorphic
// ************************************************************************** //
// ************** data::make ************** //
// ************************************************************************** //
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-
//! @brief Creates a dataset from a value, a collection or an array
//!
//! This function has several overloads:
@@ -113,201 +103,74 @@ struct is_dataset<DataSet const> : is_dataset<DataSet> {};
//! template<typename T, std::size_t size> monomorphic::array<T> make( T (&a)[size] );
//! @endcode
template<typename DataSet>
-inline typename BOOST_TEST_ENABLE_IF<monomorphic::is_dataset<DataSet>::value,DataSet>::type
+inline typename std::enable_if<monomorphic::is_dataset<DataSet>::value,DataSet>::type
make(DataSet&& ds)
{
return std::forward<DataSet>( ds );
}
+//____________________________________________________________________________//
// warning: doxygen is apparently unable to handle @overload from different files, so if the overloads
// below are not declared with @overload in THIS file, they do not appear in the documentation.
-// fwrd declaration for singletons
//! @overload boost::unit_test::data::make()
template<typename T>
-inline typename BOOST_TEST_ENABLE_IF<!is_forward_iterable<T>::value &&
- !monomorphic::is_dataset<T>::value &&
- !boost::is_array< typename boost::remove_reference<T>::type >::value,
- monomorphic::singleton<T> >::type
+inline typename std::enable_if<!is_forward_iterable<T>::value &&
+ !monomorphic::is_dataset<T>::value &&
+ !is_array<typename remove_reference<T>::type>::value,
+ monomorphic::singleton<T>>::type
make( T&& v );
+//____________________________________________________________________________//
//! @overload boost::unit_test::data::make()
template<typename C>
-inline typename BOOST_TEST_ENABLE_IF<is_forward_iterable<C>::value,
- monomorphic::collection<C> >::type
+inline typename std::enable_if<is_forward_iterable<C>::value,monomorphic::collection<C>>::type
make( C&& c );
-
-#else // !BOOST_NO_CXX11_RVALUE_REFERENCES
-
-//! @overload boost::unit_test:data::make()
-template<typename DataSet>
-inline typename BOOST_TEST_ENABLE_IF<monomorphic::is_dataset<DataSet>::value,DataSet const&>::type
-make(DataSet const& ds)
-{
- return ds;
-}
-
-
-// fwrd declaration for singletons
-#if !(defined(BOOST_MSVC) && (BOOST_MSVC < 1600))
-//! @overload boost::unit_test::data::make()
-template<typename T>
-inline typename BOOST_TEST_ENABLE_IF<!is_forward_iterable<T>::value &&
- !monomorphic::is_dataset<T>::value &&
- !boost::is_array< typename boost::remove_reference<T>::type >::value,
- monomorphic::singleton<T> >::type
-make( T const& v );
-#endif
-
-
-// fwrd declaration for collections
-//! @overload boost::unit_test::data::make()
-template<typename C>
-inline typename BOOST_TEST_ENABLE_IF<is_forward_iterable<C>::value,
- monomorphic::collection<C> >::type
-make( C const& c );
-
//____________________________________________________________________________//
-
-
-#endif // !BOOST_NO_CXX11_RVALUE_REFERENCES
-
-
-
-
-// fwrd declarations
//! @overload boost::unit_test::data::make()
template<typename T, std::size_t size>
inline monomorphic::array< typename boost::remove_const<T>::type >
make( T (&a)[size] );
-// apparently some compilers (eg clang-3.4 on linux) have trouble understanding
-// the previous line for T being const
-//! @overload boost::unit_test::data::make()
-template<typename T, std::size_t size>
-inline monomorphic::array< typename boost::remove_const<T>::type >
-make( T const (&)[size] );
-
-template<typename T, std::size_t size>
-inline monomorphic::array< typename boost::remove_const<T>::type >
-make( T a[size] );
-
-
+//____________________________________________________________________________//
//! @overload boost::unit_test::data::make()
inline monomorphic::singleton<char*>
make( char* str );
+//____________________________________________________________________________//
+
//! @overload boost::unit_test::data::make()
inline monomorphic::singleton<char const*>
make( char const* str );
-
-
//____________________________________________________________________________//
+//! @overload boost::unit_test::data::make()
+template<typename T>
+inline monomorphic::init_list<T>
+make( std::initializer_list<T>&& );
+//____________________________________________________________________________//
namespace result_of {
-#ifndef BOOST_NO_CXX11_DECLTYPE
//! Result of the make call.
template<typename DataSet>
-struct make
-{
- typedef decltype(data::make(boost::declval<DataSet>())) type;
-};
-#else
-
-// explicit specialisation, cumbersome
-
-template <typename DataSet, typename Enable = void>
-struct make;
-
-template <typename DataSet>
-struct make<
- DataSet const&,
- typename BOOST_TEST_ENABLE_IF<monomorphic::is_dataset<DataSet>::value>::type
- >
-{
- typedef DataSet const& type;
-};
-
-template <typename T>
-struct make<
- T,
- typename BOOST_TEST_ENABLE_IF< (!is_forward_iterable<T>::value &&
- !monomorphic::is_dataset<T>::value &&
- !boost::is_array< typename boost::remove_reference<T>::type >::value)
- >::type
- >
-{
- typedef monomorphic::singleton<T> type;
-};
-
-template <typename C>
-struct make<
- C,
- typename BOOST_TEST_ENABLE_IF< is_forward_iterable<C>::value>::type
- >
-{
- typedef monomorphic::collection<C> type;
-};
-
-#if 1
-template <typename T, std::size_t size>
-struct make<T [size]>
-{
- typedef monomorphic::array<typename boost::remove_const<T>::type> type;
+struct make {
+ typedef decltype( data::make( declval<DataSet>() ) ) type;
};
-#endif
-
-template <typename T, std::size_t size>
-struct make<T (&)[size]>
-{
- typedef monomorphic::array<typename boost::remove_const<T>::type> type;
-};
-
-template <typename T, std::size_t size>
-struct make<T const (&)[size]>
-{
- typedef monomorphic::array<typename boost::remove_const<T>::type> type;
-};
-
-template <>
-struct make<char*>
-{
- typedef monomorphic::singleton<char*> type;
-};
-
-template <>
-struct make<char const*>
-{
- typedef monomorphic::singleton<char const*> type;
-};
-
-#endif // BOOST_NO_CXX11_DECLTYPE
-
} // namespace result_of
-
-
-
-//____________________________________________________________________________//
-
} // namespace data
} // namespace unit_test
} // namespace boost
-
-
-
-
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_DATA_MONOMORPHIC_FWD_HPP_102212GER
diff --git a/boost/test/data/monomorphic/generate.hpp b/boost/test/data/monomorphic/generate.hpp
index c5ff1d699b..af3b5c0bb9 100644
--- a/boost/test/data/monomorphic/generate.hpp
+++ b/boost/test/data/monomorphic/generate.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -14,7 +14,7 @@
// Boost.Test
#include <boost/test/data/config.hpp>
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
@@ -36,44 +36,43 @@ namespace monomorphic {
* - random_t
*
* The generator concept is the following:
- * - the type of the generated samples is given by field @c data_type
+ * - the type of the generated samples is given by field @c sample
* - the member function @c capacity should return the size of the collection being generated (potentially infinite)
* - the member function @c next should change the state of the generator to the next generated value
* - the member function @c reset should put the state of the object in the same state as right after its instanciation
*/
template<typename Generator>
-class generated_by : public monomorphic::dataset<typename Generator::data_type> {
- typedef typename Generator::data_type T;
- typedef monomorphic::dataset<T> base;
- typedef typename base::iter_ptr iter_ptr;
+class generated_by {
+public:
+ typedef typename Generator::sample sample;
+
+ enum { arity = 1 };
- struct iterator : public base::iterator {
+ struct iterator {
// Constructor
explicit iterator( Generator& gen )
- : m_gen( gen )
+ : m_gen( &gen )
{
- if(m_gen.capacity() > 0) {
- m_gen.reset();
+ if(m_gen->capacity() > 0) {
+ m_gen->reset();
++*this;
}
}
// forward iterator interface
- virtual T const& operator*() { return m_curr_sample; }
- virtual void operator++() { m_curr_sample = m_gen.next(); }
+ sample const& operator*() const { return m_curr_sample; }
+ void operator++() { m_curr_sample = m_gen->next(); }
private:
// Data members
- Generator& m_gen;
- T m_curr_sample;
+ Generator* m_gen;
+ sample m_curr_sample;
};
-public:
- enum { arity = 1 };
+
typedef Generator generator_type;
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
// Constructor
- explicit generated_by( Generator&& G )
+ explicit generated_by( Generator&& G )
: m_generator( std::forward<Generator>(G) )
{}
@@ -81,29 +80,23 @@ public:
generated_by( generated_by&& rhs )
: m_generator( std::forward<Generator>(rhs.m_generator) )
{}
-#else
- // Constructor
- explicit generated_by( Generator const& G )
- : m_generator( G )
- {}
-#endif
//! Size of the underlying dataset
- data::size_t size() const { return m_generator.capacity(); }
+ data::size_t size() const { return m_generator.capacity(); }
//! Iterator on the beginning of the dataset
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( boost::ref(const_cast<Generator&>(m_generator)) ); }
+ iterator begin() const { return iterator( boost::ref(const_cast<Generator&>(m_generator)) ); }
private:
// Data members
- Generator m_generator;
+ Generator m_generator;
};
+//____________________________________________________________________________//
//! A generated dataset is a dataset.
template<typename Generator>
-struct is_dataset<generated_by<Generator> > : mpl::true_ {};
-
+struct is_dataset<generated_by<Generator>> : mpl::true_ {};
} // namespace monomorphic
} // namespace data
diff --git a/boost/test/data/monomorphic/generators.hpp b/boost/test/data/monomorphic/generators.hpp
index aa74d7abb1..108d4ba58d 100644
--- a/boost/test/data/monomorphic/generators.hpp
+++ b/boost/test/data/monomorphic/generators.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/data/monomorphic/generators/keywords.hpp b/boost/test/data/monomorphic/generators/keywords.hpp
index 4983678f95..de6a4e89e5 100644
--- a/boost/test/data/monomorphic/generators/keywords.hpp
+++ b/boost/test/data/monomorphic/generators/keywords.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/data/monomorphic/generators/random.hpp b/boost/test/data/monomorphic/generators/random.hpp
index a82eef103d..24a1df3c64 100644
--- a/boost/test/data/monomorphic/generators/random.hpp
+++ b/boost/test/data/monomorphic/generators/random.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -36,7 +36,7 @@ namespace data {
namespace {
nfp::keyword<struct seed_t> seed;
-nfp::keyword<struct distrbution_t> distribution;
+nfp::keyword<struct distribution_t> distribution;
nfp::keyword<struct engine_t> engine;
} // local namespace
@@ -47,7 +47,7 @@ template<typename SampleType>
struct default_distribution {
typedef typename mpl::if_<std::is_integral<SampleType>,
std::uniform_int_distribution<SampleType>,
- std::uniform_real_distribution<SampleType> >::type type;
+ std::uniform_real_distribution<SampleType>>::type type;
};
} // namespace ds_detail
@@ -66,7 +66,7 @@ template<typename SampleType = double,
typename EngineType = std::default_random_engine>
class random_t {
public:
- typedef SampleType data_type;
+ typedef SampleType sample;
typedef DistributionType distr_type;
typedef EngineType engine_type;
@@ -127,7 +127,7 @@ private:
//!
//! The function returns an object that implements the dataset API.
//! @note This function is available only for C++11 capable compilers.
-inline monomorphic::generated_by< monomorphic::random_t<> > random()
+inline monomorphic::generated_by< monomorphic::random_t<>> random()
{
return monomorphic::generated_by<monomorphic::random_t<>>( monomorphic::random_t<>() );
}
@@ -136,7 +136,7 @@ inline monomorphic::generated_by< monomorphic::random_t<> > random()
/// @overload boost::unit_test::data::random()
template<typename SampleType>
-inline monomorphic::generated_by< monomorphic::random_t<SampleType> >
+inline monomorphic::generated_by< monomorphic::random_t<SampleType>>
random( SampleType begin, SampleType end )
{
typedef monomorphic::random_t<SampleType> Gen;
diff --git a/boost/test/data/monomorphic/generators/xrange.hpp b/boost/test/data/monomorphic/generators/xrange.hpp
index 55a51110b4..02da352adf 100644
--- a/boost/test/data/monomorphic/generators/xrange.hpp
+++ b/boost/test/data/monomorphic/generators/xrange.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -49,14 +49,14 @@ namespace monomorphic {
template<typename SampleType, typename StepType=SampleType>
class xrange_t {
public:
- typedef SampleType data_type;
+ typedef SampleType sample;
- xrange_t( SampleType const& begin, StepType const& step, data::size_t size )
- : m_begin( begin )
- , m_curr( begin )
- , m_step( step )
+ xrange_t( SampleType const& begin_, StepType const& step_, data::size_t size_ )
+ : m_begin( begin_ )
+ , m_curr( begin_ )
+ , m_step( step_ )
, m_index( 0 )
- , m_size( size )
+ , m_size( size_ )
{}
// Generator interface
@@ -159,7 +159,7 @@ struct make_xrange {
//!
//! @note the step size cannot be null, and it should be positive if @c begin_val < @c end_val, negative otherwise.
template<typename SampleType, typename Params>
-inline monomorphic::generated_by<monomorphic::xrange_t<SampleType> >
+inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
xrange( Params const& params )
{
return monomorphic::ds_detail::make_xrange<SampleType>::_( params );
@@ -169,7 +169,7 @@ xrange( Params const& params )
/// @overload boost::unit_test::data::xrange()
template<typename SampleType>
-inline monomorphic::generated_by<monomorphic::xrange_t<SampleType> >
+inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
xrange( SampleType const& end_val )
{
return monomorphic::ds_detail::make_xrange<SampleType>::_( data::end=end_val );
@@ -179,22 +179,23 @@ xrange( SampleType const& end_val )
/// @overload boost::unit_test::data::xrange()
template<typename SampleType, typename Params>
-inline typename enable_if_c<nfp::is_named_params<Params>::value,monomorphic::generated_by<monomorphic::xrange_t<SampleType> > >::type
+inline typename enable_if_c<nfp::is_named_param_pack<Params>::value,
+ monomorphic::generated_by<monomorphic::xrange_t<SampleType>>>::type
xrange( SampleType const& end_val, Params const& params )
{
- return monomorphic::ds_detail::make_xrange<SampleType>::
- _(( params, data::end=end_val ));
+ return monomorphic::ds_detail::make_xrange<SampleType>::_(( params, data::end=end_val ));
}
//____________________________________________________________________________//
/// @overload boost::unit_test::data::xrange()
template<typename SampleType>
-inline monomorphic::generated_by<monomorphic::xrange_t<SampleType> >
+inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
xrange( SampleType const& begin_val, SampleType const& end_val )
{
- return monomorphic::ds_detail::make_xrange<SampleType>::
- _(( data::begin=begin_val, data::end=end_val ));
+ return monomorphic::ds_detail::make_xrange<SampleType>::_((
+ data::begin=begin_val,
+ data::end=end_val ));
}
//____________________________________________________________________________//
@@ -203,11 +204,13 @@ xrange( SampleType const& begin_val, SampleType const& end_val )
/// @overload boost::unit_test::data::xrange()
template<typename SampleType,typename StepType>
-inline monomorphic::generated_by<monomorphic::xrange_t<SampleType> >
+inline monomorphic::generated_by<monomorphic::xrange_t<SampleType>>
xrange( SampleType const& begin_val, SampleType const& end_val, StepType const& step_val )
{
- return monomorphic::ds_detail::make_xrange<SampleType,StepType>::
- _(( data::begin=begin_val, data::end=end_val, data::step=step_val ));
+ return monomorphic::ds_detail::make_xrange<SampleType,StepType>::_((
+ data::begin=begin_val,
+ data::end=end_val,
+ data::step=step_val ));
}
//____________________________________________________________________________//
diff --git a/boost/test/data/monomorphic/grid.hpp b/boost/test/data/monomorphic/grid.hpp
index 00aaa56cd1..6af906c62c 100644
--- a/boost/test/data/monomorphic/grid.hpp
+++ b/boost/test/data/monomorphic/grid.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -7,8 +7,8 @@
//
///@file
/// Defines monomorphic dataset n+m dimentional *. Samples in this
-/// dataset is grid of elements in DS1 and DS2. There will be total
-/// |DS1| * |DS2| samples
+/// dataset is grid of elements in DataSet1 and DataSet2. There will be total
+/// |DataSet1| * |DataSet2| samples
// ***************************************************************************
#ifndef BOOST_TEST_DATA_MONOMORPHIC_GRID_HPP_101512GER
@@ -17,10 +17,11 @@
// Boost.Test
#include <boost/test/data/config.hpp>
-
#if !defined(BOOST_TEST_NO_GRID_COMPOSITION_AVAILABLE) || defined(BOOST_TEST_DOXYGEN_DOC__)
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/traits.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
+
#include <boost/test/detail/suppress_warnings.hpp>
//____________________________________________________________________________//
@@ -36,7 +37,7 @@ namespace ds_detail {
template<typename T1, typename T2>
struct grid_traits {
typedef std::tuple<T1,T2> type;
- typedef typename monomorphic::traits<type>::ref_type ref_type;
+ typedef typename data::traits<type>::ref_type ref_type;
static ref_type
tuple_merge(T1 const& a1, T2 const& a2)
@@ -50,7 +51,7 @@ struct grid_traits {
template<typename T1, typename T2,typename T3>
struct grid_traits<T1,std::tuple<T2,T3>> {
typedef std::tuple<T1,T2,T3> type;
- typedef typename monomorphic::traits<type>::ref_type ref_type;
+ typedef typename data::traits<type>::ref_type ref_type;
static ref_type
tuple_merge(T1 const& a1, std::tuple<T2 const&,T3 const&> const& a2)
@@ -64,7 +65,7 @@ struct grid_traits<T1,std::tuple<T2,T3>> {
template<typename T1, typename T2,typename T3>
struct grid_traits<std::tuple<T1,T2>,T3> {
typedef std::tuple<T1,T2,T3> type;
- typedef typename monomorphic::traits<type>::ref_type ref_type;
+ typedef typename data::traits<type>::ref_type ref_type;
static ref_type
tuple_merge(std::tuple<T1 const&,T2 const&> const& a1, T3 const& a2)
@@ -85,82 +86,83 @@ struct grid_traits<std::tuple<T1,T2>,T3> {
//! Implements the dataset resulting from a cartesian product/grid operation on datasets.
//!
//! The arity of the resulting dataset is the sum of the arity of its operands.
-template<typename DS1, typename DS2>
-class grid : public monomorphic::dataset<typename ds_detail::grid_traits<typename boost::decay<DS1>::type::data_type,
- typename boost::decay<DS2>::type::data_type>::type> {
- typedef typename boost::decay<DS1>::type::data_type T1;
- typedef typename boost::decay<DS2>::type::data_type T2;
+template<typename DataSet1, typename DataSet2>
+class grid {
+ typedef typename boost::decay<DataSet1>::type dataset1_decay;
+ typedef typename boost::decay<DataSet2>::type dataset2_decay;
+
+ typedef typename dataset1_decay::iterator dataset1_iter;
+ typedef typename dataset2_decay::iterator dataset2_iter;
- typedef typename monomorphic::dataset<T1>::iter_ptr ds1_iter_ptr;
- typedef typename monomorphic::dataset<T2>::iter_ptr ds2_iter_ptr;
+ typedef typename dataset1_decay::sample sample1;
+ typedef typename dataset2_decay::sample sample2;
- typedef typename ds_detail::grid_traits<T1,T2>::type T;
- typedef monomorphic::dataset<T> base;
- typedef typename base::iter_ptr iter_ptr;
+public:
+ typedef typename ds_detail::grid_traits<sample1,sample2>::type sample;
- struct iterator : public base::iterator {
- typedef typename monomorphic::traits<T>::ref_type ref_type;
+ struct iterator {
+ typedef typename data::traits<sample>::ref_type ref_type;
// Constructor
- explicit iterator( ds1_iter_ptr iter1, DS2 const& ds2 )
- : m_iter1( iter1 )
- , m_iter2( ds2.begin() )
- , m_ds2( ds2 )
+ explicit iterator( dataset1_iter iter1, DataSet2 const& ds2 )
+ : m_iter1( std::move( iter1 ) )
+ , m_iter2( std::move( ds2.begin() ) )
+ , m_ds2( &ds2 )
, m_ds2_pos( 0 )
{}
// forward iterator interface
- virtual ref_type operator*() { return ds_detail::grid_traits<T1,T2>::tuple_merge( **m_iter1, **m_iter2 ); }
- virtual void operator++()
+ ref_type operator*() const { return ds_detail::grid_traits<sample1,sample2>::tuple_merge( *m_iter1, *m_iter2 ); }
+ void operator++()
{
++m_ds2_pos;
- if( m_ds2_pos != m_ds2.size() )
- ++(*m_iter2);
+ if( m_ds2_pos != m_ds2->size() )
+ ++m_iter2;
else {
m_ds2_pos = 0;
- ++(*m_iter1);
- m_iter2 = m_ds2.begin();
+ ++m_iter1;
+ m_iter2 = std::move( m_ds2->begin() );
}
}
private:
// Data members
- ds1_iter_ptr m_iter1;
- ds2_iter_ptr m_iter2;
- DS2 const& m_ds2;
+ dataset1_iter m_iter1;
+ dataset2_iter m_iter2;
+ dataset2_decay const* m_ds2;
data::size_t m_ds2_pos;
};
public:
- enum { arity = boost::decay<DS1>::type::arity + boost::decay<DS2>::type::arity };
+ enum { arity = boost::decay<DataSet1>::type::arity + boost::decay<DataSet2>::type::arity };
//! Constructor
- grid( DS1&& ds1, DS2&& ds2 )
- : m_ds1( std::forward<DS1>( ds1 ) )
- , m_ds2( std::forward<DS2>( ds2 ) )
+ grid( DataSet1&& ds1, DataSet2&& ds2 )
+ : m_ds1( std::forward<DataSet1>( ds1 ) )
+ , m_ds2( std::forward<DataSet2>( ds2 ) )
{}
//! Move constructor
grid( grid&& j )
- : m_ds1( std::forward<DS1>( j.m_ds1 ) )
- , m_ds2( std::forward<DS2>( j.m_ds2 ) )
+ : m_ds1( std::forward<DataSet1>( j.m_ds1 ) )
+ , m_ds2( std::forward<DataSet2>( j.m_ds2 ) )
{}
// dataset interface
- virtual data::size_t size() const { return m_ds1.size() * m_ds2.size(); }
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( m_ds1.begin(), m_ds2 ); }
+ data::size_t size() const { return m_ds1.size() * m_ds2.size(); }
+ iterator begin() const { return iterator( m_ds1.begin(), m_ds2 ); }
private:
// Data members
- DS1 m_ds1;
- DS2 m_ds2;
+ DataSet1 m_ds1;
+ DataSet2 m_ds2;
};
//____________________________________________________________________________//
// A grid dataset is a dataset
-template<typename DS1, typename DS2>
-struct is_dataset<grid<DS1,DS2> > : mpl::true_ {};
+template<typename DataSet1, typename DataSet2>
+struct is_dataset<grid<DataSet1,DataSet2>> : mpl::true_ {};
//____________________________________________________________________________//
@@ -176,42 +178,42 @@ struct grid {
//____________________________________________________________________________//
-
-
//! Grid operation
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::grid<mpl::identity<DS1>,mpl::identity<DS2>>
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<is_dataset<DataSet1>::value && is_dataset<DataSet2>::value,
+ result_of::grid<mpl::identity<DataSet1>,mpl::identity<DataSet2>>
>::type
-operator*( DS1&& ds1, DS2&& ds2 )
+operator*( DataSet1&& ds1, DataSet2&& ds2 )
{
- BOOST_TEST_DS_ASSERT( !ds1.size().is_inf() && !ds2.size().is_inf(), "Grid dimension can't have infinite size" );
+ BOOST_TEST_DS_ASSERT( !ds1.size().is_inf() && !ds2.size().is_inf(), "Grid axes can't have infinite size" );
- return grid<DS1,DS2>( std::forward<DS1>( ds1 ), std::forward<DS2>( ds2 ) );
+ return grid<DataSet1,DataSet2>( std::forward<DataSet1>( ds1 ), std::forward<DataSet2>( ds2 ) );
}
+//____________________________________________________________________________//
+
//! @overload boost::unit_test::data::operator*
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && !is_dataset<DS2>::value,
- result_of::grid<mpl::identity<DS1>,data::result_of::make<DS2>>
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<is_dataset<DataSet1>::value && !is_dataset<DataSet2>::value,
+ result_of::grid<mpl::identity<DataSet1>,data::result_of::make<DataSet2>>
>::type
-operator*( DS1&& ds1, DS2&& ds2 )
+operator*( DataSet1&& ds1, DataSet2&& ds2 )
{
- return std::forward<DS1>(ds1) * data::make(std::forward<DS2>(ds2));
+ return std::forward<DataSet1>(ds1) * data::make(std::forward<DataSet2>(ds2));
}
+//____________________________________________________________________________//
+
//! @overload boost::unit_test::data::operator*
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<!is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::grid<data::result_of::make<DS1>,mpl::identity<DS2>>
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<!is_dataset<DataSet1>::value && is_dataset<DataSet2>::value,
+ result_of::grid<data::result_of::make<DataSet1>,mpl::identity<DataSet2>>
>::type
-operator*( DS1&& ds1, DS2&& ds2 )
+operator*( DataSet1&& ds1, DataSet2&& ds2 )
{
- return data::make(std::forward<DS1>(ds1)) * std::forward<DS2>(ds2);
+ return data::make(std::forward<DataSet1>(ds1)) * std::forward<DataSet2>(ds2);
}
-//____________________________________________________________________________//
-
} // namespace monomorphic
} // namespace data
diff --git a/boost/test/data/monomorphic/initializer_list.hpp b/boost/test/data/monomorphic/initializer_list.hpp
new file mode 100644
index 0000000000..3221597396
--- /dev/null
+++ b/boost/test/data/monomorphic/initializer_list.hpp
@@ -0,0 +1,81 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+///@file
+///Defines monomorphic dataset based on C++11 initializer_list template
+// ***************************************************************************
+
+#ifndef BOOST_TEST_DATA_MONOMORPHIC_INITIALIZATION_LIST_HPP_091515GER
+#define BOOST_TEST_DATA_MONOMORPHIC_INITIALIZATION_LIST_HPP_091515GER
+
+// Boost.Test
+#include <boost/test/data/config.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+//____________________________________________________________________________//
+
+namespace boost {
+namespace unit_test {
+namespace data {
+namespace monomorphic {
+
+// ************************************************************************** //
+// ************** array ************** //
+// ************************************************************************** //
+
+/// Dataset view of a C array
+template<typename T>
+class init_list {
+public:
+ typedef T sample;
+
+ enum { arity = 1 };
+
+ typedef T const* iterator;
+
+ //! Constructor swallows initializer_list
+ init_list( std::initializer_list<T>&& il )
+ : m_data( std::forward<std::initializer_list<T>>( il ) )
+ {}
+
+ //! dataset interface
+ data::size_t size() const { return m_data.size(); }
+ iterator begin() const { return m_data.begin(); }
+
+private:
+ // Data members
+ std::initializer_list<T> m_data;
+};
+
+//____________________________________________________________________________//
+
+//! An array dataset is a dataset
+template<typename T>
+struct is_dataset<init_list<T>> : mpl::true_ {};
+
+} // namespace monomorphic
+
+//____________________________________________________________________________//
+
+//! @overload boost::unit_test::data::make()
+template<typename T>
+inline monomorphic::init_list<T>
+make( std::initializer_list<T>&& il )
+{
+ return monomorphic::init_list<T>( std::forward<std::initializer_list<T>>( il ) );
+}
+
+} // namespace data
+} // namespace unit_test
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_DATA_MONOMORPHIC_INITIALIZATION_LIST_HPP_091515GER
+
diff --git a/boost/test/data/monomorphic/join.hpp b/boost/test/data/monomorphic/join.hpp
index 94b25c78e2..f817994dd3 100644
--- a/boost/test/data/monomorphic/join.hpp
+++ b/boost/test/data/monomorphic/join.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -14,7 +14,7 @@
// Boost.Test
#include <boost/test/data/config.hpp>
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
@@ -33,157 +33,111 @@ namespace monomorphic {
//!
//! The size of the resulting dataset is the sum of the two underlying datasets. The arity of the datasets
//! should match.
-template<typename DS1, typename DS2>
-class join : public monomorphic::dataset<typename boost::decay<DS1>::type::data_type> {
- typedef typename boost::decay<DS1>::type::data_type T;
- typedef monomorphic::dataset<T> base;
- typedef typename base::iter_ptr iter_ptr;
+template<typename DataSet1, typename DataSet2>
+class join {
+ typedef typename boost::decay<DataSet1>::type dataset1_decay;
+ typedef typename boost::decay<DataSet2>::type dataset2_decay;
- struct iterator : public base::iterator {
+ typedef typename dataset1_decay::iterator dataset1_iter;
+ typedef typename dataset2_decay::iterator dataset2_iter;
+public:
+ typedef typename dataset1_decay::sample sample;
+
+ enum { arity = dataset1_decay::arity };
+
+ struct iterator {
// Constructor
- explicit iterator( iter_ptr it1, iter_ptr it2, data::size_t first_size )
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- : m_it1( std::move(it1) )
- , m_it2( std::move(it2) )
-#else
- : m_it1( it1 )
- , m_it2( it2 )
-#endif
+ explicit iterator( dataset1_iter it1, dataset2_iter it2, data::size_t first_size )
+ : m_it1( std::move( it1 ) )
+ , m_it2( std::move( it2 ) )
, m_first_size( first_size )
{}
// forward iterator interface
- virtual T const& operator*() { return m_first_size > 0 ? **m_it1 : **m_it2; }
- virtual void operator++() { m_first_size > 0 ? (--m_first_size,++(*m_it1)) : ++(*m_it2); }
+ sample const& operator*() const { return m_first_size > 0 ? *m_it1 : *m_it2; }
+ void operator++() { if( m_first_size > 0 ) { --m_first_size; ++m_it1; } else ++m_it2; }
private:
// Data members
- iter_ptr m_it1;
- iter_ptr m_it2;
- data::size_t m_first_size;
+ dataset1_iter m_it1;
+ dataset2_iter m_it2;
+ data::size_t m_first_size;
};
-public:
- enum { arity = boost::decay<DS1>::type::arity };
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
- // Constructor
- join( DS1&& ds1, DS2&& ds2 )
- : m_ds1( std::forward<DS1>( ds1 ) )
- , m_ds2( std::forward<DS2>( ds2 ) )
+ //! Constructor
+ join( DataSet1&& ds1, DataSet2&& ds2 )
+ : m_ds1( std::forward<DataSet1>( ds1 ) )
+ , m_ds2( std::forward<DataSet2>( ds2 ) )
{}
- // Move constructor
+ //! Move constructor
join( join&& j )
- : m_ds1( std::forward<DS1>( j.m_ds1 ) )
- , m_ds2( std::forward<DS2>( j.m_ds2 ) )
+ : m_ds1( std::forward<DataSet1>( j.m_ds1 ) )
+ , m_ds2( std::forward<DataSet2>( j.m_ds2 ) )
{}
-#else
- // Constructor
- join( DS1 const& ds1, DS2 const& ds2 )
- : m_ds1( ds1 )
- , m_ds2( ds2 )
- {}
-#endif
- // dataset interface
- virtual data::size_t size() const { return m_ds1.size() + m_ds2.size(); }
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( m_ds1.begin(),
- m_ds2.begin(),
- m_ds1.size() ); }
+ //! dataset interface
+ data::size_t size() const { return m_ds1.size() + m_ds2.size(); }
+ iterator begin() const { return iterator( m_ds1.begin(), m_ds2.begin(), m_ds1.size() ); }
private:
// Data members
- DS1 m_ds1;
- DS2 m_ds2;
+ DataSet1 m_ds1;
+ DataSet2 m_ds2;
};
//____________________________________________________________________________//
// A joined dataset is a dataset.
-template<typename DS1, typename DS2>
-struct is_dataset<join<DS1,DS2> > : mpl::true_ {};
+template<typename DataSet1, typename DataSet2>
+struct is_dataset<join<DataSet1,DataSet2>> : mpl::true_ {};
//____________________________________________________________________________//
namespace result_of {
//! Result type of the join operation on datasets.
-template<typename DS1Gen, typename DS2Gen>
+template<typename DataSet1Gen, typename DataSet2Gen>
struct join {
- typedef monomorphic::join<typename DS1Gen::type,typename DS2Gen::type> type;
+ typedef monomorphic::join<typename DataSet1Gen::type,typename DataSet2Gen::type> type;
};
} // namespace result_of
//____________________________________________________________________________//
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::join<mpl::identity<DS1>,mpl::identity<DS2> >
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<is_dataset<DataSet1>::value && is_dataset<DataSet2>::value,
+ result_of::join<mpl::identity<DataSet1>,mpl::identity<DataSet2>>
>::type
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-operator+( DS1&& ds1, DS2&& ds2 )
-{
- return join<DS1,DS2>( std::forward<DS1>( ds1 ), std::forward<DS2>( ds2 ) );
-}
-#else
-operator+( DS1 const& ds1, DS2 const& ds2 )
+operator+( DataSet1&& ds1, DataSet2&& ds2 )
{
- return join<DS1,DS2>( ds1, ds2 );
+ return join<DataSet1,DataSet2>( std::forward<DataSet1>( ds1 ), std::forward<DataSet2>( ds2 ) );
}
-#endif
//____________________________________________________________________________//
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && !is_dataset<DS2>::value,
- result_of::join<mpl::identity<DS1>,data::result_of::make<DS2> >
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<is_dataset<DataSet1>::value && !is_dataset<DataSet2>::value,
+ result_of::join<mpl::identity<DataSet1>,data::result_of::make<DataSet2>>
>::type
-operator+( DS1&& ds1, DS2&& ds2 )
+operator+( DataSet1&& ds1, DataSet2&& ds2 )
{
- return std::forward<DS1>(ds1) + data::make(std::forward<DS2>(ds2));
+ return std::forward<DataSet1>( ds1 ) + data::make( std::forward<DataSet2>( ds2 ) );
}
-#else
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && !is_dataset<DS2>::value,
- result_of::join<mpl::identity<DS1>,data::result_of::make<DS2> >
->::type
-operator+( DS1 const& ds1, DS2 const& ds2 )
-{
- return ds1 + data::make(ds2);
-}
-#endif
//____________________________________________________________________________//
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<!is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::join<data::result_of::make<DS1>,mpl::identity<DS2> >
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<!is_dataset<DataSet1>::value && is_dataset<DataSet2>::value,
+ result_of::join<data::result_of::make<DataSet1>,mpl::identity<DataSet2>>
>::type
-operator+( DS1&& ds1, DS2&& ds2 )
+operator+( DataSet1&& ds1, DataSet2&& ds2 )
{
- return data::make(std::forward<DS1>(ds1)) + std::forward<DS2>(ds2);
+ return data::make( std::forward<DataSet1>(ds1) ) + std::forward<DataSet2>( ds2 );
}
-#else
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<!is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::join<data::result_of::make<DS1>,mpl::identity<DS2> >
->::type
-operator+( DS1 const& ds1, DS2 const& ds2 )
-{
- return data::make(ds1) + ds2;
-}
-
-#endif
-
} // namespace monomorphic
-
} // namespace data
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/data/monomorphic/singleton.hpp b/boost/test/data/monomorphic/singleton.hpp
index 4d305c2546..586487a6d7 100644
--- a/boost/test/data/monomorphic/singleton.hpp
+++ b/boost/test/data/monomorphic/singleton.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -14,7 +14,7 @@
// Boost.Test
#include <boost/test/data/config.hpp>
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
@@ -31,102 +31,84 @@ namespace monomorphic {
/// Models a single element data set
template<typename T>
-class singleton : public monomorphic::dataset<typename boost::decay<T>::type> {
- typedef monomorphic::dataset<typename boost::decay<T>::type> base;
- typedef typename base::iter_ptr iter_ptr;
+class singleton {
+public:
+ typedef typename boost::decay<T>::type sample;
+
+ enum { arity = 1 };
- struct iterator : public base::iterator {
+ struct iterator {
// Constructor
- explicit iterator( singleton<T> const& owner )
+ explicit iterator( singleton<T> const* owner )
: m_owner( owner )
{}
// forward iterator interface
- virtual typename base::data_type const&
- operator*() { return m_owner.value(); }
- virtual void operator++() {}
+ sample const& operator*() const { return m_owner->value(); }
+ void operator++() {}
private:
- singleton<T> const& m_owner;
+ singleton<T> const* m_owner;
};
-public:
- enum { arity = 1 };
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
//! Constructor
- explicit singleton( T&& value ) : m_value( std::forward<T>( value ) ) {}
+ explicit singleton( T&& value ) : m_value( std::forward<T>( value ) ) {}
//! Move constructor
singleton( singleton&& s ) : m_value( std::forward<T>( s.m_value ) ) {}
-#else
- // Constructor
- explicit singleton( T const& value ) : m_value( value ) {}
-#endif
- // Access methods
- T const& value() const { return m_value; }
+ //! Value access method
+ T const& value() const { return m_value; }
- // dataset interface
- virtual data::size_t size() const { return 1; }
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( *this ); }
+ //! dataset interface
+ data::size_t size() const { return 1; }
+ iterator begin() const { return iterator( this ); }
private:
// Data members
T m_value;
};
+//____________________________________________________________________________//
+
// a singleton is a dataset
template<typename T>
-struct is_dataset<singleton<T> > : mpl::true_ {};
-
-} // namespace monomorphic
+struct is_dataset<singleton<T>> : mpl::true_ {};
+//____________________________________________________________________________//
+} // namespace monomorphic
/// @overload boost::unit_test::data::make()
template<typename T>
-inline typename BOOST_TEST_ENABLE_IF<!is_forward_iterable<T>::value &&
- !monomorphic::is_dataset<T>::value &&
- !boost::is_array< typename boost::remove_reference<T>::type >::value,
- monomorphic::singleton<T>
+inline typename std::enable_if<!is_forward_iterable<T>::value &&
+ !monomorphic::is_dataset<T>::value &&
+ !boost::is_array<typename boost::remove_reference<T>::type>::value,
+ monomorphic::singleton<T>
>::type
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
make( T&& v )
{
return monomorphic::singleton<T>( std::forward<T>( v ) );
}
-#else
-make( T const& v )
-{
- return monomorphic::singleton<T>( v );
-}
-#endif
+//____________________________________________________________________________//
/// @overload boost::unit_test::data::make
-inline monomorphic::singleton<char*> make( char* str )
+inline monomorphic::singleton<char*>
+make( char* str )
{
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
return monomorphic::singleton<char*>( std::move(str) );
-#else
- return monomorphic::singleton<char*>( str );
-#endif
}
+//____________________________________________________________________________//
/// @overload boost::unit_test::data::make
-inline monomorphic::singleton<char const*> make( char const* str )
+inline monomorphic::singleton<char const*>
+make( char const* str )
{
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
return monomorphic::singleton<char const*>( std::move(str) );
-#else
- return monomorphic::singleton<char const*>( str );
-#endif
}
-
-
} // namespace data
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/data/monomorphic/zip.hpp b/boost/test/data/monomorphic/zip.hpp
index 3ee91817a9..1c7f46472c 100644
--- a/boost/test/data/monomorphic/zip.hpp
+++ b/boost/test/data/monomorphic/zip.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -12,12 +12,14 @@
#ifndef BOOST_TEST_DATA_MONOMORPHIC_ZIP_HPP_102211GER
#define BOOST_TEST_DATA_MONOMORPHIC_ZIP_HPP_102211GER
+// Boost.Test
#include <boost/test/data/config.hpp>
#if !defined(BOOST_TEST_NO_ZIP_COMPOSITION_AVAILABLE) || defined(BOOST_TEST_DOXYGEN_DOC__)
-// Boost.Test
-#include <boost/test/data/monomorphic/dataset.hpp>
+#include <boost/test/data/traits.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
+
#include <boost/test/detail/suppress_warnings.hpp>
@@ -28,14 +30,11 @@ namespace monomorphic {
namespace ds_detail {
-
-//____________________________________________________________________________//
-
// !! ?? variadic template implementation; use forward_as_tuple?
template<typename T1, typename T2>
struct zip_traits {
typedef std::tuple<T1,T2> type;
- typedef typename monomorphic::traits<type>::ref_type ref_type;
+ typedef typename data::traits<type>::ref_type ref_type;
static ref_type
tuple_merge(T1 const& a1, T2 const& a2)
@@ -49,7 +48,7 @@ struct zip_traits {
template<typename T1, typename T2,typename T3>
struct zip_traits<T1,std::tuple<T2,T3>> {
typedef std::tuple<T1,T2,T3> type;
- typedef typename monomorphic::traits<type>::ref_type ref_type;
+ typedef typename data::traits<type>::ref_type ref_type;
static ref_type
tuple_merge(T1 const& a1, std::tuple<T2 const&,T3 const&> const& a2)
@@ -63,7 +62,7 @@ struct zip_traits<T1,std::tuple<T2,T3>> {
template<typename T1, typename T2,typename T3>
struct zip_traits<std::tuple<T1,T2>,T3> {
typedef std::tuple<T1,T2,T3> type;
- typedef typename monomorphic::traits<type>::ref_type ref_type;
+ typedef typename data::traits<type>::ref_type ref_type;
static ref_type
tuple_merge(std::tuple<T1 const&,T2 const&> const& a1, T3 const& a2)
@@ -72,8 +71,6 @@ struct zip_traits<std::tuple<T1,T2>,T3> {
}
};
-//____________________________________________________________________________//
-
} // namespace ds_detail
// ************************************************************************** //
@@ -84,82 +81,82 @@ struct zip_traits<std::tuple<T1,T2>,T3> {
//!
//! A zip of two datasets is a dataset whose arity is the sum of the operand datasets arity. The size is given by
//! the function creating the instance (see @c operator^ on datasets).
-template<typename DS1, typename DS2>
-class zip : public monomorphic::dataset<typename ds_detail::zip_traits<typename boost::decay<DS1>::type::data_type,
- typename boost::decay<DS2>::type::data_type>::type> {
- typedef typename boost::decay<DS1>::type::data_type T1;
- typedef typename boost::decay<DS2>::type::data_type T2;
+template<typename DataSet1, typename DataSet2>
+class zip {
+ typedef typename boost::decay<DataSet1>::type dataset1_decay;
+ typedef typename boost::decay<DataSet2>::type dataset2_decay;
+
+ typedef typename dataset1_decay::iterator dataset1_iter;
+ typedef typename dataset2_decay::iterator dataset2_iter;
- typedef typename monomorphic::dataset<T1>::iter_ptr ds1_iter_ptr;
- typedef typename monomorphic::dataset<T2>::iter_ptr ds2_iter_ptr;
+ typedef typename dataset1_decay::sample sample1;
+ typedef typename dataset2_decay::sample sample2;
+
+public:
+ typedef typename ds_detail::zip_traits<sample1,sample2>::type sample;
- typedef typename ds_detail::zip_traits<T1,T2>::type T;
- typedef monomorphic::dataset<T> base;
- typedef typename base::iter_ptr iter_ptr;
+ enum { arity = dataset1_decay::arity + dataset2_decay::arity };
- struct iterator : public base::iterator {
- typedef typename monomorphic::traits<T>::ref_type ref_type;
+ struct iterator {
+ typedef typename data::traits<sample>::ref_type ref_type;
// Constructor
- explicit iterator( ds1_iter_ptr iter1, ds2_iter_ptr iter2 )
- : m_iter1( iter1 )
- , m_iter2( iter2 )
+ explicit iterator( dataset1_iter iter1, dataset2_iter iter2 )
+ : m_iter1( std::move( iter1 ) )
+ , m_iter2( std::move( iter2 ) )
{}
// forward iterator interface
- virtual ref_type operator*() { return ds_detail::zip_traits<T1,T2>::tuple_merge( **m_iter1, **m_iter2 ); }
- virtual void operator++() { ++(*m_iter1); ++(*m_iter2); }
+ ref_type operator*() const { return ds_detail::zip_traits<sample1,sample2>::tuple_merge( *m_iter1, *m_iter2 ); }
+ void operator++() { ++m_iter1; ++m_iter2; }
private:
// Data members
- ds1_iter_ptr m_iter1;
- ds2_iter_ptr m_iter2;
+ dataset1_iter m_iter1;
+ dataset2_iter m_iter2;
};
-public:
- enum { arity = boost::decay<DS1>::type::arity + boost::decay<DS2>::type::arity };
-
//! Constructor
//!
//! The datasets are moved and not copied.
- zip( DS1&& ds1, DS2&& ds2, data::size_t size )
- : m_ds1( std::forward<DS1>( ds1 ) )
- , m_ds2( std::forward<DS2>( ds2 ) )
+ zip( DataSet1&& ds1, DataSet2&& ds2, data::size_t size )
+ : m_ds1( std::forward<DataSet1>( ds1 ) )
+ , m_ds2( std::forward<DataSet2>( ds2 ) )
, m_size( size )
{}
//! Move constructor
zip( zip&& j )
- : m_ds1( std::forward<DS1>( j.m_ds1 ) )
- , m_ds2( std::forward<DS2>( j.m_ds2 ) )
+ : m_ds1( std::forward<DataSet1>( j.m_ds1 ) )
+ , m_ds2( std::forward<DataSet2>( j.m_ds2 ) )
, m_size( j.m_size )
{}
// dataset interface
- virtual data::size_t size() const { return m_size; }
- virtual iter_ptr begin() const { return boost::make_shared<iterator>( m_ds1.begin(), m_ds2.begin() ); }
+ data::size_t size() const { return m_size; }
+ iterator begin() const { return iterator( m_ds1.begin(), m_ds2.begin() ); }
private:
// Data members
- DS1 m_ds1;
- DS2 m_ds2;
+ DataSet1 m_ds1;
+ DataSet2 m_ds2;
data::size_t m_size;
};
//____________________________________________________________________________//
//! Zipped datasets results in a dataset.
-template<typename DS1, typename DS2>
-struct is_dataset<zip<DS1,DS2> > : mpl::true_ {};
+template<typename DataSet1, typename DataSet2>
+struct is_dataset<zip<DataSet1,DataSet2>> : mpl::true_ {};
//____________________________________________________________________________//
namespace ds_detail {
//! Handles the sise of the resulting zipped dataset.
-template<typename DS1, typename DS2>
+template<typename DataSet1, typename DataSet2>
inline data::size_t
-zip_size( DS1&& ds1, DS2&& ds2 )
+zip_size( DataSet1&& ds1, DataSet2&& ds2 )
{
data::size_t ds1_size = ds1.size();
data::size_t ds2_size = ds2.size();
@@ -190,44 +187,45 @@ struct zip {
} // namespace result_of
-
//____________________________________________________________________________//
-
//! Overload operator for zip support
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::zip<mpl::identity<DS1>,mpl::identity<DS2>>
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<is_dataset<DataSet1>::value && is_dataset<DataSet2>::value,
+ result_of::zip<mpl::identity<DataSet1>,mpl::identity<DataSet2>>
>::type
-operator^( DS1&& ds1, DS2&& ds2 )
+operator^( DataSet1&& ds1, DataSet2&& ds2 )
{
- return zip<DS1,DS2>( std::forward<DS1>( ds1 ), std::forward<DS2>( ds2 ), ds_detail::zip_size( ds1, ds2 ) );
+ return zip<DataSet1,DataSet2>( std::forward<DataSet1>( ds1 ),
+ std::forward<DataSet2>( ds2 ),
+ ds_detail::zip_size( ds1, ds2 ) );
}
+//____________________________________________________________________________//
+
//! @overload boost::unit_test::data::monomorphic::operator^()
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<is_dataset<DS1>::value && !is_dataset<DS2>::value,
- result_of::zip<mpl::identity<DS1>,data::result_of::make<DS2>>
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<is_dataset<DataSet1>::value && !is_dataset<DataSet2>::value,
+ result_of::zip<mpl::identity<DataSet1>,data::result_of::make<DataSet2>>
>::type
-operator^( DS1&& ds1, DS2&& ds2 )
+operator^( DataSet1&& ds1, DataSet2&& ds2 )
{
- return std::forward<DS1>(ds1) ^ data::make(std::forward<DS2>(ds2));
+ return std::forward<DataSet1>( ds1 ) ^ data::make( std::forward<DataSet2>( ds2 ) );
}
+//____________________________________________________________________________//
+
//! @overload boost::unit_test::data::monomorphic::operator^()
-template<typename DS1, typename DS2>
-inline typename boost::lazy_enable_if_c<!is_dataset<DS1>::value && is_dataset<DS2>::value,
- result_of::zip<data::result_of::make<DS1>,mpl::identity<DS2>>
+template<typename DataSet1, typename DataSet2>
+inline typename boost::lazy_enable_if_c<!is_dataset<DataSet1>::value && is_dataset<DataSet2>::value,
+ result_of::zip<data::result_of::make<DataSet1>,mpl::identity<DataSet2>>
>::type
-operator^( DS1&& ds1, DS2&& ds2 )
+operator^( DataSet1&& ds1, DataSet2&& ds2 )
{
- return data::make(std::forward<DS1>(ds1)) ^ std::forward<DS2>(ds2);
+ return data::make( std::forward<DataSet1>( ds1 ) ) ^ std::forward<DataSet2>( ds2 );
}
-//____________________________________________________________________________//
-
} // namespace monomorphic
-
} // namespace data
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/data/size.hpp b/boost/test/data/size.hpp
index ddd725d26c..3e9ba96795 100644
--- a/boost/test/data/size.hpp
+++ b/boost/test/data/size.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/data/test_case.hpp b/boost/test/data/test_case.hpp
index 31a61d92ec..112be06c54 100644
--- a/boost/test/data/test_case.hpp
+++ b/boost/test/data/test_case.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -15,6 +15,7 @@
// Boost.Test
#include <boost/test/data/config.hpp>
#include <boost/test/data/dataset.hpp>
+#include <boost/test/data/for_each_sample.hpp>
// Boost
#include <boost/preprocessor/repetition/enum_params.hpp>
@@ -41,11 +42,24 @@ namespace boost {
namespace unit_test {
namespace data {
+namespace ds_detail {
+
// ************************************************************************** //
-// ************** test_case_template ************** //
+// ************** seed ************** //
// ************************************************************************** //
-namespace ds_detail {
+struct seed {
+ template<typename DataSet>
+ typename data::result_of::make<DataSet>::type
+ operator->*( DataSet&& ds ) const
+ {
+ return data::make( std::forward<DataSet>( ds ) );
+ }
+};
+
+// ************************************************************************** //
+// ************** test_case_gen ************** //
+// ************************************************************************** //
template<typename TestCase,typename DataSet>
class test_case_gen : public test_unit_generator {
@@ -152,7 +166,7 @@ BOOST_AUTO_TU_REGISTRAR( test_name )( \
boost::unit_test::data::ds_detail::make_test_case_gen<test_name>( \
BOOST_STRINGIZE( test_name ), \
__FILE__, __LINE__, \
- boost::unit_test::data::make(dataset) ), \
+ boost::unit_test::data::ds_detail::seed{} ->* dataset ), \
boost::unit_test::decorator::collector::instance() ); \
\
template<BOOST_PP_ENUM_PARAMS(arity, typename Arg)> \
diff --git a/boost/test/data/traits.hpp b/boost/test/data/traits.hpp
new file mode 100644
index 0000000000..eee52fdab5
--- /dev/null
+++ b/boost/test/data/traits.hpp
@@ -0,0 +1,87 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+/// @file
+/// Defines helper traits
+// ***************************************************************************
+
+#ifndef BOOST_TEST_DATA_TRAITS_HPP_102211GER
+#define BOOST_TEST_DATA_TRAITS_HPP_102211GER
+
+// Boost.Test
+#include <boost/test/data/config.hpp>
+#include <boost/test/data/monomorphic/fwd.hpp>
+
+// STL
+#include <tuple>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+//____________________________________________________________________________//
+
+namespace boost {
+namespace unit_test {
+namespace data {
+
+// ************************************************************************** //
+// ************** data::traits ************** //
+// ************************************************************************** //
+
+template<typename T>
+struct traits {
+ // type of the reference to sample returned by iterator
+ typedef T const& ref_type;
+
+ template<typename Action>
+ static void
+ invoke_action( ref_type arg, Action const& action )
+ {
+ action( arg );
+ }
+};
+
+//____________________________________________________________________________//
+
+// !! ?? reimplement using variadics
+template<typename T1, typename T2>
+struct traits<std::tuple<T1,T2>> {
+ // type of the reference to sample returned by iterator
+ typedef std::tuple<T1 const&,T2 const&> ref_type;
+
+ template<typename Action>
+ static void
+ invoke_action( ref_type arg, Action const& action )
+ {
+ action( std::get<0>(arg), std::get<1>(arg) );
+ }
+};
+
+//____________________________________________________________________________//
+
+template<typename T1, typename T2, typename T3>
+struct traits<std::tuple<T1,T2,T3>> {
+ // type of the reference to sample returned by iterator
+ typedef std::tuple<T1 const&,T2 const&,T3 const&> ref_type;
+
+ template<typename Action>
+ static void
+ invoke_action( ref_type arg, Action const& action )
+ {
+ action( std::get<0>(arg), std::get<1>(arg), std::get<2>(arg) );
+ }
+};
+
+//____________________________________________________________________________//
+
+} // namespace data
+} // namespace unit_test
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_DATA_TRAITS_HPP_102211GER
+
diff --git a/boost/test/debug.hpp b/boost/test/debug.hpp
index 2d367167ae..a8ccae0b97 100644
--- a/boost/test/debug.hpp
+++ b/boost/test/debug.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2006-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/debug_config.hpp b/boost/test/debug_config.hpp
index 63ceed5f1a..894d78e65a 100644
--- a/boost/test/debug_config.hpp
+++ b/boost/test/debug_config.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2006-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/detail/config.hpp b/boost/test/detail/config.hpp
index 0e0c1f2d45..db9b5d2b92 100644
--- a/boost/test/detail/config.hpp
+++ b/boost/test/detail/config.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -106,10 +106,22 @@ class type_info;
#define BOOST_TEST_MAIN BOOST_TEST_MODULE
#endif
+
+
+#ifndef BOOST_PP_VARIADICS /* we can change this only if not already defined) */
+
#ifdef __PGI
#define BOOST_PP_VARIADICS 1
#endif
+#if BOOST_CLANG
+#define BOOST_PP_VARIADICS 1
+#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 4 * 10000 + 8 * 100)
+#define BOOST_PP_VARIADICS 1
+#endif
+#endif /* ifndef BOOST_PP_VARIADICS */
#endif // BOOST_TEST_CONFIG_HPP_071894GER
diff --git a/boost/test/detail/enable_warnings.hpp b/boost/test/detail/enable_warnings.hpp
index 13fd01f445..45afb31944 100644
--- a/boost/test/detail/enable_warnings.hpp
+++ b/boost/test/detail/enable_warnings.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -26,6 +26,11 @@
# pragma warning(pop)
#endif
-#ifdef BOOST_CLANG
+#if BOOST_CLANG
#pragma clang diagnostic pop
#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 4 * 10000 + 6 * 100)
+# pragma GCC diagnostic pop
+#endif
+
diff --git a/boost/test/detail/fwd_decl.hpp b/boost/test/detail/fwd_decl.hpp
index 5f4110b096..944d52267d 100644
--- a/boost/test/detail/fwd_decl.hpp
+++ b/boost/test/detail/fwd_decl.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/detail/global_typedef.hpp b/boost/test/detail/global_typedef.hpp
index 0c71479a23..9b7653c078 100644
--- a/boost/test/detail/global_typedef.hpp
+++ b/boost/test/detail/global_typedef.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -19,13 +19,6 @@
#define BOOST_TEST_STRINGIZE( s ) BOOST_TEST_L( BOOST_STRINGIZE( s ) )
#define BOOST_TEST_EMPTY_STRING BOOST_TEST_L( "" )
-#define BOOST_TEST_SCOPE_SETCOLOR( os, attr, color ) \
- scope_setcolor const& sc = runtime_config::color_output() \
- ? scope_setcolor( os, attr, color ) \
- : scope_setcolor(); \
- ut_detail::ignore_unused_variable_warning( sc ) \
-/**/
-
#include <boost/test/detail/suppress_warnings.hpp>
//____________________________________________________________________________//
@@ -44,7 +37,7 @@ enum report_level { INV_REPORT_LEVEL, CONFIRMATION_REPORT, SHORT_REPORT, DETAIL
enum output_format { OF_INVALID,
OF_CLF, ///< compiler log format
OF_XML, ///< XML format for report and log,
- OF_DOT ///< dot format for output content
+ OF_DOT ///< dot format for output content
};
//____________________________________________________________________________//
@@ -77,6 +70,8 @@ test_id_2_unit_type( test_unit_id id )
//____________________________________________________________________________//
+} // namespace ut_detail
+
// helper templates to prevent ODR violations
template<class T>
struct static_constant {
@@ -88,8 +83,6 @@ T static_constant<T>::value;
//____________________________________________________________________________//
-} // namespace ut_detail
-
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/detail/log_level.hpp b/boost/test/detail/log_level.hpp
index 5975161773..abdecea7ec 100644
--- a/boost/test/detail/log_level.hpp
+++ b/boost/test/detail/log_level.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/detail/pp_variadic.hpp b/boost/test/detail/pp_variadic.hpp
index 3d31cd1705..a443744daa 100644
--- a/boost/test/detail/pp_variadic.hpp
+++ b/boost/test/detail/pp_variadic.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/detail/suppress_warnings.hpp b/boost/test/detail/suppress_warnings.hpp
index f667d31242..4badf20758 100644
--- a/boost/test/detail/suppress_warnings.hpp
+++ b/boost/test/detail/suppress_warnings.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -26,7 +26,13 @@
# pragma warning(disable: 4511) // 'class' : copy constructor could not be generated
#endif
-#ifdef BOOST_CLANG
-#pragma clang diagnostic push
-//#pragma clang diagnostic ignored "-Wlogical-op-parentheses"
+#if BOOST_CLANG
+# pragma clang diagnostic push
+# pragma clang diagnostic ignored "-Wvariadic-macros"
#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 4 * 10000 + 6 * 100)
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wvariadic-macros"
+#endif
+
diff --git a/boost/test/detail/throw_exception.hpp b/boost/test/detail/throw_exception.hpp
index b29b9c07dd..2fee10c2cb 100644
--- a/boost/test/detail/throw_exception.hpp
+++ b/boost/test/detail/throw_exception.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -29,34 +29,37 @@ namespace boost {
namespace unit_test {
namespace ut_detail {
-#ifdef BOOST_NO_EXCEPTION
+#ifdef BOOST_NO_EXCEPTIONS
template<typename E>
-inline int
-throw_exception(E const& e) { abort(); return 0; }
+BOOST_NORETURN inline void
+throw_exception(E const& e) { abort(); }
-#define BOOST_TEST_IMPL_TRY
-#define BOOST_TEST_IMPL_CATCH( T, var ) for(T const& var = *(T*)0; false;)
-#define BOOST_TEST_IMPL_CATCH0( T ) if(0)
-#define BOOST_TEST_IMPL_CATCHALL() if(0)
-#define BOOST_TEST_IMPL_RETHROW
+#define BOOST_TEST_I_TRY
+#define BOOST_TEST_I_CATCH( T, var ) for(T const& var = *(T*)0; false;)
+#define BOOST_TEST_I_CATCH0( T ) if(0)
+#define BOOST_TEST_I_CATCHALL() if(0)
+#define BOOST_TEST_I_RETHROW
#else
template<typename E>
-inline int
-throw_exception(E const& e) { throw e; return 0; }
-
-#define BOOST_TEST_IMPL_TRY try
-#define BOOST_TEST_IMPL_CATCH( T, var ) catch( T const& var )
-#define BOOST_TEST_IMPL_CATCH0( T ) catch( T const& )
-#define BOOST_TEST_IMPL_CATCHALL() catch(...)
-#define BOOST_TEST_IMPL_RETHROW throw
+BOOST_NORETURN inline void
+throw_exception(E const& e) { throw e; }
+
+#define BOOST_TEST_I_TRY try
+#define BOOST_TEST_I_CATCH( T, var ) catch( T const& var )
+#define BOOST_TEST_I_CATCH0( T ) catch( T const& )
+#define BOOST_TEST_I_CATCHALL() catch(...)
+#define BOOST_TEST_I_RETHROW throw
#endif
//____________________________________________________________________________//
-#define BOOST_TEST_IMPL_THROW( E ) unit_test::ut_detail::throw_exception( E )
+#define BOOST_TEST_I_THROW( E ) unit_test::ut_detail::throw_exception( E )
+#define BOOST_TEST_I_THROW( E ) unit_test::ut_detail::throw_exception( E )
+#define BOOST_TEST_I_ASSRT( cond, ex ) if( cond ) {} else BOOST_TEST_I_THROW( ex )
+
} // namespace ut_detail
} // namespace unit_test
diff --git a/boost/test/detail/workaround.hpp b/boost/test/detail/workaround.hpp
index 60a03eca61..4ba3a7e934 100644
--- a/boost/test/detail/workaround.hpp
+++ b/boost/test/detail/workaround.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/execution_monitor.hpp b/boost/test/execution_monitor.hpp
index b01137da7b..c9036be5ba 100644
--- a/boost/test/execution_monitor.hpp
+++ b/boost/test/execution_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// (C) Copyright Beman Dawes 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -415,10 +415,10 @@ public:
// translator holder interface
virtual int operator()( boost::function<int ()> const& F )
{
- BOOST_TEST_IMPL_TRY {
+ BOOST_TEST_I_TRY {
return m_next ? (*m_next)( F ) : F();
}
- BOOST_TEST_IMPL_CATCH( ExceptionType, e ) {
+ BOOST_TEST_I_CATCH( ExceptionType, e ) {
m_translator( e );
return boost::exit_exception_failure;
}
@@ -461,13 +461,11 @@ public:
// Constructor
explicit system_error( char const* exp );
- unit_test::readonly_property<long> p_errno;
- unit_test::readonly_property<char const*> p_failed_exp;
+ long const p_errno;
+ char const* const p_failed_exp;
};
-#define BOOST_TEST_SYS_ASSERT( exp ) \
- if( (exp) ) ; \
- else BOOST_TEST_IMPL_THROW( ::boost::system_error( BOOST_STRINGIZE( exp ) ) )
+#define BOOST_TEST_SYS_ASSERT( cond ) BOOST_TEST_I_ASSRT( cond, ::boost::system_error( BOOST_STRINGIZE( exp ) ) )
// ************************************************************************** //
// **************Floating point exception management interface ************** //
diff --git a/boost/test/floating_point_comparison.hpp b/boost/test/floating_point_comparison.hpp
index 8475520f32..e889274477 100644
--- a/boost/test/floating_point_comparison.hpp
+++ b/boost/test/floating_point_comparison.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/framework.hpp b/boost/test/framework.hpp
index 92716a0be0..1f5189d23c 100644
--- a/boost/test/framework.hpp
+++ b/boost/test/framework.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -120,7 +120,7 @@ BOOST_TEST_DECL void deregister_test_unit( test_unit* tu );
// This function clears up the framework mono-state.
-/// Afer this call the framework can be reinitialized to perform a second test run during the same program lifetime.
+/// After this call the framework can be reinitialized to perform a second test run during the same program lifetime.
BOOST_TEST_DECL void clear();
/// @}
@@ -254,13 +254,15 @@ struct BOOST_TEST_DECL setup_error : public std::runtime_error {
setup_error( const_string m ) : std::runtime_error( std::string( m.begin(), m.size() ) ) {}
};
-#define BOOST_TEST_SETUP_ASSERT( cond, msg ) \
- if( cond ) {} \
- else BOOST_TEST_IMPL_THROW( unit_test::framework::setup_error( msg ) )
+#define BOOST_TEST_SETUP_ASSERT( cond, msg ) BOOST_TEST_I_ASSRT( cond, unit_test::framework::setup_error( msg ) )
//____________________________________________________________________________//
-struct nothing_to_test {}; // not really an error
+struct nothing_to_test {
+ explicit nothing_to_test( int rc ) : m_result_code( rc ) {}
+
+ int m_result_code;
+};
//____________________________________________________________________________//
@@ -271,4 +273,3 @@ struct nothing_to_test {}; // not really an error
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_FRAMEWORK_HPP_020805GER
-
diff --git a/boost/test/impl/compiler_log_formatter.ipp b/boost/test/impl/compiler_log_formatter.ipp
index c1ed944ab1..c5aa6afe93 100644
--- a/boost/test/impl/compiler_log_formatter.ipp
+++ b/boost/test/impl/compiler_log_formatter.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -16,14 +16,18 @@
#define BOOST_TEST_COMPILER_LOG_FORMATTER_IPP_020105GER
// Boost.Test
+#include <boost/test/output/compiler_log_formatter.hpp>
+
#include <boost/test/framework.hpp>
#include <boost/test/execution_monitor.hpp>
+#include <boost/test/unit_test_parameters.hpp>
+
#include <boost/test/tree/test_unit.hpp>
+
#include <boost/test/utils/basic_cstring/io.hpp>
#include <boost/test/utils/lazy_ostream.hpp>
#include <boost/test/utils/setcolor.hpp>
-#include <boost/test/output/compiler_log_formatter.hpp>
-#include <boost/test/unit_test_parameters.hpp>
+
// Boost
#include <boost/version.hpp>
@@ -58,6 +62,8 @@ test_phase_identifier()
void
compiler_log_formatter::log_start( std::ostream& output, counter_t test_cases_amount )
{
+ m_color_output = runtime_config::get<bool>( runtime_config::COLOR_OUTPUT );
+
if( test_cases_amount > 0 )
output << "Running " << test_cases_amount << " test "
<< (test_cases_amount > 1 ? "cases" : "case") << "...\n";
@@ -89,7 +95,7 @@ compiler_log_formatter::log_build_info( std::ostream& output )
void
compiler_log_formatter::test_unit_start( std::ostream& output, test_unit const& tu )
{
- BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::BLUE );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, output, term_attr::BRIGHT, term_color::BLUE );
print_prefix( output, tu.p_file_name, tu.p_line_num );
@@ -101,7 +107,7 @@ compiler_log_formatter::test_unit_start( std::ostream& output, test_unit const&
void
compiler_log_formatter::test_unit_finish( std::ostream& output, test_unit const& tu, unsigned long elapsed )
{
- BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::BLUE );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, output, term_attr::BRIGHT, term_color::BLUE );
print_prefix( output, tu.p_file_name, tu.p_line_num );
@@ -123,7 +129,7 @@ compiler_log_formatter::test_unit_finish( std::ostream& output, test_unit const&
void
compiler_log_formatter::test_unit_skipped( std::ostream& output, test_unit const& tu, const_string reason )
{
- BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::YELLOW );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, output, term_attr::BRIGHT, term_color::YELLOW );
print_prefix( output, tu.p_file_name, tu.p_line_num );
@@ -140,7 +146,7 @@ compiler_log_formatter::log_exception_start( std::ostream& output, log_checkpoin
print_prefix( output, loc.m_file_name, loc.m_line_num );
{
- BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BLINK, term_color::RED );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, output, term_attr::BLINK, term_color::RED );
output << "fatal error: in \"" << (loc.m_function.is_empty() ? test_phase_identifier() : loc.m_function ) << "\": "
<< ex.what();
@@ -150,7 +156,7 @@ compiler_log_formatter::log_exception_start( std::ostream& output, log_checkpoin
output << '\n';
print_prefix( output, checkpoint_data.m_file_name, checkpoint_data.m_line_num );
- BOOST_TEST_SCOPE_SETCOLOR( output, term_attr::BRIGHT, term_color::CYAN );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, output, term_attr::BRIGHT, term_color::CYAN );
output << "last checkpoint";
if( !checkpoint_data.m_message.empty() )
@@ -171,32 +177,34 @@ compiler_log_formatter::log_exception_finish( std::ostream& output )
void
compiler_log_formatter::log_entry_start( std::ostream& output, log_entry_data const& entry_data, log_entry_types let )
{
+ using namespace utils;
+
switch( let ) {
case BOOST_UTL_ET_INFO:
print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
- if( runtime_config::color_output() )
+ if( m_color_output )
output << setcolor( term_attr::BRIGHT, term_color::GREEN );
output << "info: ";
break;
case BOOST_UTL_ET_MESSAGE:
- if( runtime_config::color_output() )
+ if( m_color_output )
output << setcolor( term_attr::BRIGHT, term_color::CYAN );
break;
case BOOST_UTL_ET_WARNING:
print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
- if( runtime_config::color_output() )
+ if( m_color_output )
output << setcolor( term_attr::BRIGHT, term_color::YELLOW );
output << "warning: in \"" << test_phase_identifier() << "\": ";
break;
case BOOST_UTL_ET_ERROR:
print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
- if( runtime_config::color_output() )
+ if( m_color_output )
output << setcolor( term_attr::BRIGHT, term_color::RED );
output << "error: in \"" << test_phase_identifier() << "\": ";
break;
case BOOST_UTL_ET_FATAL_ERROR:
print_prefix( output, entry_data.m_file_name, entry_data.m_line_num );
- if( runtime_config::color_output() )
+ if( m_color_output )
output << setcolor( term_attr::BLINK, term_color::RED );
output << "fatal error: in \"" << test_phase_identifier() << "\": ";
break;
@@ -224,8 +232,8 @@ compiler_log_formatter::log_entry_value( std::ostream& output, lazy_ostream cons
void
compiler_log_formatter::log_entry_finish( std::ostream& output )
{
- if( runtime_config::color_output() )
- output << setcolor();
+ if( m_color_output )
+ output << utils::setcolor();
output << std::endl;
}
@@ -236,8 +244,7 @@ compiler_log_formatter::log_entry_finish( std::ostream& output )
void
compiler_log_formatter::print_prefix( std::ostream& output, const_string file_name, std::size_t line_num )
{
- if( !file_name.empty() )
- {
+ if( !file_name.empty() ) {
#ifdef __APPLE_CC__
// Xcode-compatible logging format, idea by Richard Dingwall at
// <http://richarddingwall.name/2008/06/01/using-the-boost-unit-test-framework-with-xcode-3/>.
diff --git a/boost/test/impl/cpp_main.ipp b/boost/test/impl/cpp_main.ipp
index 5cab0f4274..aaa5cabfc5 100644
--- a/boost/test/impl/cpp_main.ipp
+++ b/boost/test/impl/cpp_main.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// (C) Copyright Beman Dawes 1995-2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -68,7 +68,7 @@ prg_exec_monitor_main( int (*cpp_main)( int argc, char* argv[] ), int argc, char
{
int result = 0;
- BOOST_TEST_IMPL_TRY {
+ BOOST_TEST_I_TRY {
boost::unit_test::const_string p( std::getenv( "BOOST_TEST_CATCH_SYSTEM_ERRORS" ) );
::boost::execution_monitor ex_mon;
@@ -83,11 +83,11 @@ prg_exec_monitor_main( int (*cpp_main)( int argc, char* argv[] ), int argc, char
result = ::boost::exit_failure;
}
}
- BOOST_TEST_IMPL_CATCH( ::boost::execution_exception, exex ) {
+ BOOST_TEST_I_CATCH( ::boost::execution_exception, exex ) {
std::cout << "\n**** exception(" << exex.code() << "): " << exex.what() << std::endl;
result = ::boost::exit_exception_failure;
}
- BOOST_TEST_IMPL_CATCH( ::boost::system_error, ex ) {
+ BOOST_TEST_I_CATCH( ::boost::system_error, ex ) {
std::cout << "\n**** failed to initialize execution monitor."
<< "\n**** expression at fault: " << ex.p_failed_exp
<< "\n**** error(" << ex.p_errno << "): " << std::strerror( ex.p_errno ) << std::endl;
diff --git a/boost/test/impl/debug.ipp b/boost/test/impl/debug.ipp
index 90e9d7ff2f..f4ee4971ce 100644
--- a/boost/test/impl/debug.ipp
+++ b/boost/test/impl/debug.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2006-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Use, modification, and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// http://www.boost.org/LICENSE_1_0.txt)
@@ -305,8 +305,8 @@ prepare_window_title( dbg_startup_info const& dsi )
str_t path_sep( "\\/" );
- str_t::iterator it = unit_test::find_last_of( dsi.binary_path.begin(), dsi.binary_path.end(),
- path_sep.begin(), path_sep.end() );
+ str_t::iterator it = unit_test::utils::find_last_of( dsi.binary_path.begin(), dsi.binary_path.end(),
+ path_sep.begin(), path_sep.end() );
if( it == dsi.binary_path.end() )
it = dsi.binary_path.begin();
diff --git a/boost/test/impl/decorator.ipp b/boost/test/impl/decorator.ipp
index bf17907881..74d42b22a2 100644
--- a/boost/test/impl/decorator.ipp
+++ b/boost/test/impl/decorator.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -132,10 +132,10 @@ depends_on::apply( test_unit& tu )
#if !BOOST_TEST_SUPPORT_TOKEN_ITERATOR
BOOST_TEST_SETUP_ASSERT( false, "depends_on decorator is not supported on this platform" );
#else
- string_token_iterator tit( m_dependency, (dropped_delimeters = "/", kept_delimeters = dt_none) );
+ utils::string_token_iterator tit( m_dependency, (utils::dropped_delimeters = "/", utils::kept_delimeters = utils::dt_none) );
test_unit* dep = &framework::master_test_suite();
- while( tit != string_token_iterator() ) {
+ while( tit != utils::string_token_iterator() ) {
BOOST_TEST_SETUP_ASSERT( dep->p_type == TUT_SUITE, std::string( "incorrect dependency specification " ) + m_dependency );
test_unit_id next_id = static_cast<test_suite*>(dep)->get( *tit );
diff --git a/boost/test/impl/execution_monitor.ipp b/boost/test/impl/execution_monitor.ipp
index 9929f74b53..b3e873efbe 100644
--- a/boost/test/impl/execution_monitor.ipp
+++ b/boost/test/impl/execution_monitor.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// (C) Copyright Beman Dawes and Ullrich Koethe 1995-2001.
// Use, modification, and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
@@ -243,9 +243,9 @@ report_error( execution_exception::error_code ec, boost::exception const* be, ch
va_end( *args );
- throw execution_exception( ec, buf, execution_exception::location( extract<throw_file>( be ),
- (size_t)extract<throw_line>( be ),
- extract<throw_function>( be ) ) );
+ BOOST_TEST_I_THROW(execution_exception( ec, buf, execution_exception::location( extract<throw_file>( be ),
+ (size_t)extract<throw_line>( be ),
+ extract<throw_function>( be ) ) ));
}
//____________________________________________________________________________//
@@ -869,7 +869,7 @@ execution_monitor::catch_signals( boost::function<int ()> const& F )
if( !sigsetjmp( signal_handler::jump_buffer(), 1 ) )
return detail::do_invoke( m_custom_translators , F );
else
- return BOOST_TEST_IMPL_THROW( local_signal_handler.sys_sig() );
+ BOOST_TEST_I_THROW( local_signal_handler.sys_sig() );
}
//____________________________________________________________________________//
@@ -1200,14 +1200,14 @@ execution_monitor::execute( boost::function<int ()> const& F )
if( debug::under_debugger() )
p_catch_system_errors.value = false;
- BOOST_TEST_IMPL_TRY {
+ BOOST_TEST_I_TRY {
detail::fpe_except_guard G( p_detect_fp_exceptions );
unit_test::ut_detail::ignore_unused_variable_warning( G );
return catch_signals( F );
}
-#ifndef BOOST_NO_EXCEPTION
+#ifndef BOOST_NO_EXCEPTIONS
// Catch-clause reference arguments are a bit different from function
// arguments (ISO 15.3 paragraphs 18 & 19). Apparently const isn't
@@ -1273,7 +1273,7 @@ execution_monitor::execute( boost::function<int ()> const& F )
// system errors
catch( system_error const& ex )
{ detail::report_error( execution_exception::cpp_exception_error,
- "system_error produced by: %s: %s", ex.p_failed_exp.get(), std::strerror( ex.p_errno ) ); }
+ "system_error produced by: %s: %s", ex.p_failed_exp, std::strerror( ex.p_errno ) ); }
catch( detail::system_signal_exception const& ex )
{ ex.report(); }
diff --git a/boost/test/impl/framework.ipp b/boost/test/impl/framework.ipp
index a69d95cd2d..f710828051 100644
--- a/boost/test/impl/framework.ipp
+++ b/boost/test/impl/framework.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -170,8 +170,7 @@ static void
invoke_init_func( init_unit_test_func init_func )
{
#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
- if( !(*init_func)() )
- BOOST_TEST_IMPL_THROW( std::runtime_error( "test module initialization failed" ) );
+ BOOST_TEST_I_ASSRT( (*init_func)(), std::runtime_error( "test module initialization failed" ) );
#else
test_suite* manual_test_units = (*init_func)( framework::master_test_suite().argc, framework::master_test_suite().argv );
@@ -237,11 +236,14 @@ public:
name_filter( test_unit_id_list& targ_list, const_string filter_expr ) : m_targ_list( targ_list ), m_depth( 0 )
{
#ifdef BOOST_TEST_SUPPORT_TOKEN_ITERATOR
- string_token_iterator tit( filter_expr, (dropped_delimeters = "/", kept_delimeters = dt_none) );
+ utils::string_token_iterator tit( filter_expr, (utils::dropped_delimeters = "/",
+ utils::kept_delimeters = utils::dt_none) );
- while( tit != string_token_iterator() ) {
- m_components.push_back( std::vector<component>( string_token_iterator( *tit, (dropped_delimeters = ",", kept_delimeters = dt_none) ),
- string_token_iterator() ) );
+ while( tit != utils::string_token_iterator() ) {
+ m_components.push_back(
+ std::vector<component>( utils::string_token_iterator( *tit, (utils::dropped_delimeters = ",",
+ utils::kept_delimeters = utils::dt_none) ),
+ utils::string_token_iterator() ) );
++tit;
}
@@ -390,7 +392,9 @@ parse_filters( test_unit_id master_tu_id, test_unit_id_list& tu_to_enable, test_
// 10. collect tu to enable and disable based on filters
bool had_selector_filter = false;
- BOOST_TEST_FOREACH( const_string, filter, runtime_config::test_to_run() ) {
+ std::vector<std::string> const& filters = runtime_config::get<std::vector<std::string> >( runtime_config::RUN_FILTERS );
+
+ BOOST_TEST_FOREACH( const_string, filter, filters ) {
BOOST_TEST_SETUP_ASSERT( !filter.is_empty(), "Invalid filter specification" );
enum { SELECTOR, ENABLER, DISABLER } filter_type = SELECTOR;
@@ -433,6 +437,8 @@ public:
, m_next_test_suite_id( MIN_TEST_SUITE_ID )
, m_test_in_progress( false )
, m_context_idx( 0 )
+ , m_log_sink( std::cout )
+ , m_report_sink( std::cerr )
{
}
@@ -531,12 +537,12 @@ public:
test_unit_id_list tu_to_disable;
// 10. If there are any filters supplied, figure out lists of test units to enable/disable
- bool had_selector_filter = !runtime_config::test_to_run().empty() &&
+ bool had_selector_filter = !runtime_config::get<std::vector<std::string> >( runtime_config::RUN_FILTERS ).empty() &&
parse_filters( master_tu_id, tu_to_enable, tu_to_disable );
// 20. Set the stage: either use default run status or disable all test units
- set_run_status setter( had_selector_filter ? test_unit::RS_DISABLED : test_unit::RS_INVALID );
- traverse_test_tree( master_tu_id, setter, true );
+ set_run_status initial_setter( had_selector_filter ? test_unit::RS_DISABLED : test_unit::RS_INVALID );
+ traverse_test_tree( master_tu_id, initial_setter, true );
// 30. Apply all selectors and enablers.
while( !tu_to_enable.empty() ) {
@@ -549,8 +555,8 @@ public:
continue;
// set new status and add all dependencies into tu_to_enable
- set_run_status setter( test_unit::RS_ENABLED, &tu_to_enable );
- traverse_test_tree( tu.p_id, setter, true );
+ set_run_status enabler( test_unit::RS_ENABLED, &tu_to_enable );
+ traverse_test_tree( tu.p_id, enabler, true );
}
// 40. Apply all disablers
@@ -563,8 +569,8 @@ public:
if( !tu.is_enabled() )
continue;
- set_run_status setter( test_unit::RS_DISABLED );
- traverse_test_tree( tu.p_id, setter, true );
+ set_run_status disabler( test_unit::RS_DISABLED );
+ traverse_test_tree( tu.p_id, disabler, true );
}
// 50. Make sure parents of enabled test units are also enabled
@@ -627,7 +633,7 @@ public:
if( tu.p_type == TUT_SUITE ) {
test_suite const& ts = static_cast<test_suite const&>( tu );
- if( runtime_config::random_seed() == 0 ) {
+ if( runtime_config::get<unsigned>( runtime_config::RANDOM_SEED ) == 0 ) {
typedef std::pair<counter_t,test_unit_id> value_type;
BOOST_TEST_FOREACH( value_type, chld, ts.m_ranked_children ) {
@@ -768,6 +774,9 @@ public:
int m_context_idx;
boost::execution_monitor m_aux_em;
+
+ runtime_config::stream_holder m_log_sink;
+ runtime_config::stream_holder m_report_sink;
};
//____________________________________________________________________________//
@@ -802,41 +811,48 @@ setup_for_execution( test_unit const& tu )
void
init( init_unit_test_func init_func, int argc, char* argv[] )
{
+ using namespace impl;
+
// 10. Set up runtime parameters
runtime_config::init( argc, argv );
- // 20. Set the desired log level and format
- unit_test_log.set_threshold_level( runtime_config::log_level() );
- unit_test_log.set_format( runtime_config::log_format() );
+ // 20. Set the desired log level, format and sink
+ unit_test_log.set_threshold_level( runtime_config::get<log_level>( runtime_config::LOG_LEVEL ) );
+ unit_test_log.set_format( runtime_config::get<output_format>( runtime_config::LOG_FORMAT ) );
+ s_frk_state().m_log_sink.setup( runtime_config::LOG_SINK );
+ unit_test_log.set_stream( s_frk_state().m_log_sink.ref() );
- // 30. Set the desired report level and format
- results_reporter::set_level( runtime_config::report_level() );
- results_reporter::set_format( runtime_config::report_format() );
+ // 30. Set the desired report level, format and sink
+ results_reporter::set_level( runtime_config::get<report_level>( runtime_config::REPORT_LEVEL ) );
+ results_reporter::set_format( runtime_config::get<output_format>( runtime_config::REPORT_FORMAT ) );
+ s_frk_state().m_report_sink.setup( runtime_config::REPORT_SINK );
+ results_reporter::set_stream( s_frk_state().m_report_sink.ref() );
// 40. Register default test observers
register_observer( results_collector );
register_observer( unit_test_log );
- if( runtime_config::show_progress() )
+ if( runtime_config::get<bool>( runtime_config::SHOW_PROGRESS ) ) {
+ progress_monitor.set_stream( s_frk_state().m_log_sink.ref() );
register_observer( progress_monitor );
+ }
// 50. Set up memory leak detection
- if( runtime_config::detect_memory_leaks() > 0 ) {
- debug::detect_memory_leaks( true, runtime_config::memory_leaks_report_file() );
- debug::break_memory_alloc( runtime_config::detect_memory_leaks() );
+ unsigned long detect_mem_leak = runtime_config::get<unsigned long>( runtime_config::DETECT_MEM_LEAKS );
+ if( detect_mem_leak > 0 ) {
+ debug::detect_memory_leaks( true, runtime_config::get<std::string>( runtime_config::REPORT_MEM_LEAKS ) );
+ debug::break_memory_alloc( (long)detect_mem_leak );
}
// 60. Initialize master unit test suite
master_test_suite().argc = argc;
master_test_suite().argv = argv;
- using namespace impl;
-
// 70. Invoke test module initialization routine
- BOOST_TEST_IMPL_TRY {
+ BOOST_TEST_I_TRY {
s_frk_state().m_aux_em.vexecute( boost::bind( &impl::invoke_init_func, init_func ) );
}
- BOOST_TEST_IMPL_CATCH( execution_exception, ex ) {
+ BOOST_TEST_I_CATCH( execution_exception, ex ) {
BOOST_TEST_SETUP_ASSERT( false, ex.what() );
}
}
@@ -1157,8 +1173,7 @@ get( test_unit_id id, test_unit_type t )
{
test_unit* res = impl::s_frk_state().m_test_units[id];
- if( (res->p_type & t) == 0 )
- BOOST_TEST_IMPL_THROW( internal_error( "Invalid test unit type" ) );
+ BOOST_TEST_I_ASSRT( (res->p_type & t) != 0, internal_error( "Invalid test unit type" ) );
return *res;
}
@@ -1181,7 +1196,7 @@ run( test_unit_id id, bool continue_test )
test_case_counter tcc;
traverse_test_tree( id, tcc );
- BOOST_TEST_SETUP_ASSERT( tcc.p_count != 0 , runtime_config::test_to_run().empty()
+ BOOST_TEST_SETUP_ASSERT( tcc.p_count != 0 , runtime_config::get<std::vector<std::string> >( runtime_config::RUN_FILTERS ).empty()
? BOOST_TEST_L( "test tree is empty" )
: BOOST_TEST_L( "no test cases matching filter or all test cases were disabled" ) );
@@ -1192,27 +1207,24 @@ run( test_unit_id id, bool continue_test )
if( call_start_finish ) {
BOOST_TEST_FOREACH( test_observer*, to, impl::s_frk_state().m_observers ) {
- BOOST_TEST_IMPL_TRY {
+ BOOST_TEST_I_TRY {
impl::s_frk_state().m_aux_em.vexecute( boost::bind( &test_observer::test_start, to, tcc.p_count ) );
}
- BOOST_TEST_IMPL_CATCH( execution_exception, ex ) {
+ BOOST_TEST_I_CATCH( execution_exception, ex ) {
BOOST_TEST_SETUP_ASSERT( false, ex.what() );
}
}
}
- switch( runtime_config::random_seed() ) {
+ unsigned seed = runtime_config::get<unsigned>( runtime_config::RANDOM_SEED );
+ switch( seed ) {
case 0:
break;
- case 1: {
- unsigned seed = static_cast<unsigned>( std::time( 0 ) );
+ case 1:
+ seed = static_cast<unsigned>( std::time( 0 ) );
+ default:
BOOST_TEST_MESSAGE( "Test cases order is shuffled using seed: " << seed );
std::srand( seed );
- break;
- }
- default:
- BOOST_TEST_MESSAGE( "Test cases order is shuffled using seed: " << runtime_config::random_seed() );
- std::srand( runtime_config::random_seed() );
}
impl::s_frk_state().execute_test_tree( id );
diff --git a/boost/test/impl/plain_report_formatter.ipp b/boost/test/impl/plain_report_formatter.ipp
index f9e7db772a..262083eeaa 100644
--- a/boost/test/impl/plain_report_formatter.ipp
+++ b/boost/test/impl/plain_report_formatter.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -19,14 +19,13 @@
#include <boost/test/output/plain_report_formatter.hpp>
#include <boost/test/utils/custom_manip.hpp>
#include <boost/test/results_collector.hpp>
+#include <boost/test/unit_test_parameters.hpp>
#include <boost/test/tree/test_unit.hpp>
#include <boost/test/utils/basic_cstring/io.hpp>
#include <boost/test/utils/setcolor.hpp>
-#include <boost/test/unit_test_parameters.hpp>
-
// STL
#include <iomanip>
#include <boost/config/no_tr1/cmath.hpp>
@@ -46,11 +45,11 @@ namespace output {
namespace {
-typedef custom_manip<struct quote_t> quote;
+typedef utils::custom_manip<struct quote_t> quote;
template<typename T>
inline std::ostream&
-operator<<( custom_printer<quote> const& p, T const& value )
+operator<<( utils::custom_printer<quote> const& p, T const& value )
{
*p << '"' << value << '"';
@@ -84,6 +83,7 @@ void
plain_report_formatter::results_report_start( std::ostream& ostr )
{
m_indent = 0;
+ m_color_output = runtime_config::get<bool>( runtime_config::COLOR_OUTPUT );
ostr << '\n';
}
@@ -160,13 +160,13 @@ plain_report_formatter::do_confirmation_report( test_unit const& tu, std::ostrea
test_results const& tr = results_collector.results( tu.p_id );
if( tr.passed() ) {
- BOOST_TEST_SCOPE_SETCOLOR( ostr, term_attr::BRIGHT, term_color::GREEN );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, ostr, term_attr::BRIGHT, term_color::GREEN );
ostr << "*** No errors detected\n";
return;
}
- BOOST_TEST_SCOPE_SETCOLOR( ostr, term_attr::BRIGHT, term_color::RED );
+ BOOST_TEST_SCOPE_SETCOLOR( m_color_output, ostr, term_attr::BRIGHT, term_color::RED );
if( tr.p_skipped ) {
ostr << "*** The test " << tu.p_type_name << ' ' << quote() << tu.full_name() << " was skipped"
diff --git a/boost/test/impl/progress_monitor.ipp b/boost/test/impl/progress_monitor.ipp
index ebdd7e9320..7fb3baf8f0 100644
--- a/boost/test/impl/progress_monitor.ipp
+++ b/boost/test/impl/progress_monitor.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -17,8 +17,8 @@
// Boost.Test
#include <boost/test/progress_monitor.hpp>
-
#include <boost/test/unit_test_parameters.hpp>
+
#include <boost/test/utils/setcolor.hpp>
#include <boost/test/tree/test_unit.hpp>
@@ -102,15 +102,21 @@ namespace {
struct progress_monitor_impl {
// Constructor
progress_monitor_impl()
- : m_stream( runtime_config::log_sink() )
- {}
+ : m_stream( &std::cout )
+ , m_color_output( false )
+ {
+ }
- std::ostream* m_stream;
- scoped_ptr<progress_display> m_progress_display;
+ std::ostream* m_stream;
+ scoped_ptr<progress_display> m_progress_display;
+ bool m_color_output;
};
progress_monitor_impl& s_pm_impl() { static progress_monitor_impl the_inst; return the_inst; }
+#define PM_SCOPED_COLOR() \
+ BOOST_TEST_SCOPE_SETCOLOR( s_pm_impl().m_color_output, *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA )
+
} // local namespace
//____________________________________________________________________________//
@@ -118,7 +124,9 @@ progress_monitor_impl& s_pm_impl() { static progress_monitor_impl the_inst; retu
void
progress_monitor_t::test_start( counter_t test_cases_amount )
{
- BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+ s_pm_impl().m_color_output = runtime_config::get<bool>( runtime_config::COLOR_OUTPUT );
+
+ PM_SCOPED_COLOR();
s_pm_impl().m_progress_display.reset( new progress_display( test_cases_amount, *s_pm_impl().m_stream ) );
}
@@ -128,7 +136,7 @@ progress_monitor_t::test_start( counter_t test_cases_amount )
void
progress_monitor_t::test_aborted()
{
- BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+ PM_SCOPED_COLOR();
(*s_pm_impl().m_progress_display) += s_pm_impl().m_progress_display->count();
}
@@ -138,7 +146,7 @@ progress_monitor_t::test_aborted()
void
progress_monitor_t::test_unit_finish( test_unit const& tu, unsigned long )
{
- BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+ PM_SCOPED_COLOR();
if( tu.p_type == TUT_CASE )
++(*s_pm_impl().m_progress_display);
@@ -149,7 +157,7 @@ progress_monitor_t::test_unit_finish( test_unit const& tu, unsigned long )
void
progress_monitor_t::test_unit_skipped( test_unit const& tu, const_string /*reason*/ )
{
- BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA );
+ PM_SCOPED_COLOR();
test_case_counter tcc;
traverse_test_tree( tu, tcc );
@@ -167,6 +175,8 @@ progress_monitor_t::set_stream( std::ostream& ostr )
//____________________________________________________________________________//
+#undef PM_SCOPED_COLOR
+
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/impl/results_collector.ipp b/boost/test/impl/results_collector.ipp
index d04d64fd6d..17a31955ea 100644
--- a/boost/test/impl/results_collector.ipp
+++ b/boost/test/impl/results_collector.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/impl/results_reporter.ipp b/boost/test/impl/results_reporter.ipp
index 885295c928..87c1172e12 100644
--- a/boost/test/impl/results_reporter.ipp
+++ b/boost/test/impl/results_reporter.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -19,6 +19,7 @@
#include <boost/test/results_reporter.hpp>
#include <boost/test/results_collector.hpp>
#include <boost/test/framework.hpp>
+
#include <boost/test/output/plain_report_formatter.hpp>
#include <boost/test/output/xml_report_formatter.hpp>
@@ -26,8 +27,6 @@
#include <boost/test/tree/test_unit.hpp>
#include <boost/test/tree/traverse.hpp>
-#include <boost/test/unit_test_parameters.hpp>
-
// Boost
#include <boost/scoped_ptr.hpp>
#include <boost/io/ios_state.hpp>
@@ -53,8 +52,8 @@ namespace {
struct results_reporter_impl : test_tree_visitor {
// Constructor
results_reporter_impl()
- : m_output( runtime_config::report_sink() )
- , m_stream_state_saver( new io_saver_type( *m_output ) )
+ : m_stream( &std::cerr )
+ , m_stream_state_saver( new io_saver_type( std::cerr ) )
, m_report_level( CONFIRMATION_REPORT )
, m_formatter( new output::plain_report_formatter )
{}
@@ -62,28 +61,28 @@ struct results_reporter_impl : test_tree_visitor {
// test tree visitor interface implementation
void visit( test_case const& tc )
{
- m_formatter->test_unit_report_start( tc, *m_output );
- m_formatter->test_unit_report_finish( tc, *m_output );
+ m_formatter->test_unit_report_start( tc, *m_stream );
+ m_formatter->test_unit_report_finish( tc, *m_stream );
}
bool test_suite_start( test_suite const& ts )
{
- m_formatter->test_unit_report_start( ts, *m_output );
+ m_formatter->test_unit_report_start( ts, *m_stream );
if( m_report_level == DETAILED_REPORT && !results_collector.results( ts.p_id ).p_skipped )
return true;
- m_formatter->test_unit_report_finish( ts, *m_output );
+ m_formatter->test_unit_report_finish( ts, *m_stream );
return false;
}
void test_suite_finish( test_suite const& ts )
{
- m_formatter->test_unit_report_finish( ts, *m_output );
+ m_formatter->test_unit_report_finish( ts, *m_stream );
}
typedef scoped_ptr<io_saver_type> saver_ptr;
// Data members
- std::ostream* m_output;
+ std::ostream* m_stream;
saver_ptr m_stream_state_saver;
report_level m_report_level;
scoped_ptr<format> m_formatter;
@@ -109,7 +108,7 @@ set_level( report_level l )
void
set_stream( std::ostream& ostr )
{
- s_rr_impl().m_output = &ostr;
+ s_rr_impl().m_stream = &ostr;
s_rr_impl().m_stream_state_saver.reset( new io_saver_type( ostr ) );
}
@@ -118,7 +117,7 @@ set_stream( std::ostream& ostr )
std::ostream&
get_stream()
{
- return *s_rr_impl().m_output;
+ return *s_rr_impl().m_stream;
}
//____________________________________________________________________________//
@@ -169,11 +168,11 @@ make_report( report_level l, test_unit_id id )
report_level bkup = s_rr_impl().m_report_level;
s_rr_impl().m_report_level = l;
- s_rr_impl().m_formatter->results_report_start( *s_rr_impl().m_output );
+ s_rr_impl().m_formatter->results_report_start( *s_rr_impl().m_stream );
switch( l ) {
case CONFIRMATION_REPORT:
- s_rr_impl().m_formatter->do_confirmation_report( framework::get<test_unit>( id ), *s_rr_impl().m_output );
+ s_rr_impl().m_formatter->do_confirmation_report( framework::get<test_unit>( id ), *s_rr_impl().m_stream );
break;
case SHORT_REPORT:
case DETAILED_REPORT:
@@ -183,7 +182,7 @@ make_report( report_level l, test_unit_id id )
break;
}
- s_rr_impl().m_formatter->results_report_finish( *s_rr_impl().m_output );
+ s_rr_impl().m_formatter->results_report_finish( *s_rr_impl().m_stream );
s_rr_impl().m_report_level = bkup;
}
diff --git a/boost/test/impl/test_main.ipp b/boost/test/impl/test_main.ipp
index c95c91e88b..6adc5bb9c2 100644
--- a/boost/test/impl/test_main.ipp
+++ b/boost/test/impl/test_main.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// (C) Copyright Beman Dawes 1995-2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
diff --git a/boost/test/impl/test_tools.ipp b/boost/test/impl/test_tools.ipp
index 03fea91605..ed94da3a5b 100644
--- a/boost/test/impl/test_tools.ipp
+++ b/boost/test/impl/test_tools.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -294,9 +294,8 @@ report_assertion( assertion_result const& ar,
{
using namespace unit_test;
- if( framework::current_test_case_id() == INV_TEST_UNIT_ID )
- BOOST_TEST_IMPL_THROW(
- std::runtime_error( "can't use testing tools outside of test case implementation" ) );
+ BOOST_TEST_I_ASSRT( framework::current_test_case_id() != INV_TEST_UNIT_ID,
+ std::runtime_error( "Can't use testing tools outside of test case implementation." ) );
if( !!ar )
tl = PASS;
@@ -357,7 +356,7 @@ report_assertion( assertion_result const& ar,
framework::test_unit_aborted( framework::current_test_case() );
- BOOST_TEST_IMPL_THROW( execution_aborted() );
+ BOOST_TEST_I_THROW( execution_aborted() );
}
return true;
diff --git a/boost/test/impl/test_tree.ipp b/boost/test/impl/test_tree.ipp
index 712cb9ee42..d45f7b32b5 100644
--- a/boost/test/impl/test_tree.ipp
+++ b/boost/test/impl/test_tree.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -39,10 +39,6 @@
#include <boost/test/detail/suppress_warnings.hpp>
-#if BOOST_WORKAROUND(__BORLANDC__, < 0x600) && BOOST_WORKAROUND(_STLPORT_VERSION, <= 0x450)
- using std::rand; // rand is in std and random_shuffle is in _STL
-#endif
-
//____________________________________________________________________________//
namespace boost {
@@ -141,8 +137,13 @@ test_unit::check_preconditions() const
BOOST_TEST_FOREACH( precondition_t, precondition, p_preconditions.get() ) {
test_tools::assertion_result res = precondition( p_id );
- if( !res )
- return res;
+ if( !res ) {
+ test_tools::assertion_result res_out(false);
+ res_out.message() << "precondition failed";
+ if( !res.has_empty_message() )
+ res_out.message() << ": " << res.message();
+ return res_out;
+ }
}
return true;
diff --git a/boost/test/impl/unit_test_log.ipp b/boost/test/impl/unit_test_log.ipp
index f202f5027d..4c9ac40691 100644
--- a/boost/test/impl/unit_test_log.ipp
+++ b/boost/test/impl/unit_test_log.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -20,7 +20,6 @@
#include <boost/test/unit_test_log_formatter.hpp>
#include <boost/test/execution_monitor.hpp>
#include <boost/test/framework.hpp>
-
#include <boost/test/unit_test_parameters.hpp>
#include <boost/test/utils/basic_cstring/compare.hpp>
@@ -85,8 +84,8 @@ namespace {
struct unit_test_log_impl {
// Constructor
unit_test_log_impl()
- : m_stream( runtime_config::log_sink() )
- , m_stream_state_saver( new io_saver_type( *m_stream ) )
+ : m_stream( &std::cout )
+ , m_stream_state_saver( new io_saver_type( std::cout ) )
, m_threshold_level( log_all_errors )
, m_log_formatter( new output::compiler_log_formatter )
{
@@ -110,11 +109,14 @@ struct unit_test_log_impl {
log_checkpoint_data m_checkpoint_data;
// helper functions
- std::ostream& stream() { return *m_stream; }
+ std::ostream& stream()
+ {
+ return *m_stream;
+ }
void set_checkpoint( const_string file, std::size_t line_num, const_string msg )
{
assign_op( m_checkpoint_data.m_message, msg, 0 );
- m_checkpoint_data.m_file_name = file;
+ m_checkpoint_data.m_file_name = file;
m_checkpoint_data.m_line_num = line_num;
}
};
@@ -133,7 +135,7 @@ unit_test_log_t::test_start( counter_t test_cases_amount )
s_log_impl().m_log_formatter->log_start( s_log_impl().stream(), test_cases_amount );
- if( runtime_config::show_build_info() )
+ if( runtime_config::get<bool>( runtime_config::BUILD_INFO ) )
s_log_impl().m_log_formatter->log_build_info( s_log_impl().stream() );
s_log_impl().m_entry_in_progress = false;
diff --git a/boost/test/impl/unit_test_main.ipp b/boost/test/impl/unit_test_main.ipp
index 327e14de30..1f30c0213e 100644
--- a/boost/test/impl/unit_test_main.ipp
+++ b/boost/test/impl/unit_test_main.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -102,7 +102,7 @@ private:
m_os << ",fontname=Helvetica";
- m_os << (tu.is_enabled() ? ",color=green" : ",color=yellow");
+ m_os << (tu.p_default_status == test_unit::RS_ENABLED ? ",color=green" : ",color=yellow");
if( master_ts )
m_os << ",label=\"" << tu.p_name << "\"];\n";
@@ -185,10 +185,10 @@ unit_test_main( init_unit_test_func init_func, int argc, char* argv[] )
{
int result_code = 0;
- BOOST_TEST_IMPL_TRY {
+ BOOST_TEST_I_TRY {
framework::init( init_func, argc, argv );
- if( runtime_config::wait_for_debugger() ) {
+ if( runtime_config::get<bool>( runtime_config::WAIT_FOR_DEBUGGER ) ) {
results_reporter::get_stream() << "Press any key to continue..." << std::endl;
std::getchar();
@@ -197,8 +197,9 @@ unit_test_main( init_unit_test_func init_func, int argc, char* argv[] )
framework::finalize_setup_phase();
- if( runtime_config::list_content() != unit_test::OF_INVALID ) {
- if( runtime_config::list_content() == unit_test::OF_DOT ) {
+ output_format list_cont = runtime_config::get<output_format>( runtime_config::LIST_CONTENT );
+ if( list_cont != unit_test::OF_INVALID ) {
+ if( list_cont == unit_test::OF_DOT ) {
ut_detail::dot_content_reporter reporter( results_reporter::get_stream() );
traverse_test_tree( framework::master_test_suite().p_id, reporter, true );
@@ -212,7 +213,7 @@ unit_test_main( init_unit_test_func init_func, int argc, char* argv[] )
return boost::exit_success;
}
- if( runtime_config::list_labels() ) {
+ if( runtime_config::get<bool>( runtime_config::LIST_LABELS ) ) {
ut_detail::labels_collector collector;
traverse_test_tree( framework::master_test_suite().p_id, collector, true );
@@ -229,24 +230,24 @@ unit_test_main( init_unit_test_func init_func, int argc, char* argv[] )
results_reporter::make_report();
- result_code = runtime_config::no_result_code()
+ result_code = !runtime_config::get<bool>( runtime_config::RESULT_CODE )
? boost::exit_success
: results_collector.results( framework::master_test_suite().p_id ).result_code();
}
- BOOST_TEST_IMPL_CATCH0( framework::nothing_to_test ) {
- result_code = boost::exit_success;
+ BOOST_TEST_I_CATCH( framework::nothing_to_test, ex ) {
+ result_code = ex.m_result_code;
}
- BOOST_TEST_IMPL_CATCH( framework::internal_error, ex ) {
+ BOOST_TEST_I_CATCH( framework::internal_error, ex ) {
results_reporter::get_stream() << "Boost.Test framework internal error: " << ex.what() << std::endl;
result_code = boost::exit_exception_failure;
}
- BOOST_TEST_IMPL_CATCH( framework::setup_error, ex ) {
+ BOOST_TEST_I_CATCH( framework::setup_error, ex ) {
results_reporter::get_stream() << "Test setup error: " << ex.what() << std::endl;
result_code = boost::exit_exception_failure;
}
- BOOST_TEST_IMPL_CATCHALL() {
+ BOOST_TEST_I_CATCHALL() {
results_reporter::get_stream() << "Boost.Test framework internal error: unknown reason" << std::endl;
result_code = boost::exit_exception_failure;
diff --git a/boost/test/impl/unit_test_monitor.ipp b/boost/test/impl/unit_test_monitor.ipp
index 8c931f203f..304c8f1c04 100644
--- a/boost/test/impl/unit_test_monitor.ipp
+++ b/boost/test/impl/unit_test_monitor.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -36,16 +36,16 @@ namespace unit_test {
unit_test_monitor_t::error_level
unit_test_monitor_t::execute_and_translate( boost::function<void ()> const& func, unsigned timeout )
{
- BOOST_TEST_IMPL_TRY {
- p_catch_system_errors.value = runtime_config::catch_sys_errors();
+ BOOST_TEST_I_TRY {
+ p_catch_system_errors.value = runtime_config::get<bool>( runtime_config::CATCH_SYS_ERRORS );
p_timeout.value = timeout;
- p_auto_start_dbg.value = runtime_config::auto_start_dbg();
- p_use_alt_stack.value = runtime_config::use_alt_stack();
- p_detect_fp_exceptions.value = runtime_config::detect_fp_exceptions();
+ p_auto_start_dbg.value = runtime_config::get<bool>( runtime_config::AUTO_START_DBG );
+ p_use_alt_stack.value = runtime_config::get<bool>( runtime_config::USE_ALT_STACK );
+ p_detect_fp_exceptions.value = runtime_config::get<bool>( runtime_config::DETECT_FP_EXCEPT );
vexecute( func );
}
- BOOST_TEST_IMPL_CATCH( execution_exception, ex ) {
+ BOOST_TEST_I_CATCH( execution_exception, ex ) {
framework::exception_caught( ex );
framework::test_unit_aborted( framework::current_test_case() );
diff --git a/boost/test/impl/unit_test_parameters.ipp b/boost/test/impl/unit_test_parameters.ipp
index 2ffa495e67..3ca183e400 100644
--- a/boost/test/impl/unit_test_parameters.ipp
+++ b/boost/test/impl/unit_test_parameters.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -20,36 +20,32 @@
// Boost.Test
#include <boost/test/unit_test_parameters.hpp>
+
#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
#include <boost/test/utils/basic_cstring/compare.hpp>
#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/fixed_mapping.hpp>
+
#include <boost/test/debug.hpp>
#include <boost/test/framework.hpp>
+#include <boost/test/detail/log_level.hpp>
#include <boost/test/detail/throw_exception.hpp>
// Boost.Runtime.Param
-#include <boost/test/utils/runtime/cla/dual_name_parameter.hpp>
+#include <boost/test/utils/runtime/parameter.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+#include <boost/test/utils/runtime/finalize.hpp>
#include <boost/test/utils/runtime/cla/parser.hpp>
-
-namespace rt = boost::runtime;
-namespace cla = rt::cla;
-
-#ifndef UNDER_CE
-#include <boost/test/utils/runtime/env/variable.hpp>
-
-namespace env = rt::env;
-#endif
+#include <boost/test/utils/runtime/env/fetch.hpp>
// Boost
#include <boost/config.hpp>
#include <boost/test/detail/suppress_warnings.hpp>
-#include <boost/lexical_cast.hpp>
#include <boost/test/detail/enable_warnings.hpp>
+#include <boost/optional.hpp>
+#include <boost/cstdlib.hpp>
// STL
-#include <map>
#include <cstdlib>
#include <iostream>
#include <fstream>
@@ -65,85 +61,7 @@ namespace std { using ::getenv; using ::strncmp; using ::strcmp; }
namespace boost {
namespace unit_test {
-// ************************************************************************** //
-// ************** input operations for unit_test's enums ************** //
-// ************************************************************************** //
-
-std::istream&
-operator>>( std::istream& in, unit_test::log_level& ll )
-{
- static fixed_mapping<const_string,unit_test::log_level,case_ins_less<char const> > log_level_name(
- "all" , log_successful_tests,
- "success" , log_successful_tests,
- "test_suite" , log_test_units,
- "unit_scope" , log_test_units,
- "message" , log_messages,
- "warning" , log_warnings,
- "error" , log_all_errors,
- "cpp_exception" , log_cpp_exception_errors,
- "system_error" , log_system_errors,
- "fatal_error" , log_fatal_errors,
- "nothing" , log_nothing,
-
- invalid_log_level
- );
-
- std::string val;
- in >> val;
-
- ll = log_level_name[val];
- BOOST_TEST_SETUP_ASSERT( ll != unit_test::invalid_log_level, "invalid log level " + val );
-
- return in;
-}
-
-//____________________________________________________________________________//
-
-std::istream&
-operator>>( std::istream& in, unit_test::report_level& rl )
-{
- fixed_mapping<const_string,unit_test::report_level,case_ins_less<char const> > report_level_name (
- "confirm", CONFIRMATION_REPORT,
- "short", SHORT_REPORT,
- "detailed", DETAILED_REPORT,
- "no", NO_REPORT,
-
- INV_REPORT_LEVEL
- );
-
- std::string val;
- in >> val;
-
- rl = report_level_name[val];
- BOOST_TEST_SETUP_ASSERT( rl != INV_REPORT_LEVEL, "invalid report level " + val );
-
- return in;
-}
-
-//____________________________________________________________________________//
-
-std::istream&
-operator>>( std::istream& in, unit_test::output_format& of )
-{
- fixed_mapping<const_string,unit_test::output_format,case_ins_less<char const> > output_format_name (
- "HRF", unit_test::OF_CLF,
- "CLF", unit_test::OF_CLF,
- "XML", unit_test::OF_XML,
- "DOT", unit_test::OF_DOT,
-
- unit_test::OF_INVALID
- );
-
- std::string val;
- in >> val;
-
- of = output_format_name[val];
- BOOST_TEST_SETUP_ASSERT( of != unit_test::OF_INVALID, "invalid output format " + val );
-
- return in;
-}
-
-//____________________________________________________________________________//
+namespace rt = boost::runtime;
// ************************************************************************** //
// ************** runtime_config ************** //
@@ -151,9 +69,7 @@ operator>>( std::istream& in, unit_test::output_format& of )
namespace runtime_config {
-namespace {
-
-// framework parameters and corresponding command-line arguments
+// UTF parameters
std::string AUTO_START_DBG = "auto_start_dbg";
std::string BREAK_EXEC_PATH = "break_exec_path";
std::string BUILD_INFO = "build_info";
@@ -170,463 +86,636 @@ std::string OUTPUT_FORMAT = "output_format";
std::string RANDOM_SEED = "random";
std::string REPORT_FORMAT = "report_format";
std::string REPORT_LEVEL = "report_level";
+std::string REPORT_MEM_LEAKS = "report_memory_leaks_to";
std::string REPORT_SINK = "report_sink";
std::string RESULT_CODE = "result_code";
-std::string TESTS_TO_RUN = "run_test";
+std::string RUN_FILTERS = "run_test";
std::string SAVE_TEST_PATTERN = "save_pattern";
std::string SHOW_PROGRESS = "show_progress";
std::string USE_ALT_STACK = "use_alt_stack";
std::string WAIT_FOR_DEBUGGER = "wait_for_debugger";
-static const_string
-parameter_2_env_var( const_string param_name )
-{
- typedef std::map<const_string,const_string> mtype;
- static mtype s_mapping;
-
- if( s_mapping.empty() ) {
- s_mapping[AUTO_START_DBG] = "BOOST_TEST_AUTO_START_DBG";
- s_mapping[BREAK_EXEC_PATH] = "BOOST_TEST_BREAK_EXEC_PATH";
- s_mapping[BUILD_INFO] = "BOOST_TEST_BUILD_INFO";
- s_mapping[CATCH_SYS_ERRORS] = "BOOST_TEST_CATCH_SYSTEM_ERRORS";
- s_mapping[COLOR_OUTPUT] = "BOOST_TEST_COLOR_OUTPUT";
- s_mapping[DETECT_FP_EXCEPT] = "BOOST_TEST_DETECT_FP_EXCEPTIONS";
- s_mapping[DETECT_MEM_LEAKS] = "BOOST_TEST_DETECT_MEMORY_LEAK";
- s_mapping[LIST_CONTENT] = "BOOST_TEST_LIST_CONTENT";
- s_mapping[LIST_CONTENT] = "BOOST_TEST_LIST_LABELS";
- s_mapping[LOG_FORMAT] = "BOOST_TEST_LOG_FORMAT";
- s_mapping[LOG_LEVEL] = "BOOST_TEST_LOG_LEVEL";
- s_mapping[LOG_SINK] = "BOOST_TEST_LOG_SINK";
- s_mapping[OUTPUT_FORMAT] = "BOOST_TEST_OUTPUT_FORMAT";
- s_mapping[RANDOM_SEED] = "BOOST_TEST_RANDOM";
- s_mapping[REPORT_FORMAT] = "BOOST_TEST_REPORT_FORMAT";
- s_mapping[REPORT_LEVEL] = "BOOST_TEST_REPORT_LEVEL";
- s_mapping[REPORT_SINK] = "BOOST_TEST_REPORT_SINK";
- s_mapping[RESULT_CODE] = "BOOST_TEST_RESULT_CODE";
- s_mapping[TESTS_TO_RUN] = "BOOST_TESTS_TO_RUN";
- s_mapping[SAVE_TEST_PATTERN] = "BOOST_TEST_SAVE_PATTERN";
- s_mapping[SHOW_PROGRESS] = "BOOST_TEST_SHOW_PROGRESS";
- s_mapping[USE_ALT_STACK] = "BOOST_TEST_USE_ALT_STACK";
- s_mapping[WAIT_FOR_DEBUGGER] = "BOOST_TEST_WAIT_FOR_DEBUGGER";
- }
-
- mtype::const_iterator it = s_mapping.find( param_name );
-
- return it == s_mapping.end() ? const_string() : it->second;
-}
-
-//____________________________________________________________________________//
-
-// storage for the CLAs
-cla::parser s_cla_parser;
-std::string s_empty;
-
-output_format s_report_format;
-output_format s_log_format;
-
-std::list<std::string> s_test_to_run;
+std::string HELP = "help";
+std::string USAGE = "usage";
//____________________________________________________________________________//
-template<typename T>
-T
-retrieve_parameter( const_string parameter_name, cla::parser const& s_cla_parser, T const& default_value = T(), T const& optional_value = T() )
-{
- rt::const_argument_ptr arg = s_cla_parser[parameter_name];
- if( arg ) {
- if( rtti::type_id<T>() == rtti::type_id<bool>() ||
- !static_cast<cla::parameter const&>( arg->p_formal_parameter.get() ).p_optional_value )
- return s_cla_parser.get<T>( parameter_name );
-
- optional<T> val = s_cla_parser.get<optional<T> >( parameter_name );
- if( val )
- return *val;
- else
- return optional_value;
- }
-
- boost::optional<T> v;
-
-#ifndef UNDER_CE
- env::get( parameter_2_env_var(parameter_name), v );
-#endif
-
- if( v )
- return *v;
- else
- return default_value;
-}
-
-//____________________________________________________________________________//
-
-void
-disable_use( cla::parameter const&, std::string const& )
-{
- BOOST_TEST_SETUP_ASSERT( false, "parameter break_exec_path is disabled in this release" );
-}
-
-//____________________________________________________________________________//
-
-} // local namespace
+namespace {
void
-init( int& argc, char** argv )
+register_parameters( rt::parameters_store& store )
{
- using namespace cla;
-
- BOOST_TEST_IMPL_TRY {
- if( s_cla_parser.num_params() != 0 )
- s_cla_parser.reset();
- else
- s_cla_parser - cla::ignore_mismatch
- << cla::dual_name_parameter<bool>( AUTO_START_DBG + "|d" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Automatically starts debugger if system level error (signal) occurs")
- << cla::named_parameter<std::string>( BREAK_EXEC_PATH )
- - (cla::prefix = "--",cla::separator = "=",cla::guess_name,cla::optional,
- cla::description = "For the exception safety testing allows to break at specific execution path",
- cla::handler = &disable_use)
- << cla::dual_name_parameter<bool>( BUILD_INFO + "|i" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Shows library build information" )
- << cla::dual_name_parameter<bool>( CATCH_SYS_ERRORS + "|s" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Allows to switch between catching and ignoring system errors (signals)")
- << cla::dual_name_parameter<bool>( COLOR_OUTPUT + "|x" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Allows to switch between catching and ignoring system errors (signals)")
- << cla::named_parameter<bool>( DETECT_FP_EXCEPT )
- - (cla::prefix = "--",cla::separator = "=",cla::guess_name,cla::optional,
- cla::description = "Allows to switch between catching and ignoring floating point exceptions")
- << cla::named_parameter<std::string>( DETECT_MEM_LEAKS )
- - (cla::prefix = "--",cla::separator = "=",cla::guess_name,cla::optional,cla::optional_value,
- cla::description = "Allows to switch between catching and ignoring memory leaks")
- << cla::dual_name_parameter<unit_test::output_format>( LOG_FORMAT + "|f" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies log format")
- << cla::dual_name_parameter<unit_test::log_level>( LOG_LEVEL + "|l" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies log level")
- << cla::dual_name_parameter<std::string>( LOG_SINK + "|k" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies log sink:stdout(default),stderr or file name")
- << cla::dual_name_parameter<unit_test::output_format>( OUTPUT_FORMAT + "|o" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies output format (both log and report)")
- << cla::dual_name_parameter<unsigned>( RANDOM_SEED + "|a" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,cla::optional_value,
- cla::description = "Allows to switch between sequential and random order of test units execution.\n"
- "Optionally allows to specify concrete seed for random number generator")
- << cla::dual_name_parameter<unit_test::output_format>( REPORT_FORMAT + "|m" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies report format")
- << cla::dual_name_parameter<unit_test::report_level>(REPORT_LEVEL + "|r")
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies report level")
- << cla::dual_name_parameter<std::string>( REPORT_SINK + "|e" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Specifies report sink:stderr(default),stdout or file name")
- << cla::dual_name_parameter<bool>( RESULT_CODE + "|c" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Allows to disable test modules's result code generation")
- << cla::dual_name_parameter<std::string>( TESTS_TO_RUN + "|t" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,cla::multiplicable,
- cla::description = "Allows to filter which test units to run")
- << cla::named_parameter<bool>( SAVE_TEST_PATTERN )
- - (cla::prefix = "--",cla::separator = "=",cla::guess_name,cla::optional,
- cla::description = "Allows to switch between saving and matching against test pattern file")
- << cla::dual_name_parameter<bool>( SHOW_PROGRESS + "|p" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,
- cla::description = "Turns on progress display")
- << cla::dual_name_parameter<unit_test::output_format>( LIST_CONTENT + "|j" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,cla::optional_value,
- cla::description = "Lists the content of test tree - names of all test suites and test cases")
- << cla::named_parameter<bool>( LIST_LABELS )
- - (cla::prefix = "--",cla::separator = "= ",cla::guess_name,cla::optional,
- cla::description = "Lists all available labels")
- << cla::named_parameter<bool>( USE_ALT_STACK )
- - (cla::prefix = "--",cla::separator = "=",cla::guess_name,cla::optional,
- cla::description = "Turns on/off usage of an alternative stack for signal handling")
- << cla::dual_name_parameter<bool>( WAIT_FOR_DEBUGGER + "|w" )
- - (cla::prefix = "--|-",cla::separator = "=| ",cla::guess_name,cla::optional,cla::optional_value,
- cla::description = "Forces test module to wait for button to be pressed before starting test run")
-
- << cla::dual_name_parameter<bool>( "help|?" )
- - (cla::prefix = "--|-",cla::separator = "=",cla::guess_name,cla::optional,
- cla::description = "this help message")
- ;
-
- s_cla_parser.parse( argc, argv );
-
- if( s_cla_parser["help"] ) {
- s_cla_parser.help( std::cout );
- BOOST_TEST_IMPL_THROW( framework::nothing_to_test() );
+ rt::option auto_start_dbg( AUTO_START_DBG, (
+ rt::description = "Automatically attaches debugger in case of system level failure (signal).",
+ rt::env_var = "BOOST_TEST_AUTO_START_DBG",
+
+ rt::help = "Option " + AUTO_START_DBG + " specifies whether Boost.Test should attempt "
+ "to attach a debugger when fatal system error occurs. At the moment this feature "
+ "is only available on a few selected platforms: Win32 and *nix. There is a "
+ "default debugger configured for these platforms. You can manually configure "
+ "different debugger. For more details on how to configure the debugger see the "
+ "Boost.Test debug API, specifically the function boost::debug::set_debugger."
+ ));
+
+ auto_start_dbg.add_cla_id( "--", AUTO_START_DBG, "=" );
+ auto_start_dbg.add_cla_id( "-", "d", " " );
+ store.add( auto_start_dbg );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<std::string> break_exec_path( BREAK_EXEC_PATH, (
+ rt::description = "For the exception safety testing allows to break at specific execution path.",
+ rt::env_var = "BOOST_TEST_BREAK_EXEC_PATH"
+#ifndef BOOST_NO_CXX11_LAMBDAS
+ ,
+ rt::callback = [](rt::cstring) {
+ BOOST_TEST_SETUP_ASSERT( false, "parameter break_exec_path is disabled in this release" );
}
+#endif
+ ));
- s_report_format = retrieve_parameter( REPORT_FORMAT, s_cla_parser, unit_test::OF_CLF );
- s_log_format = retrieve_parameter( LOG_FORMAT, s_cla_parser, unit_test::OF_CLF );
-
- unit_test::output_format of = retrieve_parameter( OUTPUT_FORMAT, s_cla_parser, unit_test::OF_INVALID );
-
- if( of != unit_test::OF_INVALID )
- s_report_format = s_log_format = of;
-
- s_test_to_run = retrieve_parameter<std::list<std::string> >( TESTS_TO_RUN, s_cla_parser );
- }
- BOOST_TEST_IMPL_CATCH( rt::logic_error, ex ) {
- std::ostringstream err;
-
- err << "Fail to process runtime parameters: " << ex.msg() << std::endl;
- s_cla_parser.usage( err );
-
- BOOST_TEST_SETUP_ASSERT( false, err.str() );
- }
-}
-
-//____________________________________________________________________________//
-
-unit_test::log_level
-log_level()
-{
- return retrieve_parameter( LOG_LEVEL, s_cla_parser, unit_test::log_all_errors );
-}
-
-//____________________________________________________________________________//
-
-bool
-no_result_code()
-{
- return !retrieve_parameter( RESULT_CODE, s_cla_parser, true );
-}
-
-//____________________________________________________________________________//
-
-unit_test::report_level
-report_level()
-{
- return retrieve_parameter( REPORT_LEVEL, s_cla_parser, unit_test::CONFIRMATION_REPORT );
-}
-
-//____________________________________________________________________________//
-
-std::list<std::string> const&
-test_to_run()
-{
- return s_test_to_run;
-}
-
-//____________________________________________________________________________//
-
-const_string
-break_exec_path()
-{
- static std::string s_break_exec_path = retrieve_parameter( BREAK_EXEC_PATH, s_cla_parser, s_empty );
-
- return s_break_exec_path;
-}
-
-//____________________________________________________________________________//
-
-bool
-save_pattern()
-{
- return retrieve_parameter( SAVE_TEST_PATTERN, s_cla_parser, false );
-}
-
-//____________________________________________________________________________//
-
-bool
-show_progress()
-{
- return retrieve_parameter( SHOW_PROGRESS, s_cla_parser, false );
-}
-
-//____________________________________________________________________________//
-
-bool
-show_build_info()
-{
- return retrieve_parameter( BUILD_INFO, s_cla_parser, false );
-}
-
-//____________________________________________________________________________//
+ break_exec_path.add_cla_id( "--", BREAK_EXEC_PATH, "=" );
+ store.add( break_exec_path );
-output_format
-list_content()
-{
- return retrieve_parameter( LIST_CONTENT, s_cla_parser, unit_test::OF_INVALID, unit_test::OF_CLF );
-}
+ rt::option build_info( BUILD_INFO, (
+ rt::description = "Displays library build information.",
+ rt::env_var = "BOOST_TEST_BUILD_INFO",
+ rt::help = "Option " + BUILD_INFO + " displays library build information, including: platform, "
+ "compiler, STL version and Boost version."
+ ));
-//____________________________________________________________________________//
+ ///////////////////////////////////////////////
-bool
-list_labels()
-{
- return retrieve_parameter( LIST_LABELS, s_cla_parser, false );
-}
+ build_info.add_cla_id( "--", BUILD_INFO, "=" );
+ build_info.add_cla_id( "-", "i", " " );
+ store.add( build_info );
-//____________________________________________________________________________//
-bool
-catch_sys_errors()
-{
- return retrieve_parameter( CATCH_SYS_ERRORS, s_cla_parser,
+ rt::option catch_sys_errors( CATCH_SYS_ERRORS, (
+ rt::description = "Allows to switch between catching and ignoring system errors (signals).",
+ rt::env_var = "BOOST_TEST_CATCH_SYSTEM_ERRORS",
+ rt::default_value =
#ifdef BOOST_TEST_DEFAULTS_TO_CORE_DUMP
- false
+ false,
#else
- true
+ true,
#endif
- );
-}
-
-//____________________________________________________________________________//
-
-bool
-color_output()
-{
- return retrieve_parameter( COLOR_OUTPUT, s_cla_parser, false );
-}
-
-//____________________________________________________________________________//
-
-bool
-auto_start_dbg()
-{
- // !! ?? set debugger as an option
- return retrieve_parameter( AUTO_START_DBG, s_cla_parser, false );
-;
-}
-
-//____________________________________________________________________________//
-
-bool
-wait_for_debugger()
-{
- return retrieve_parameter( WAIT_FOR_DEBUGGER, s_cla_parser, false );
-}
-
-//____________________________________________________________________________//
-
-bool
-use_alt_stack()
-{
- return retrieve_parameter( USE_ALT_STACK, s_cla_parser, true );
-}
-
-//____________________________________________________________________________//
-
-bool
-detect_fp_exceptions()
-{
- return retrieve_parameter( DETECT_FP_EXCEPT, s_cla_parser, false );
+ rt::help = "If option " + CATCH_SYS_ERRORS + " has value no the frameworks does not attempt to catch "
+ "asynchronous system failure events (signals on *NIX platforms or structured exceptions on Windows). "
+ " Default value is "
+#ifdef BOOST_TEST_DEFAULTS_TO_CORE_DUMP
+ "no."
+#else
+ "true."
+#endif
+ ));
+
+ catch_sys_errors.add_cla_id( "--", CATCH_SYS_ERRORS, "=", true );
+ catch_sys_errors.add_cla_id( "-", "s", " " );
+ store.add( catch_sys_errors );
+
+ ///////////////////////////////////////////////
+
+ rt::option color_output( COLOR_OUTPUT, (
+ rt::description = "Enables color output of the framework log and report messages.",
+ rt::env_var = "BOOST_TEST_COLOR_OUTPUT",
+ rt::help = "The framework is able to produce color output on systems which supports it. "
+ "To enable this behavior set this option to yes. By default the framework "
+ "does not produces color output."
+ ));
+
+ color_output.add_cla_id( "--", COLOR_OUTPUT, "=", true );
+ color_output.add_cla_id( "-", "x", " " );
+ store.add( color_output );
+
+ ///////////////////////////////////////////////
+
+ rt::option detect_fp_except( DETECT_FP_EXCEPT, (
+ rt::description = "Enables/disables floating point exceptions traps.",
+ rt::env_var = "BOOST_TEST_DETECT_FP_EXCEPTIONS",
+ rt::help = "Option " + DETECT_FP_EXCEPT + " enables/disables hardware traps for the floating "
+ "point exceptions (if supported on your platfrom)."
+ ));
+
+ detect_fp_except.add_cla_id( "--", DETECT_FP_EXCEPT, "=", true );
+ store.add( detect_fp_except );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<unsigned long> detect_mem_leaks( DETECT_MEM_LEAKS, (
+ rt::description = "Turns on/off memory leaks detection (optionally breaking on specified alloc order number).",
+ rt::env_var = "BOOST_TEST_DETECT_MEMORY_LEAK",
+ rt::default_value = 1L,
+ rt::optional_value = 1L,
+ rt::value_hint = "<alloc order number>",
+ rt::help = "Parameter " + DETECT_MEM_LEAKS + " enables/disables memory leaks detection. "
+ "This parameter has optional long integer value. The default value is 1, which "
+ "enables the memory leak detection. The value 0 disables memory leak detection. "
+ "Any value N greater than 1 is treated as leak allocation number and tells the "
+ "framework to setup runtime breakpoint at Nth heap allocation. If value is "
+ "omitted the default value is assumed."
+ ));
+
+ detect_mem_leaks.add_cla_id( "--", DETECT_MEM_LEAKS, "=" );
+ store.add( detect_mem_leaks );
+
+ ///////////////////////////////////////////////
+
+ rt::enum_parameter<unit_test::output_format> list_content( LIST_CONTENT, (
+ rt::description = "Lists the content of test tree - names of all test suites and test cases.",
+ rt::env_var = "BOOST_TEST_LIST_CONTENT",
+ rt::default_value = OF_INVALID,
+ rt::optional_value = OF_CLF,
+ rt::enum_values<unit_test::output_format>::value =
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ {
+ { "HRF", OF_CLF },
+ { "DOT", OF_DOT }
+ },
+#else
+ rt::enum_values_list<unit_test::output_format>()
+ ( "HRF", OF_CLF )
+ ( "DOT", OF_DOT )
+ ,
+#endif
+ rt::help = "Parameter " + LIST_CONTENT + " instructs the framework to list the content "
+ "of the test module instead of executing the test cases. Parameter accepts "
+ "optional string value indicating the format of the output. Currently the "
+ "framework supports two formats: human readable format (HRF) and dot graph "
+ "format (DOT). If value is omitted HRF value is assumed."
+ ));
+ list_content.add_cla_id( "--", LIST_CONTENT, "=" );
+ store.add( list_content );
+
+ ///////////////////////////////////////////////
+
+ rt::option list_labels( LIST_LABELS, (
+ rt::description = "Lists all available labels.",
+ rt::env_var = "BOOST_TEST_LIST_LABELS",
+ rt::help = "Option " + LIST_LABELS + " instructs the framework to list all the the labels "
+ "defined in the test module instead of executing the test cases."
+ ));
+
+ list_labels.add_cla_id( "--", LIST_LABELS, "=" );
+ store.add( list_labels );
+
+ ///////////////////////////////////////////////
+
+ rt::enum_parameter<unit_test::output_format> log_format( LOG_FORMAT, (
+ rt::description = "Specifies log format.",
+ rt::env_var = "BOOST_TEST_LOG_FORMAT",
+ rt::default_value = OF_CLF,
+ rt::enum_values<unit_test::output_format>::value =
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ {
+ { "HRF", OF_CLF },
+ { "CLF", OF_CLF },
+ { "XML", OF_XML }
+ },
+#else
+ rt::enum_values_list<unit_test::output_format>()
+ ( "HRF", OF_CLF )
+ ( "CLF", OF_CLF )
+ ( "XML", OF_XML )
+ ,
+#endif
+ rt::help = "Parameter " + LOG_FORMAT + " allows to set the frameowrk's log format to one "
+ "of the formats supplied by the framework. The only acceptable values for this "
+ "parameter are the names of the output formats supplied by the framework. By "
+ "default the framework uses human readable format (HRF) for testing log. This "
+ "format is similar to compiler error format. Alternatively you can specify XML "
+ "as log format. This format is easier to process by testing automation tools."
+ ));
+
+ log_format.add_cla_id( "--", LOG_FORMAT, "=" );
+ log_format.add_cla_id( "-", "f", " " );
+ store.add( log_format );
+
+ ///////////////////////////////////////////////
+
+ rt::enum_parameter<unit_test::log_level> log_level( LOG_LEVEL, (
+ rt::description = "Specifies log level.",
+ rt::env_var = "BOOST_TEST_LOG_LEVEL",
+ rt::default_value = log_all_errors,
+ rt::enum_values<unit_test::log_level>::value =
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ {
+ { "all" , log_successful_tests },
+ { "success" , log_successful_tests },
+ { "test_suite" , log_test_units },
+ { "unit_scope" , log_test_units },
+ { "message" , log_messages },
+ { "warning" , log_warnings },
+ { "error" , log_all_errors },
+ { "cpp_exception" , log_cpp_exception_errors },
+ { "system_error" , log_system_errors },
+ { "fatal_error" , log_fatal_errors },
+ { "nothing" , log_nothing }
+ },
+#else
+ rt::enum_values_list<unit_test::log_level>()
+ ( "all" , log_successful_tests )
+ ( "success" , log_successful_tests )
+ ( "test_suite" , log_test_units )
+ ( "unit_scope" , log_test_units )
+ ( "message" , log_messages )
+ ( "warning" , log_warnings )
+ ( "error" , log_all_errors )
+ ( "cpp_exception" , log_cpp_exception_errors )
+ ( "system_error" , log_system_errors )
+ ( "fatal_error" , log_fatal_errors )
+ ( "nothing" , log_nothing )
+ ,
+#endif
+ rt::help = "Parameter " + LOG_LEVEL + " allows to set the framework's log level. "
+ "Log level defines the verbosity of testing log produced by a testing "
+ "module. The verbosity ranges from a complete log, when all assertions "
+ "(both successful and failing) are reported, all notifications about "
+ "test units start and finish are included, to an empty log when nothing "
+ "is reported to a testing log stream."
+ ));
+
+ log_level.add_cla_id( "--", LOG_LEVEL, "=" );
+ log_level.add_cla_id( "-", "l", " " );
+ store.add( log_level );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<std::string> log_sink( LOG_SINK, (
+ rt::description = "Specifies log sink: stdout(default), stderr or file name.",
+ rt::env_var = "BOOST_TEST_LOG_SINK",
+ rt::value_hint = "<stderr|stdout|file name>",
+ rt::help = "Parameter " + LOG_SINK + " allows to set the log sink - location "
+ "where we report the log to, thus it allows to easily redirect the "
+ "test logs to file or standard streams. By default testing log is "
+ "directed to standard output."
+ ));
+
+ log_sink.add_cla_id( "--", LOG_SINK, "=" );
+ log_sink.add_cla_id( "-", "k", " " );
+ store.add( log_sink );
+
+ ///////////////////////////////////////////////
+
+ rt::enum_parameter<unit_test::output_format> output_format( OUTPUT_FORMAT, (
+ rt::description = "Specifies output format (both log and report).",
+ rt::env_var = "BOOST_TEST_OUTPUT_FORMAT",
+ rt::enum_values<unit_test::output_format>::value =
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ {
+ { "HRF", OF_CLF },
+ { "CLF", OF_CLF },
+ { "XML", OF_XML }
+ },
+#else
+ rt::enum_values_list<unit_test::output_format>()
+ ( "HRF", OF_CLF )
+ ( "CLF", OF_CLF )
+ ( "XML", OF_XML )
+ ,
+#endif
+ rt::help = "Parameter " + OUTPUT_FORMAT + " combines an effect of " + REPORT_FORMAT +
+ " and " + LOG_FORMAT + " parameters. This parameter has higher priority "
+ "than either one of them. In other words if this parameter is specified "
+ "it overrides the value of other two parameters. This parameter does not "
+ "have a default value. The only acceptable values are string names of "
+ "output formats: HRF - human readable format and XML - XML formats for "
+ "automation tools processing."
+ ));
+
+ output_format.add_cla_id( "--", OUTPUT_FORMAT, "=" );
+ output_format.add_cla_id( "-", "o", " " );
+ store.add( output_format );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<unsigned> random_seed( RANDOM_SEED, (
+ rt::description = "Allows to switch between sequential and random order of test units execution."
+ " Optionally allows to specify concrete seed for random number generator.",
+ rt::env_var = "BOOST_TEST_RANDOM",
+ rt::default_value = 0U,
+ rt::optional_value = 1U,
+ rt::value_hint = "<seed>",
+ rt::help = "Parameter " + RANDOM_SEED + " instructs the framework to execute the "
+ "test cases in random order. This parameter accepts optional unsigned "
+ "integer argument. By default test cases are executed in some specific "
+ "order defined by order of test units in test files and dependency between "
+ "test units. If parameter is specified without the argument value testing "
+ "order is randomized based on current time. Alternatively you can specify "
+ "any positive value greater than 1 and it will be used as random seed for "
+ "the run."
+ ));
+
+ random_seed.add_cla_id( "--", RANDOM_SEED, "=" );
+ store.add( random_seed );
+
+ ///////////////////////////////////////////////
+
+ rt::enum_parameter<unit_test::output_format> report_format( REPORT_FORMAT, (
+ rt::description = "Specifies report format.",
+ rt::env_var = "BOOST_TEST_REPORT_FORMAT",
+ rt::default_value = OF_CLF,
+ rt::enum_values<unit_test::output_format>::value =
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ {
+ { "HRF", OF_CLF },
+ { "CLF", OF_CLF },
+ { "XML", OF_XML }
+ },
+#else
+ rt::enum_values_list<unit_test::output_format>()
+ ( "HRF", OF_CLF )
+ ( "CLF", OF_CLF )
+ ( "XML", OF_XML )
+ ,
+#endif
+ rt::help = "Parameter " + REPORT_FORMAT + " allows to set the framework's report format "
+ "to one of the formats supplied by the framework. The only acceptable values "
+ "for this parameter are the names of the output formats. By default the framework "
+ "uses human readable format (HRF) for results reporting. Alternatively you can "
+ "specify XML as report format. This format is easier to process by testing "
+ "automation tools."
+ ));
+
+ report_format.add_cla_id( "--", REPORT_FORMAT, "=" );
+ report_format.add_cla_id( "-", "m", " " );
+ store.add( report_format );
+
+ ///////////////////////////////////////////////
+
+ rt::enum_parameter<unit_test::report_level> report_level( REPORT_LEVEL, (
+ rt::description = "Specifies report level.",
+ rt::env_var = "BOOST_TEST_REPORT_LEVEL",
+ rt::default_value = CONFIRMATION_REPORT,
+ rt::enum_values<unit_test::report_level>::value =
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ {
+ { "confirm", CONFIRMATION_REPORT },
+ { "short", SHORT_REPORT },
+ { "detailed", DETAILED_REPORT },
+ { "no", NO_REPORT }
+ },
+#else
+ rt::enum_values_list<unit_test::report_level>()
+ ( "confirm", CONFIRMATION_REPORT )
+ ( "short", SHORT_REPORT )
+ ( "detailed", DETAILED_REPORT )
+ ( "no", NO_REPORT )
+ ,
+#endif
+ rt::help = "Parameter " + REPORT_LEVEL + " allows to set the verbosity level of the "
+ "testing result report generated by the framework. Use value 'no' to "
+ "eliminate the results report completely."
+ ));
+
+ report_level.add_cla_id( "--", REPORT_LEVEL, "=" );
+ report_level.add_cla_id( "-", "r", " " );
+ store.add( report_level );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<std::string> report_mem_leaks( REPORT_MEM_LEAKS, (
+ rt::description = "File where to report memory leaks to.",
+ rt::env_var = "BOOST_TEST_REPORT_MEMORY_LEAKS_TO",
+ rt::default_value = std::string(),
+ rt::value_hint = "<file name>",
+ rt::help = "Parameter " + REPORT_MEM_LEAKS + " allows to specify a file where to report "
+ "memory leaks to. The parameter does not have default value. If it is not specified, "
+ "memory leaks (if any) are reported to the standard error stream."
+ ));
+
+ report_mem_leaks.add_cla_id( "--", REPORT_MEM_LEAKS, "=" );
+ store.add( report_mem_leaks );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<std::string> report_sink( REPORT_SINK, (
+ rt::description = "Specifies report sink: stderr(default), stdout or file name.",
+ rt::env_var = "BOOST_TEST_REPORT_SINK",
+ rt::value_hint = "<stderr|stdout|file name>",
+ rt::help = "Parameter " + REPORT_SINK + " allows to set the result report sink - "
+ "the location where the framework writes the result report to, thus it "
+ "allows to easily redirect the result report to a file or a standard "
+ "stream. By default the testing result report is directed to the "
+ "standard error stream."
+ ));
+
+ report_sink.add_cla_id( "--", REPORT_SINK, "=" );
+ report_sink.add_cla_id( "-", "e", " " );
+ store.add( report_sink );
+
+ ///////////////////////////////////////////////
+
+ rt::option result_code( RESULT_CODE, (
+ rt::description = "Disables test modules's result code generation.",
+ rt::env_var = "BOOST_TEST_RESULT_CODE",
+ rt::default_value = true,
+ rt::help = "The 'no' argument value for the parameter " + RESULT_CODE + " instructs the "
+ "framework to always return zero result code. This can be used for test programs "
+ "executed within IDE. By default this parameter has value 'yes'."
+ ));
+
+ result_code.add_cla_id( "--", RESULT_CODE, "=", true );
+ result_code.add_cla_id( "-", "c", " " );
+ store.add( result_code );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<std::string,rt::REPEATABLE_PARAM> tests_to_run( RUN_FILTERS, (
+ rt::description = "Filters, which test units to include or exclude from test module execution.",
+ rt::env_var = "BOOST_TEST_RUN_FILTERS",
+ rt::value_hint = "<test unit filter>",
+ rt::help = "Parameter " + RUN_FILTERS + " allows to filter which test units to execute during "
+ "testing. The framework supports both 'selection filters', which allow to select "
+ "which test units to enable from the set of available test units, and 'disabler "
+ "filters', which allow to disable some test units. The __UTF__ also supports "
+ "enabling/disabling test units at compile time. These settings identify the default "
+ "set of test units to run. Parameter " + RUN_FILTERS + " is used to change this default. "
+ "This parameter is repeatable, so you can specify more than one filter if necessary."
+ ));
+
+ tests_to_run.add_cla_id( "--", RUN_FILTERS, "=" );
+ tests_to_run.add_cla_id( "-", "t", " " );
+ store.add( tests_to_run );
+
+ ///////////////////////////////////////////////
+
+ rt::option save_test_pattern( SAVE_TEST_PATTERN, (
+ rt::description = "Allows to switch between saving or matching test pattern file.",
+ rt::env_var = "BOOST_TEST_SAVE_PATTERN",
+ rt::help = "Parameter " + SAVE_TEST_PATTERN + " facilitates switching mode of operation for "
+ "testing output streams.\n\nThis parameter serves no particular purpose within the "
+ "framework itself. It can be used by test modules relying on output_test_stream to "
+ "implement testing logic. Default mode is 'match' (false)."
+ ));
+
+ save_test_pattern.add_cla_id( "--", SAVE_TEST_PATTERN, "=" );
+ store.add( save_test_pattern );
+
+ ///////////////////////////////////////////////
+
+ rt::option show_progress( SHOW_PROGRESS, (
+ rt::description = "Turns on progress display.",
+ rt::env_var = "BOOST_TEST_SHOW_PROGRESS",
+ rt::help = "Parameter " + SHOW_PROGRESS + " instructs the framework to display test progress "
+ "information. By default the test progress is not shown."
+ ));
+
+ show_progress.add_cla_id( "--", SHOW_PROGRESS, "=" );
+ show_progress.add_cla_id( "-", "p", " " );
+ store.add( show_progress );
+
+ ///////////////////////////////////////////////
+
+ rt::option use_alt_stack( USE_ALT_STACK, (
+ rt::description = "Turns on/off usage of an alternative stack for signal handling.",
+ rt::env_var = "BOOST_TEST_USE_ALT_STACK",
+ rt::default_value = true,
+ rt::help = "Parameter " + USE_ALT_STACK + " instructs the framework to use alternative "
+ "stack for signals processing, on platforms where they are supported. The feature "
+ "is enabled by default, but can be disabled using this parameter."
+ ));
+
+ use_alt_stack.add_cla_id( "--", USE_ALT_STACK, "=", true );
+ store.add( use_alt_stack );
+
+ ///////////////////////////////////////////////
+
+ rt::option wait_for_debugger( WAIT_FOR_DEBUGGER, (
+ rt::description = "Forces test module to wait for button to be pressed before starting test run.",
+ rt::env_var = "BOOST_TEST_WAIT_FOR_DEBUGGER",
+ rt::help = "Parameter " + WAIT_FOR_DEBUGGER + " instructs the framework to pause before starting "
+ "test units execution, so that you can attach a debugger to running test module. By "
+ "default this parameters turned off."
+ ));
+
+ wait_for_debugger.add_cla_id( "--", WAIT_FOR_DEBUGGER, "=" );
+ wait_for_debugger.add_cla_id( "-", "w", " " );
+ store.add( wait_for_debugger );
+
+ ///////////////////////////////////////////////
+
+ rt::parameter<std::string> help( HELP, (
+ rt::description = "Help for framework parameters.",
+ rt::optional_value = std::string(),
+ rt::value_hint = "<parameter name>",
+ rt::help = "Parameter " + HELP + " displays help on the framework's parameters. "
+ "The parameter accepts an optional argument value. If present, an argument value is "
+ "interpreted as a parameter name (name guessing works as well, so for example "
+ "--help=rand displays help on the parameter random). If the parameter name is unknown "
+ "or ambiguous error is reported. If argument value is absent, a summary of all "
+ "framework's parameter is displayed."
+ ));
+ help.add_cla_id( "--", HELP, "=" );
+ store.add( help );
+
+ ///////////////////////////////////////////////
+
+ rt::option usage( USAGE, (
+ rt::description = "Short message explaining usage of Boost.Test parameters."
+ ));
+ usage.add_cla_id( "-", "?", " " );
+ store.add( usage );
}
-//____________________________________________________________________________//
-
-output_format
-report_format()
-{
- return s_report_format;
-}
+static rt::arguments_store s_arguments_store;
+static rt::parameters_store s_parameters_store;
//____________________________________________________________________________//
-output_format
-log_format()
-{
- return s_log_format;
-}
-
-//____________________________________________________________________________//
+} // local namespace
-std::ostream*
-report_sink()
+void
+init( int& argc, char** argv )
{
- std::string sink_name = retrieve_parameter( REPORT_SINK, s_cla_parser, s_empty );
+ shared_ptr<rt::cla::parser> parser;
- if( sink_name.empty() || sink_name == "stderr" )
- return &std::cerr;
+ BOOST_TEST_I_TRY {
+ // Initialize parameters list
+ if( s_parameters_store.is_empty() )
+ register_parameters( s_parameters_store );
- if( sink_name == "stdout" )
- return &std::cout;
+ // Clear up arguments store just in case (of multiple init invocations)
+ s_arguments_store.clear();
- static std::ofstream report_file( sink_name.c_str() );
- return &report_file;
-}
+ // Parse CLA they take precedence over environment
+ parser.reset( new rt::cla::parser( s_parameters_store, (rt::end_of_params = "--", rt::negation_prefix = "no_") ) );
+ argc = parser->parse( argc, argv, s_arguments_store );
-//____________________________________________________________________________//
-
-std::ostream*
-log_sink()
-{
- std::string sink_name = retrieve_parameter( LOG_SINK, s_cla_parser, s_empty );
+ // Try to fetch missing arguments from environment
+ rt::env::fetch_absent( s_parameters_store, s_arguments_store );
- if( sink_name.empty() || sink_name == "stdout" )
- return &std::cout;
+ // Set arguments to default values if defined and perform all the validations
+ rt::finalize_arguments( s_parameters_store, s_arguments_store );
- if( sink_name == "stderr" )
- return &std::cerr;
-
- static std::ofstream log_file( sink_name.c_str() );
- return &log_file;
-}
+ // Report help if requested
+ if( runtime_config::get<bool>( USAGE ) ) {
+ parser->usage( std::cerr );
+ BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) );
+ }
+ else if( s_arguments_store.has( HELP ) ) {
+ parser->help( std::cerr, s_parameters_store, runtime_config::get<std::string>( HELP ) );
+ BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) );
+ }
-//____________________________________________________________________________//
+ // A bit of business logic: output_format takes precedence over log/report formats
+ if( s_arguments_store.has( OUTPUT_FORMAT ) ) {
+ unit_test::output_format of = s_arguments_store.get<unit_test::output_format>( OUTPUT_FORMAT );
+ s_arguments_store.set( REPORT_FORMAT, of );
+ s_arguments_store.set( LOG_FORMAT, of );
+ }
+ }
+ BOOST_TEST_I_CATCH( rt::init_error, ex ) {
+ BOOST_TEST_SETUP_ASSERT( false, ex.msg );
+ }
+ BOOST_TEST_I_CATCH( rt::ambiguous_param, ex ) {
+ std::cerr << ex.msg << "\n Did you mean one of these?\n";
-long
-detect_memory_leaks()
-{
- static long s_value = -1;
+ BOOST_TEST_FOREACH( rt::cstring, name, ex.m_amb_candidates )
+ std::cerr << " " << name << "\n";
- if( s_value >= 0 )
- return s_value;
+ BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) );
+ }
+ BOOST_TEST_I_CATCH( rt::unrecognized_param, ex ) {
+ std::cerr << ex.msg << "\n";
- std::string value = retrieve_parameter( DETECT_MEM_LEAKS, s_cla_parser, s_empty );
+ if( !ex.m_typo_candidates.empty() ) {
+ std::cerr << " Did you mean one of these?\n";
- optional<bool> bool_val;
- if( runtime::interpret_argument_value_impl<bool>::_( value, bool_val ) )
- s_value = *bool_val ? 1L : 0L;
- else {
- BOOST_TEST_IMPL_TRY {
- // if representable as long - this is leak number
- s_value = boost::lexical_cast<long>( value );
+ BOOST_TEST_FOREACH( rt::cstring, name, ex.m_typo_candidates )
+ std::cerr << " " << name << "\n";
}
- BOOST_TEST_IMPL_CATCH0( boost::bad_lexical_cast ) {
- // value is leak report file and detection is enabled
- s_value = 1L;
+ else if( parser ) {
+ std::cerr << "\n";
+ parser->usage( std::cerr );
}
+
+ BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) );
}
+ BOOST_TEST_I_CATCH( rt::input_error, ex ) {
+ std::cerr << ex.msg << "\n\n";
- return s_value;
+ if( parser )
+ parser->usage( std::cerr, ex.param_name );
+
+ BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) );
+ }
}
//____________________________________________________________________________//
-const_string
-memory_leaks_report_file()
+rt::arguments_store const&
+argument_store()
{
- if( detect_memory_leaks() != 1 )
- return const_string();
-
- static std::string s_value;
-
- if( s_value.empty() ) {
- s_value = retrieve_parameter<std::string>( DETECT_MEM_LEAKS, s_cla_parser );
-
- optional<bool> bool_val;
- if( runtime::interpret_argument_value_impl<bool>::_( s_value, bool_val ) )
- s_value.clear();
- }
-
- return s_value;
+ return s_arguments_store;
}
//____________________________________________________________________________//
-unsigned
-random_seed()
+bool
+save_pattern()
{
- return retrieve_parameter( RANDOM_SEED, s_cla_parser, 0U, 1U );
+ return runtime_config::get<bool>( SAVE_TEST_PATTERN );
}
//____________________________________________________________________________//
diff --git a/boost/test/impl/xml_log_formatter.ipp b/boost/test/impl/xml_log_formatter.ipp
index 286cd60005..81284020dd 100644
--- a/boost/test/impl/xml_log_formatter.ipp
+++ b/boost/test/impl/xml_log_formatter.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -66,9 +66,9 @@ void
xml_log_formatter::log_build_info( std::ostream& ostr )
{
ostr << "<BuildInfo"
- << " platform" << attr_value() << BOOST_PLATFORM
- << " compiler" << attr_value() << BOOST_COMPILER
- << " stl" << attr_value() << BOOST_STDLIB
+ << " platform" << utils::attr_value() << BOOST_PLATFORM
+ << " compiler" << utils::attr_value() << BOOST_COMPILER
+ << " stl" << utils::attr_value() << BOOST_STDLIB
<< " boost=\"" << BOOST_VERSION/100000 << "."
<< BOOST_VERSION/100 % 1000 << "."
<< BOOST_VERSION % 100 << '\"'
@@ -80,11 +80,11 @@ xml_log_formatter::log_build_info( std::ostream& ostr )
void
xml_log_formatter::test_unit_start( std::ostream& ostr, test_unit const& tu )
{
- ostr << "<" << tu_type_name( tu ) << " name" << attr_value() << tu.p_name.get();
+ ostr << "<" << tu_type_name( tu ) << " name" << utils::attr_value() << tu.p_name.get();
- if( !tu.p_file_name.get().empty() )
- ostr << BOOST_TEST_L( " file" ) << attr_value() << tu.p_file_name
- << BOOST_TEST_L( " line" ) << attr_value() << tu.p_line_num;
+ if( !tu.p_file_name.empty() )
+ ostr << BOOST_TEST_L( " file" ) << utils::attr_value() << tu.p_file_name
+ << BOOST_TEST_L( " line" ) << utils::attr_value() << tu.p_line_num;
ostr << ">";
}
@@ -106,9 +106,9 @@ void
xml_log_formatter::test_unit_skipped( std::ostream& ostr, test_unit const& tu, const_string reason )
{
ostr << "<" << tu_type_name( tu )
- << " name" << attr_value() << tu.p_name.get()
- << " skipped" << attr_value() << "yes"
- << " reason" << attr_value() << reason
+ << " name" << utils::attr_value() << tu.p_name
+ << " skipped" << utils::attr_value() << "yes"
+ << " reason" << utils::attr_value() << reason
<< "/>";
}
@@ -119,19 +119,19 @@ xml_log_formatter::log_exception_start( std::ostream& ostr, log_checkpoint_data
{
execution_exception::location const& loc = ex.where();
- ostr << "<Exception file" << attr_value() << loc.m_file_name
- << " line" << attr_value() << loc.m_line_num;
+ ostr << "<Exception file" << utils::attr_value() << loc.m_file_name
+ << " line" << utils::attr_value() << loc.m_line_num;
if( !loc.m_function.is_empty() )
- ostr << " function" << attr_value() << loc.m_function;
+ ostr << " function" << utils::attr_value() << loc.m_function;
- ostr << ">" << cdata() << ex.what();
+ ostr << ">" << utils::cdata() << ex.what();
if( !checkpoint_data.m_file_name.is_empty() ) {
- ostr << "<LastCheckpoint file" << attr_value() << checkpoint_data.m_file_name
- << " line" << attr_value() << checkpoint_data.m_line_num
+ ostr << "<LastCheckpoint file" << utils::attr_value() << checkpoint_data.m_file_name
+ << " line" << utils::attr_value() << checkpoint_data.m_line_num
<< ">"
- << cdata() << checkpoint_data.m_message
+ << utils::cdata() << checkpoint_data.m_message
<< "</LastCheckpoint>";
}
}
@@ -153,8 +153,8 @@ xml_log_formatter::log_entry_start( std::ostream& ostr, log_entry_data const& en
m_curr_tag = xml_tags[let];
ostr << '<' << m_curr_tag
- << BOOST_TEST_L( " file" ) << attr_value() << entry_data.m_file_name
- << BOOST_TEST_L( " line" ) << attr_value() << entry_data.m_line_num
+ << BOOST_TEST_L( " file" ) << utils::attr_value() << entry_data.m_file_name
+ << BOOST_TEST_L( " line" ) << utils::attr_value() << entry_data.m_line_num
<< BOOST_TEST_L( "><![CDATA[" );
m_value_closed = false;
@@ -165,7 +165,7 @@ xml_log_formatter::log_entry_start( std::ostream& ostr, log_entry_data const& en
void
xml_log_formatter::log_entry_value( std::ostream& ostr, const_string value )
{
- print_escaped_cdata( ostr, value );
+ utils::print_escaped_cdata( ostr, value );
}
//____________________________________________________________________________//
@@ -194,7 +194,6 @@ xml_log_formatter::entry_context_start( std::ostream& ostr, log_level )
}
ostr << BOOST_TEST_L( "<Context>" );
-
}
//____________________________________________________________________________//
@@ -210,7 +209,7 @@ xml_log_formatter::entry_context_finish( std::ostream& ostr )
void
xml_log_formatter::log_entry_context( std::ostream& ostr, const_string context_descr )
{
- ostr << BOOST_TEST_L( "<Frame>" ) << cdata() << context_descr << BOOST_TEST_L( "</Frame>" );
+ ostr << BOOST_TEST_L( "<Frame>" ) << utils::cdata() << context_descr << BOOST_TEST_L( "</Frame>" );
}
//____________________________________________________________________________//
diff --git a/boost/test/impl/xml_report_formatter.ipp b/boost/test/impl/xml_report_formatter.ipp
index 5606fdc0b1..08af9a3427 100644
--- a/boost/test/impl/xml_report_formatter.ipp
+++ b/boost/test/impl/xml_report_formatter.ipp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -65,22 +65,21 @@ xml_report_formatter::test_unit_report_start( test_unit const& tu, std::ostream&
descr = "failed";
ostr << '<' << ( tu.p_type == TUT_CASE ? "TestCase" : "TestSuite" )
- << " name" << attr_value() << tu.p_name.get()
- << " result" << attr_value() << descr
- << " assertions_passed" << attr_value() << tr.p_assertions_passed
- << " assertions_failed" << attr_value() << tr.p_assertions_failed
- << " warnings_failed" << attr_value() << tr.p_warnings_failed
- << " expected_failures" << attr_value() << tr.p_expected_failures;
+ << " name" << utils::attr_value() << tu.p_name
+ << " result" << utils::attr_value() << descr
+ << " assertions_passed" << utils::attr_value() << tr.p_assertions_passed
+ << " assertions_failed" << utils::attr_value() << tr.p_assertions_failed
+ << " warnings_failed" << utils::attr_value() << tr.p_warnings_failed
+ << " expected_failures" << utils::attr_value() << tr.p_expected_failures;
if( tu.p_type == TUT_SUITE ) {
- ostr << " test_cases_passed" << attr_value() << tr.p_test_cases_passed
- << " test_cases_passed_with_warnings" << attr_value() << tr.p_test_cases_warned
- << " test_cases_failed" << attr_value() << tr.p_test_cases_failed
- << " test_cases_skipped" << attr_value() << tr.p_test_cases_skipped
- << " test_cases_aborted" << attr_value() << tr.p_test_cases_aborted;
+ ostr << " test_cases_passed" << utils::attr_value() << tr.p_test_cases_passed
+ << " test_cases_passed_with_warnings" << utils::attr_value() << tr.p_test_cases_warned
+ << " test_cases_failed" << utils::attr_value() << tr.p_test_cases_failed
+ << " test_cases_skipped" << utils::attr_value() << tr.p_test_cases_skipped
+ << " test_cases_aborted" << utils::attr_value() << tr.p_test_cases_aborted;
}
-
ostr << '>';
}
diff --git a/boost/test/included/execution_monitor.hpp b/boost/test/included/execution_monitor.hpp
index d372084604..cff2adc9a0 100644
--- a/boost/test/included/execution_monitor.hpp
+++ b/boost/test/included/execution_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2010-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/included/prg_exec_monitor.hpp b/boost/test/included/prg_exec_monitor.hpp
index e8d655be7d..ff48ce5594 100644
--- a/boost/test/included/prg_exec_monitor.hpp
+++ b/boost/test/included/prg_exec_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/included/test_exec_monitor.hpp b/boost/test/included/test_exec_monitor.hpp
index 0d5e4b1bf4..cedbcb0ad8 100644
--- a/boost/test/included/test_exec_monitor.hpp
+++ b/boost/test/included/test_exec_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/included/unit_test.hpp b/boost/test/included/unit_test.hpp
index 5bc17a38cb..03c0277d6d 100644
--- a/boost/test/included/unit_test.hpp
+++ b/boost/test/included/unit_test.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/included/unit_test_framework.hpp b/boost/test/included/unit_test_framework.hpp
index 219cc6c283..5bf366ad80 100644
--- a/boost/test/included/unit_test_framework.hpp
+++ b/boost/test/included/unit_test_framework.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2012.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/minimal.hpp b/boost/test/minimal.hpp
index dfaa68c6e2..c52295309e 100644
--- a/boost/test/minimal.hpp
+++ b/boost/test/minimal.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2002-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/output/compiler_log_formatter.hpp b/boost/test/output/compiler_log_formatter.hpp
index 0b3e881179..e3f98d7567 100644
--- a/boost/test/output/compiler_log_formatter.hpp
+++ b/boost/test/output/compiler_log_formatter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -33,6 +33,8 @@ namespace output {
class BOOST_TEST_DECL compiler_log_formatter : public unit_test_log_formatter {
public:
+ compiler_log_formatter() : m_color_output( false ) {}
+
// Formatter interface
void log_start( std::ostream&, counter_t test_cases_amount );
void log_finish( std::ostream& );
@@ -56,6 +58,9 @@ public:
protected:
virtual void print_prefix( std::ostream&, const_string file, std::size_t line );
+
+ // Data members
+ bool m_color_output;
};
} // namespace output
diff --git a/boost/test/output/plain_report_formatter.hpp b/boost/test/output/plain_report_formatter.hpp
index ff8924f623..8c50964597 100644
--- a/boost/test/output/plain_report_formatter.hpp
+++ b/boost/test/output/plain_report_formatter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -33,6 +33,8 @@ namespace output {
class plain_report_formatter : public results_reporter::format {
public:
+ plain_report_formatter() : m_indent( 0 ), m_color_output( false ) {}
+
// Formatter interface
void results_report_start( std::ostream& ostr );
void results_report_finish( std::ostream& ostr );
@@ -45,6 +47,7 @@ public:
private:
// Data members
counter_t m_indent;
+ bool m_color_output;
};
} // namespace output
diff --git a/boost/test/output/xml_log_formatter.hpp b/boost/test/output/xml_log_formatter.hpp
index 7c05e482e7..4d848a0425 100644
--- a/boost/test/output/xml_log_formatter.hpp
+++ b/boost/test/output/xml_log_formatter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/output/xml_report_formatter.hpp b/boost/test/output/xml_report_formatter.hpp
index ab183d02ae..ca5e47182f 100644
--- a/boost/test/output/xml_report_formatter.hpp
+++ b/boost/test/output/xml_report_formatter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/output_test_stream.hpp b/boost/test/output_test_stream.hpp
index 83f9264635..26eaf320ac 100644
--- a/boost/test/output_test_stream.hpp
+++ b/boost/test/output_test_stream.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/parameterized_test.hpp b/boost/test/parameterized_test.hpp
index 4e08567d31..b94e7ec8b3 100644
--- a/boost/test/parameterized_test.hpp
+++ b/boost/test/parameterized_test.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/predicate_result.hpp b/boost/test/predicate_result.hpp
index fb924c7733..9b57363713 100644
--- a/boost/test/predicate_result.hpp
+++ b/boost/test/predicate_result.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/prg_exec_monitor.hpp b/boost/test/prg_exec_monitor.hpp
index 7234833f72..f072e215db 100644
--- a/boost/test/prg_exec_monitor.hpp
+++ b/boost/test/prg_exec_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/progress_monitor.hpp b/boost/test/progress_monitor.hpp
index 3d66152297..e480ac669d 100644
--- a/boost/test/progress_monitor.hpp
+++ b/boost/test/progress_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/results_collector.hpp b/boost/test/results_collector.hpp
index f34bf38345..d12fefb39c 100644
--- a/boost/test/results_collector.hpp
+++ b/boost/test/results_collector.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/results_reporter.hpp b/boost/test/results_reporter.hpp
index 4c8627e458..6f8d8f1105 100644
--- a/boost/test/results_reporter.hpp
+++ b/boost/test/results_reporter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/test_case_template.hpp b/boost/test/test_case_template.hpp
index 77adf6cc8c..c01bd0738a 100644
--- a/boost/test/test_case_template.hpp
+++ b/boost/test/test_case_template.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2003-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/test_exec_monitor.hpp b/boost/test/test_exec_monitor.hpp
index af81aa0296..0450809335 100644
--- a/boost/test/test_exec_monitor.hpp
+++ b/boost/test/test_exec_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/test_tools.hpp b/boost/test/test_tools.hpp
index dea2b20fa2..a542d5fcde 100644
--- a/boost/test/test_tools.hpp
+++ b/boost/test/test_tools.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -15,16 +15,24 @@
#define BOOST_TEST_TOOLS_HPP_111812GER
#include <boost/config.hpp>
+
+// brings some compiler configuration like BOOST_PP_VARIADICS
+#include <boost/test/detail/config.hpp>
+
#include <boost/preprocessor/config/config.hpp>
-#if !BOOST_PP_VARIADICS || ((__cplusplus >= 201103L) && defined(BOOST_NO_CXX11_VARIADIC_MACROS))
-#define BOOST_TEST_NO_VARIADIC
+#if defined(BOOST_NO_CXX11_VARIADIC_MACROS) \
+ || defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) \
+ || defined(BOOST_NO_CXX11_DECLTYPE)
+# define BOOST_TEST_MACRO_LIMITED_SUPPORT
#endif
// Boost.Test
// #define BOOST_TEST_NO_OLD_TOOLS
-#if defined(BOOST_TEST_NO_VARIADIC)
+#if defined(BOOST_TEST_MACRO_LIMITED_SUPPORT) \
+ && ( !BOOST_PP_VARIADICS \
+ || !(__cplusplus >= 201103L) && defined(BOOST_NO_CXX11_VARIADIC_MACROS))
# define BOOST_TEST_NO_NEW_TOOLS
#endif
@@ -57,5 +65,4 @@
# include <boost/test/tools/detail/lexicographic_manip.hpp>
#endif
-
#endif // BOOST_TEST_TOOLS_HPP_111812GER
diff --git a/boost/test/tools/assertion.hpp b/boost/test/tools/assertion.hpp
index b46b6760e7..cca2f52beb 100644
--- a/boost/test/tools/assertion.hpp
+++ b/boost/test/tools/assertion.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -23,6 +23,7 @@
#include <boost/mpl/assert.hpp>
#include <boost/utility/declval.hpp>
#include <boost/type_traits/remove_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
// STL
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
@@ -180,15 +181,17 @@ class expression_base {
public:
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-
+ template<typename T>
+ struct RhsT : remove_const<typename remove_reference<T>::type> {};
+
#define ADD_OP_SUPPORT( oper, name, _ ) \
template<typename T> \
binary_expr<ExprType,T, \
- op::name<ValType,typename remove_reference<T>::type> > \
+ op::name<ValType,typename RhsT<T>::type> > \
operator oper( T&& rhs ) \
{ \
return binary_expr<ExprType,T, \
- op::name<ValType,typename remove_reference<T>::type> > \
+ op::name<ValType,typename RhsT<T>::type> > \
( std::forward<ExprType>( \
*static_cast<ExprType*>(this) ), \
std::forward<T>(rhs) ); \
@@ -199,7 +202,7 @@ public:
#define ADD_OP_SUPPORT( oper, name, _ ) \
template<typename T> \
binary_expr<ExprType,typename boost::decay<T const>::type, \
- op::name<ValType,typename boost::decay<T const>::type> > \
+ op::name<ValType,typename boost::decay<T const>::type> >\
operator oper( T const& rhs ) const \
{ \
typedef typename boost::decay<T const>::type Rhs; \
@@ -248,7 +251,7 @@ public:
// simple value expression
template<typename T>
-class value_expr : public expression_base<value_expr<T>,typename remove_reference<T>::type> {
+class value_expr : public expression_base<value_expr<T>,typename remove_const<typename remove_reference<T>::type>::type> {
public:
// Public types
typedef T result_type;
diff --git a/boost/test/tools/assertion_result.hpp b/boost/test/tools/assertion_result.hpp
index 85cd18c0eb..85eea741f7 100644
--- a/boost/test/tools/assertion_result.hpp
+++ b/boost/test/tools/assertion_result.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/collection_comparison_op.hpp b/boost/test/tools/collection_comparison_op.hpp
index 81a7046725..e5c5ca3bb8 100644
--- a/boost/test/tools/collection_comparison_op.hpp
+++ b/boost/test/tools/collection_comparison_op.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2014-2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -50,7 +50,7 @@ struct specialized_compare<Col> : public mpl::true_ {}; \
namespace op {
-template <typename OP, bool can_be_equal, bool prefer_shorter,
+template <typename OP, bool can_be_equal, bool prefer_shorter,
typename Lhs, typename Rhs>
inline assertion_result
lexicographic_compare( Lhs const& lhs, Rhs const& rhs )
@@ -69,13 +69,13 @@ lexicographic_compare( Lhs const& lhs, Rhs const& rhs )
return ar; // a < b
assertion_result const& reverse_ar = OP::eval(*first2, *first1);
- if( element_ar && !reverse_ar )
+ if( element_ar && !reverse_ar )
return ar; // a<=b and !(b<=a) => a < b => return true
-
- if( element_ar || !reverse_ar )
- continue; // (a<=b and b<=a) or (!(a<b) and !(b<a)) => a == b => keep looking
- // !(a<=b) and b<=a => b < a => return false
+ if( element_ar || !reverse_ar )
+ continue; // (a<=b and b<=a) or (!(a<b) and !(b<a)) => a == b => keep looking
+
+ // !(a<=b) and b<=a => b < a => return false
ar = false;
ar.message() << "\nFailure at position " << pos << ": "
<< tt_detail::print_helper(*first1)
@@ -85,7 +85,7 @@ lexicographic_compare( Lhs const& lhs, Rhs const& rhs )
return ar;
}
-
+
if( first1 != last1 ) {
if( prefer_shorter ) {
ar = false;
@@ -325,7 +325,7 @@ compare_collections( Lhs const& lhs, Rhs const& rhs, boost::type<op::GE<L, R> >*
// ********* specialization of comparison operators for collections ********* //
// ************************************************************************** //
-#define DEFINE_COLLECTION_COMPARISON( oper, name, _ ) \
+#define DEFINE_COLLECTION_COMPARISON( oper, name, rev ) \
template<typename Lhs,typename Rhs> \
struct name<Lhs,Rhs,typename boost::enable_if_c< \
unit_test::is_forward_iterable<Lhs>::value && \
@@ -356,6 +356,10 @@ public: \
report( std::ostream&, \
PrevExprType const&, \
Rhs const& ) {} \
+ \
+ static char const* revert() \
+ { return " " #rev " "; } \
+ \
}; \
/**/
@@ -372,4 +376,3 @@ BOOST_TEST_FOR_EACH_COMP_OP( DEFINE_COLLECTION_COMPARISON )
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_TOOLS_COLLECTION_COMPARISON_OP_HPP_050815GER
-
diff --git a/boost/test/tools/context.hpp b/boost/test/tools/context.hpp
index 38018b84b8..71650065ef 100644
--- a/boost/test/tools/context.hpp
+++ b/boost/test/tools/context.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/cstring_comparison_op.hpp b/boost/test/tools/cstring_comparison_op.hpp
index 3b114e5977..0aaf997b5d 100644
--- a/boost/test/tools/cstring_comparison_op.hpp
+++ b/boost/test/tools/cstring_comparison_op.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2014-2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/bitwise_manip.hpp b/boost/test/tools/detail/bitwise_manip.hpp
index e0fd36acd4..f8c9685c10 100644
--- a/boost/test/tools/detail/bitwise_manip.hpp
+++ b/boost/test/tools/detail/bitwise_manip.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/expression_holder.hpp b/boost/test/tools/detail/expression_holder.hpp
index 7d7efd04e6..694a2d5f4e 100644
--- a/boost/test/tools/detail/expression_holder.hpp
+++ b/boost/test/tools/detail/expression_holder.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/fwd.hpp b/boost/test/tools/detail/fwd.hpp
index d5915a1656..339ab39eda 100644
--- a/boost/test/tools/detail/fwd.hpp
+++ b/boost/test/tools/detail/fwd.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/indirections.hpp b/boost/test/tools/detail/indirections.hpp
index 429420f55a..836218d98d 100644
--- a/boost/test/tools/detail/indirections.hpp
+++ b/boost/test/tools/detail/indirections.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/it_pair.hpp b/boost/test/tools/detail/it_pair.hpp
index 929bbae96d..4352fd464f 100644
--- a/boost/test/tools/detail/it_pair.hpp
+++ b/boost/test/tools/detail/it_pair.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/lexicographic_manip.hpp b/boost/test/tools/detail/lexicographic_manip.hpp
index 01d63a9e91..f6ffff7a34 100644
--- a/boost/test/tools/detail/lexicographic_manip.hpp
+++ b/boost/test/tools/detail/lexicographic_manip.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/per_element_manip.hpp b/boost/test/tools/detail/per_element_manip.hpp
index efcd45e9b8..4a9aebbaaa 100644
--- a/boost/test/tools/detail/per_element_manip.hpp
+++ b/boost/test/tools/detail/per_element_manip.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/print_helper.hpp b/boost/test/tools/detail/print_helper.hpp
index ab15146aa2..77b936c44b 100644
--- a/boost/test/tools/detail/print_helper.hpp
+++ b/boost/test/tools/detail/print_helper.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/detail/tolerance_manip.hpp b/boost/test/tools/detail/tolerance_manip.hpp
index adb58f98d0..e07b043591 100644
--- a/boost/test/tools/detail/tolerance_manip.hpp
+++ b/boost/test/tools/detail/tolerance_manip.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -50,7 +50,7 @@ inline tolerance_manip<FPT>
operator%( FPT v, tolerance_manip_delay const& )
{
BOOST_STATIC_ASSERT_MSG( (fpc::tolerance_based<FPT>::value),
- "tolerance only for floating points" );
+ "tolerance should be specified using a floating points type" );
return tolerance_manip<FPT>( FPT(v / 100) );
}
diff --git a/boost/test/tools/floating_point_comparison.hpp b/boost/test/tools/floating_point_comparison.hpp
index fac914c91d..d704a41092 100644
--- a/boost/test/tools/floating_point_comparison.hpp
+++ b/boost/test/tools/floating_point_comparison.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -285,7 +285,7 @@ public:
// Action method
bool operator()( FPT fpv ) const
{
- return fpc::fpc_detail::fpt_abs( fpv ) < m_tolerance;
+ return fpc::fpc_detail::fpt_abs( fpv ) <= m_tolerance;
}
private:
diff --git a/boost/test/tools/fpc_op.hpp b/boost/test/tools/fpc_op.hpp
index a2513ccfa3..da143aa9f3 100644
--- a/boost/test/tools/fpc_op.hpp
+++ b/boost/test/tools/fpc_op.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2014-2015.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -169,27 +169,27 @@ public: \
typedef assertion_result result_type; \
\
static bool \
- eval_direct( Lhs const& lhs, Rhs const& rhs) \
+ eval_direct( Lhs const& lhs, Rhs const& rhs ) \
{ \
return lhs oper rhs; \
} \
\
static assertion_result \
- eval( Lhs const& lhs, Rhs const& rhs) \
+ eval( Lhs const& lhs, Rhs const& rhs ) \
{ \
if( lhs == 0 ) \
- return compare_fpv_near_zero(rhs, (OP*)0); \
+ return compare_fpv_near_zero( rhs, (OP*)0 ); \
\
if( rhs == 0 ) \
- return compare_fpv_near_zero(lhs, (OP*)0); \
+ return compare_fpv_near_zero( lhs, (OP*)0 ); \
\
bool direct_res = eval_direct( lhs, rhs ); \
\
- if((direct_res && fpctraits<OP>::cmp_direct) \
- || fpc_tolerance<FPT>() == FPT(0)) \
+ if( (direct_res && fpctraits<OP>::cmp_direct) || \
+ fpc_tolerance<FPT>() == FPT(0) ) \
return direct_res; \
\
- return compare_fpv<FPT>(lhs, rhs, (OP*)0); \
+ return compare_fpv<FPT>( lhs, rhs, (OP*)0 ); \
} \
\
template<typename PrevExprType> \
diff --git a/boost/test/tools/fpc_tolerance.hpp b/boost/test/tools/fpc_tolerance.hpp
index 013b571ded..c862a17e75 100644
--- a/boost/test/tools/fpc_tolerance.hpp
+++ b/boost/test/tools/fpc_tolerance.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/interface.hpp b/boost/test/tools/interface.hpp
index fe51021303..48d5affc4f 100644
--- a/boost/test/tools/interface.hpp
+++ b/boost/test/tools/interface.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/old/impl.hpp b/boost/test/tools/old/impl.hpp
index e5414f566e..b975f61b38 100644
--- a/boost/test/tools/old/impl.hpp
+++ b/boost/test/tools/old/impl.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tools/old/interface.hpp b/boost/test/tools/old/interface.hpp
index 0c35c82b87..2d6f8b78c0 100644
--- a/boost/test/tools/old/interface.hpp
+++ b/boost/test/tools/old/interface.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -95,16 +95,17 @@ do {
//____________________________________________________________________________//
-#define BOOST_CHECK_THROW_IMPL( S, E, P, prefix, TL ) \
+#define BOOST_CHECK_THROW_IMPL( S, E, P, postfix, TL ) \
do { \
try { \
BOOST_TEST_PASSPOINT(); \
S; \
- BOOST_TEST_TOOL_IMPL( 2, false, "exception " BOOST_STRINGIZE(E) " is expected", \
+ BOOST_TEST_TOOL_IMPL( 2, false, "exception " BOOST_STRINGIZE(E) " expected but not raised", \
TL, CHECK_MSG, _ ); \
} catch( E const& ex ) { \
::boost::unit_test::ut_detail::ignore_unused_variable_warning( ex ); \
- BOOST_TEST_TOOL_IMPL( 2, P, prefix BOOST_STRINGIZE( E ) " is caught", \
+ BOOST_TEST_TOOL_IMPL( 2, P, \
+ "exception \"" BOOST_STRINGIZE( E )"\" raised as expected" postfix, \
TL, CHECK_MSG, _ ); \
} \
} while( ::boost::test_tools::tt_detail::dummy_cond() ) \
@@ -112,15 +113,18 @@ do {
//____________________________________________________________________________//
-#define BOOST_WARN_THROW( S, E ) BOOST_CHECK_THROW_IMPL( S, E, true, "exception ", WARN )
-#define BOOST_CHECK_THROW( S, E ) BOOST_CHECK_THROW_IMPL( S, E, true, "exception ", CHECK )
-#define BOOST_REQUIRE_THROW( S, E ) BOOST_CHECK_THROW_IMPL( S, E, true, "exception ", REQUIRE )
+#define BOOST_WARN_THROW( S, E ) BOOST_CHECK_THROW_IMPL( S, E, true, "", WARN )
+#define BOOST_CHECK_THROW( S, E ) BOOST_CHECK_THROW_IMPL( S, E, true, "", CHECK )
+#define BOOST_REQUIRE_THROW( S, E ) BOOST_CHECK_THROW_IMPL( S, E, true, "", REQUIRE )
//____________________________________________________________________________//
-#define BOOST_WARN_EXCEPTION( S, E, P ) BOOST_CHECK_THROW_IMPL( S, E, P( ex ), "incorrect exception ", WARN )
-#define BOOST_CHECK_EXCEPTION( S, E, P ) BOOST_CHECK_THROW_IMPL( S, E, P( ex ), "incorrect exception ", CHECK )
-#define BOOST_REQUIRE_EXCEPTION( S, E, P ) BOOST_CHECK_THROW_IMPL( S, E, P( ex ), "incorrect exception ", REQUIRE )
+#define BOOST_WARN_EXCEPTION( S, E, P ) BOOST_CHECK_THROW_IMPL( S, E, P( ex ), \
+ ": validation on the raised exception through predicate \"" BOOST_STRINGIZE(P) "\"", WARN )
+#define BOOST_CHECK_EXCEPTION( S, E, P ) BOOST_CHECK_THROW_IMPL( S, E, P( ex ), \
+ ": validation on the raised exception through predicate \"" BOOST_STRINGIZE(P) "\"", CHECK )
+#define BOOST_REQUIRE_EXCEPTION( S, E, P ) BOOST_CHECK_THROW_IMPL( S, E, P( ex ), \
+ ": validation on the raised exception through predicate \"" BOOST_STRINGIZE(P) "\"", REQUIRE )
//____________________________________________________________________________//
@@ -131,7 +135,7 @@ do {
BOOST_TEST_TOOL_IMPL( 2, true, "no exceptions thrown by " BOOST_STRINGIZE( S ), \
TL, CHECK_MSG, _ ); \
} catch( ... ) { \
- BOOST_TEST_TOOL_IMPL( 2, false, "exception thrown by " BOOST_STRINGIZE( S ), \
+ BOOST_TEST_TOOL_IMPL( 2, false, "unexpected exception thrown by " BOOST_STRINGIZE( S ), \
TL, CHECK_MSG, _ ); \
} \
} while( ::boost::test_tools::tt_detail::dummy_cond() ) \
diff --git a/boost/test/tools/output_test_stream.hpp b/boost/test/tools/output_test_stream.hpp
index 89c9ad1919..02d3715e9d 100644
--- a/boost/test/tools/output_test_stream.hpp
+++ b/boost/test/tools/output_test_stream.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/auto_registration.hpp b/boost/test/tree/auto_registration.hpp
index a32e6b8ad1..a3fe32fda7 100644
--- a/boost/test/tree/auto_registration.hpp
+++ b/boost/test/tree/auto_registration.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/decorator.hpp b/boost/test/tree/decorator.hpp
index c24a0210ad..27c46682a0 100644
--- a/boost/test/tree/decorator.hpp
+++ b/boost/test/tree/decorator.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/fixture.hpp b/boost/test/tree/fixture.hpp
index da6befbae7..7bca5a8de3 100644
--- a/boost/test/tree/fixture.hpp
+++ b/boost/test/tree/fixture.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/global_fixture.hpp b/boost/test/tree/global_fixture.hpp
index 9ba4462a5c..89ee61eb0c 100644
--- a/boost/test/tree/global_fixture.hpp
+++ b/boost/test/tree/global_fixture.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/observer.hpp b/boost/test/tree/observer.hpp
index 3ae96c488d..d878949f67 100644
--- a/boost/test/tree/observer.hpp
+++ b/boost/test/tree/observer.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -38,7 +38,7 @@ public:
virtual void test_unit_start( test_unit const& ) {}
virtual void test_unit_finish( test_unit const&, unsigned long /* elapsed */ ) {}
virtual void test_unit_skipped( test_unit const& tu, const_string ) { test_unit_skipped( tu ); }
- virtual void test_unit_skipped( test_unit const& ) {} ///< backward compartibility
+ virtual void test_unit_skipped( test_unit const& ) {} ///< backward compatibility
virtual void test_unit_aborted( test_unit const& ) {}
virtual void assertion_result( unit_test::assertion_result ar )
diff --git a/boost/test/tree/test_case_counter.hpp b/boost/test/tree/test_case_counter.hpp
index f9fa2d2bd2..6feaddcb0e 100644
--- a/boost/test/tree/test_case_counter.hpp
+++ b/boost/test/tree/test_case_counter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/test_case_template.hpp b/boost/test/tree/test_case_template.hpp
index ef2881588a..56871b7b6b 100644
--- a/boost/test/tree/test_case_template.hpp
+++ b/boost/test/tree/test_case_template.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/test_unit.hpp b/boost/test/tree/test_unit.hpp
index 4791bd15ac..273fa14ff3 100644
--- a/boost/test/tree/test_unit.hpp
+++ b/boost/test/tree/test_unit.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -82,10 +82,10 @@ public:
std::string full_name() const;
// Public r/o properties
- readonly_property<test_unit_type> p_type; ///< type for this test unit
- readonly_property<const_string> p_type_name; ///< "case"/"suite"/"module"
- readonly_property<const_string> p_file_name;
- readonly_property<std::size_t> p_line_num;
+ test_unit_type const p_type; ///< type for this test unit
+ const_string const p_type_name; ///< "case"/"suite"/"module"
+ const_string const p_file_name;
+ std::size_t const p_line_num;
id_t p_id; ///< unique id for this test unit
parent_id_t p_parent_id; ///< parent test suite id
label_list_t p_labels; ///< list of labels associated with this test unit
diff --git a/boost/test/tree/traverse.hpp b/boost/test/tree/traverse.hpp
index 461ff89ba4..d27917cace 100644
--- a/boost/test/tree/traverse.hpp
+++ b/boost/test/tree/traverse.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/tree/visitor.hpp b/boost/test/tree/visitor.hpp
index 0dd864063b..8f1bae5c92 100644
--- a/boost/test/tree/visitor.hpp
+++ b/boost/test/tree/visitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2011-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/unit_test.hpp b/boost/test/unit_test.hpp
index 6181355316..e6a236a1b5 100644
--- a/boost/test/unit_test.hpp
+++ b/boost/test/unit_test.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/unit_test_log.hpp b/boost/test/unit_test_log.hpp
index 76817ffcb8..4126953d02 100644
--- a/boost/test/unit_test_log.hpp
+++ b/boost/test/unit_test_log.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/unit_test_log_formatter.hpp b/boost/test/unit_test_log_formatter.hpp
index f89b74bd17..1e3d64322f 100644
--- a/boost/test/unit_test_log_formatter.hpp
+++ b/boost/test/unit_test_log_formatter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2003-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/unit_test_monitor.hpp b/boost/test/unit_test_monitor.hpp
index b0358352e9..1f937fa674 100644
--- a/boost/test/unit_test_monitor.hpp
+++ b/boost/test/unit_test_monitor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/unit_test_parameters.hpp b/boost/test/unit_test_parameters.hpp
index 31f76d7b2f..ad69c1732e 100644
--- a/boost/test/unit_test_parameters.hpp
+++ b/boost/test/unit_test_parameters.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -14,14 +14,15 @@
#ifndef BOOST_TEST_UNIT_TEST_PARAMETERS_HPP_071894GER
#define BOOST_TEST_UNIT_TEST_PARAMETERS_HPP_071894GER
+// Boost.Test
#include <boost/test/detail/global_typedef.hpp>
-#include <boost/test/detail/log_level.hpp>
-
-#include <boost/test/detail/suppress_warnings.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
// STL
-#include <iosfwd>
-#include <list>
+#include <iostream>
+#include <fstream>
+
+#include <boost/test/detail/suppress_warnings.hpp>
//____________________________________________________________________________//
@@ -33,53 +34,88 @@ namespace runtime_config {
// ************** runtime_config ************** //
// ************************************************************************** //
-BOOST_TEST_DECL void init( int& argc, char** argv );
-
-/// Automatically attach debugger in a location of fatal error
-BOOST_TEST_DECL bool auto_start_dbg();
-BOOST_TEST_DECL const_string break_exec_path();
-/// Should we catch system errors/sygnals?
-BOOST_TEST_DECL bool catch_sys_errors();
-/// Should we try to produce color output?
-BOOST_TEST_DECL bool color_output();
-/// Should we detect floating point exceptions?
-BOOST_TEST_DECL bool detect_fp_exceptions();
-/// Should we detect memory leaks (>0)? And if yes, which specific memory allocation should we break.
-BOOST_TEST_DECL long detect_memory_leaks();
-/// List content of test tree?
-BOOST_TEST_DECL output_format list_content();
-/// List available labels?
-BOOST_TEST_DECL bool list_labels();
-/// Which output format to use
-BOOST_TEST_DECL output_format log_format();
-/// Which log level to set
-BOOST_TEST_DECL unit_test::log_level log_level();
-/// Where to direct log stream into
-BOOST_TEST_DECL std::ostream* log_sink();
-/// If memory leak detection, where to direct the report
-BOOST_TEST_DECL const_string memory_leaks_report_file();
-/// Do not prodce result code
-BOOST_TEST_DECL bool no_result_code();
-/// Random seed to use to randomize order of test units being run
-BOOST_TEST_DECL unsigned random_seed();
-/// Which format to use to report results
-BOOST_TEST_DECL output_format report_format();
-/// Wht lever of report format to set
-BOOST_TEST_DECL unit_test::report_level report_level();
-/// Where to direct results report into
-BOOST_TEST_DECL std::ostream* report_sink();
-/// Should we save pattern (true) or match against existing pattern (used by output validation tool)
-BOOST_TEST_DECL bool save_pattern();
-/// Should Unit Test framework show the build information?
-BOOST_TEST_DECL bool show_build_info();
-/// Tells Unit Test Framework to show test progress (forces specific log level)
-BOOST_TEST_DECL bool show_progress();
-/// Specific test units to run/exclude
-BOOST_TEST_DECL std::list<std::string> const& test_to_run();
-/// Should execution monitor use alternative stack for signal handling
-BOOST_TEST_DECL bool use_alt_stack();
-/// Tells Unit Test Framework to wait for debugger to attach
-BOOST_TEST_DECL bool wait_for_debugger();
+// UTF parameters
+BOOST_TEST_DECL extern std::string AUTO_START_DBG;
+BOOST_TEST_DECL extern std::string BREAK_EXEC_PATH;
+BOOST_TEST_DECL extern std::string BUILD_INFO;
+BOOST_TEST_DECL extern std::string CATCH_SYS_ERRORS;
+BOOST_TEST_DECL extern std::string COLOR_OUTPUT;
+BOOST_TEST_DECL extern std::string DETECT_FP_EXCEPT;
+BOOST_TEST_DECL extern std::string DETECT_MEM_LEAKS;
+BOOST_TEST_DECL extern std::string LIST_CONTENT;
+BOOST_TEST_DECL extern std::string LIST_LABELS;
+BOOST_TEST_DECL extern std::string LOG_FORMAT;
+BOOST_TEST_DECL extern std::string LOG_LEVEL;
+BOOST_TEST_DECL extern std::string LOG_SINK;
+BOOST_TEST_DECL extern std::string OUTPUT_FORMAT;
+BOOST_TEST_DECL extern std::string RANDOM_SEED;
+BOOST_TEST_DECL extern std::string REPORT_FORMAT;
+BOOST_TEST_DECL extern std::string REPORT_LEVEL;
+BOOST_TEST_DECL extern std::string REPORT_MEM_LEAKS;
+BOOST_TEST_DECL extern std::string REPORT_SINK;
+BOOST_TEST_DECL extern std::string RESULT_CODE;
+BOOST_TEST_DECL extern std::string RUN_FILTERS;
+BOOST_TEST_DECL extern std::string SAVE_TEST_PATTERN;
+BOOST_TEST_DECL extern std::string SHOW_PROGRESS;
+BOOST_TEST_DECL extern std::string USE_ALT_STACK;
+BOOST_TEST_DECL extern std::string WAIT_FOR_DEBUGGER;
+
+BOOST_TEST_DECL void init( int& argc, char** argv );
+
+// ************************************************************************** //
+// ************** runtime_param::get ************** //
+// ************************************************************************** //
+
+/// Access to arguments
+BOOST_TEST_DECL runtime::arguments_store const& argument_store();
+
+template<typename T>
+inline T const&
+get( runtime::cstring parameter_name )
+{
+ return argument_store().get<T>( parameter_name );
+}
+
+/// For public access
+BOOST_TEST_DECL bool save_pattern();
+
+// ************************************************************************** //
+// ************** stream_holder ************** //
+// ************************************************************************** //
+
+class stream_holder {
+public:
+ // Constructor
+ explicit stream_holder( std::ostream& default_stream )
+ : m_stream( &default_stream )
+ {
+ }
+
+ void setup( runtime::cstring param_name )
+ {
+ if( !runtime_config::argument_store().has( param_name ) )
+ return;
+
+ std::string const& file_name = runtime_config::get<std::string>( param_name );
+
+ if( file_name == "stderr" )
+ m_stream = &std::cerr;
+ else if( file_name == "stdout" )
+ m_stream = &std::cout;
+ else {
+ m_file.open( file_name.c_str() );
+ m_stream = &m_file;
+ }
+ }
+
+ // Access methods
+ std::ostream& ref() const { return *m_stream; }
+
+private:
+ // Data members
+ std::ofstream m_file;
+ std::ostream* m_stream;
+};
} // namespace runtime_config
} // namespace unit_test
diff --git a/boost/test/unit_test_suite.hpp b/boost/test/unit_test_suite.hpp
index 41d6151354..1dbcece78a 100644
--- a/boost/test/unit_test_suite.hpp
+++ b/boost/test/unit_test_suite.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -18,8 +18,14 @@
#include <boost/test/tree/test_case_template.hpp>
#include <boost/test/tree/global_fixture.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+
#include <boost/test/detail/pp_variadic.hpp>
+
+
//____________________________________________________________________________//
// ************************************************************************** //
@@ -353,5 +359,8 @@ init_unit_test_suite( int, char* [] ) {
//____________________________________________________________________________//
+#include <boost/test/detail/enable_warnings.hpp>
+
+
#endif // BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER
diff --git a/boost/test/utils/algorithm.hpp b/boost/test/utils/algorithm.hpp
index 7a70654718..76625cbd91 100644
--- a/boost/test/utils/algorithm.hpp
+++ b/boost/test/utils/algorithm.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -22,8 +22,8 @@
//____________________________________________________________________________//
namespace boost {
-
namespace unit_test {
+namespace utils {
/// @brief this algorithm search through two collections for first mismatch position that get returned as a pair
/// of iterators, first pointing to the mismatch position in first collection, second iterator in second one
@@ -213,11 +213,10 @@ find_last_not_of( BidirectionalIterator1 first1, BidirectionalIterator1 last1,
//____________________________________________________________________________//
+} // namespace utils
} // namespace unit_test
} // namespace boost
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_ALGORITHM_HPP
-
-
diff --git a/boost/test/utils/assign_op.hpp b/boost/test/utils/assign_op.hpp
index ea49b5148b..89d8bfa956 100644
--- a/boost/test/utils/assign_op.hpp
+++ b/boost/test/utils/assign_op.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/basic_cstring/basic_cstring.hpp b/boost/test/utils/basic_cstring/basic_cstring.hpp
index 7cbd36b328..d6259990e0 100644
--- a/boost/test/utils/basic_cstring/basic_cstring.hpp
+++ b/boost/test/utils/basic_cstring/basic_cstring.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/basic_cstring/basic_cstring_fwd.hpp b/boost/test/utils/basic_cstring/basic_cstring_fwd.hpp
index a1865f4f94..f0622263d1 100644
--- a/boost/test/utils/basic_cstring/basic_cstring_fwd.hpp
+++ b/boost/test/utils/basic_cstring/basic_cstring_fwd.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/basic_cstring/bcs_char_traits.hpp b/boost/test/utils/basic_cstring/bcs_char_traits.hpp
index 4700d14291..eb77f474c7 100644
--- a/boost/test/utils/basic_cstring/bcs_char_traits.hpp
+++ b/boost/test/utils/basic_cstring/bcs_char_traits.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/basic_cstring/compare.hpp b/boost/test/utils/basic_cstring/compare.hpp
index f071a2540c..b416b1f2b9 100644
--- a/boost/test/utils/basic_cstring/compare.hpp
+++ b/boost/test/utils/basic_cstring/compare.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/basic_cstring/io.hpp b/boost/test/utils/basic_cstring/io.hpp
index 218ae6a520..02ccb126f8 100644
--- a/boost/test/utils/basic_cstring/io.hpp
+++ b/boost/test/utils/basic_cstring/io.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/class_properties.hpp b/boost/test/utils/class_properties.hpp
index 1781a17dd0..d4f3db3f2d 100644
--- a/boost/test/utils/class_properties.hpp
+++ b/boost/test/utils/class_properties.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/custom_manip.hpp b/boost/test/utils/custom_manip.hpp
index 43b581df16..d5ddaf5c07 100644
--- a/boost/test/utils/custom_manip.hpp
+++ b/boost/test/utils/custom_manip.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -24,6 +24,7 @@
namespace boost {
namespace unit_test {
+namespace utils {
// ************************************************************************** //
// ************** custom manipulators helpers ************** //
@@ -51,6 +52,7 @@ operator<<( std::ostream& ostr, custom_manip<Uniq> const& ) { return custom_prin
//____________________________________________________________________________//
+} // namespace utils
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/utils/fixed_mapping.hpp b/boost/test/utils/fixed_mapping.hpp
deleted file mode 100644
index 299a77b789..0000000000
--- a/boost/test/utils/fixed_mapping.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2001-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : fixed sized mapping with specified invalid value
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_FIXED_MAPPING_HPP
-#define BOOST_TEST_UTILS_FIXED_MAPPING_HPP
-
-// Boost
-#include <boost/preprocessor/repetition/repeat.hpp>
-#include <boost/preprocessor/arithmetic/add.hpp>
-#include <boost/call_traits.hpp>
-#include <boost/detail/binary_search.hpp>
-
-// STL
-#include <vector>
-#include <functional>
-#include <algorithm>
-#include <utility>
-
-#include <boost/test/detail/suppress_warnings.hpp>
-
-//____________________________________________________________________________//
-
-namespace boost {
-namespace unit_test {
-
-// configurable maximum fixed sized mapping size supported by this header.
-// You can redefine it before inclusion of this file.
-#ifndef MAX_MAP_SIZE
-#define MAX_MAP_SIZE 20
-#endif
-
-#define CONSTR_DECL_MID( z, i, dummy1 ) key_param_type key##i, value_param_type v##i,
-#define CONSTR_BODY_MID( z, i, dummy1 ) add_pair( key##i, v##i );
-
-#define CONSTR_DECL( z, n, dummy1 ) \
- fixed_mapping( BOOST_PP_REPEAT_ ## z( n, CONSTR_DECL_MID, "" ) \
- value_param_type invalid_value ) \
- : m_invalid_value( invalid_value ) \
- { \
- BOOST_PP_REPEAT_ ## z( n, CONSTR_BODY_MID, "" ) \
- init(); \
- } \
-/**/
-
-#define CONTRUCTORS( n ) BOOST_PP_REPEAT( n, CONSTR_DECL, "" )
-
-template<typename Key, typename Value, typename Compare = std::less<Key> >
-class fixed_mapping
-{
- typedef std::pair<Key,Value> elem_type;
- typedef std::vector<elem_type> map_type;
- typedef typename std::vector<elem_type>::const_iterator iterator;
-
- typedef typename call_traits<Key>::param_type key_param_type;
- typedef typename call_traits<Value>::param_type value_param_type;
- typedef typename call_traits<Value>::const_reference value_ref_type;
-
-#if BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
- struct p1; friend struct p1;
- struct p2; friend struct p2;
-#endif
-
- // bind( Compare(), bind(select1st<elem_type>(), _1), bind(identity<Key>(), _2) )
- struct p1 : public std::binary_function<elem_type,Key,bool>
- {
- bool operator()( elem_type const& x, Key const& y ) const { return Compare()( x.first, y ); }
- };
-
- // bind( Compare(), bind(select1st<elem_type>(), _1), bind(select1st<elem_type>(), _2) )
- struct p2 : public std::binary_function<elem_type,elem_type,bool>
- {
- bool operator()( elem_type const& x, elem_type const& y ) const { return Compare()( x.first, y.first ); }
- };
-
-public:
- // Constructors
- CONTRUCTORS( BOOST_PP_ADD( MAX_MAP_SIZE, 1 ) )
-
- // key -> value access
- value_ref_type operator[]( key_param_type key ) const
- {
- iterator it = boost::detail::lower_bound( m_map.begin(), m_map.end(), key, p1() );
-
- return (it == m_map.end() || Compare()( key, it->first ) ) ? m_invalid_value : it->second;
- }
-
-private:
- // Implementation
- void init() { std::sort( m_map.begin(), m_map.end(), p2() ); }
- void add_pair( key_param_type key, value_param_type value ) { m_map.push_back( elem_type( key, value ) ); }
-
- // Data members
- Value m_invalid_value;
- map_type m_map;
-};
-
-} // namespace unit_test
-} // namespace boost
-
-#include <boost/test/detail/enable_warnings.hpp>
-
-#undef MAX_MAP_SIZE
-#undef CONSTR_DECL_MID
-#undef CONSTR_BODY_MID
-#undef CONSTR_DECL
-#undef CONTRUCTORS
-
-#endif // BOOST_TEST_UTILS_FIXED_MAPPING_HPP
-
diff --git a/boost/test/utils/foreach.hpp b/boost/test/utils/foreach.hpp
index d57b628cd3..68462ae719 100644
--- a/boost/test/utils/foreach.hpp
+++ b/boost/test/utils/foreach.hpp
@@ -1,5 +1,5 @@
// (C) Copyright Eric Niebler 2004-2005
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/is_cstring.hpp b/boost/test/utils/is_cstring.hpp
index 5172246c67..75af0f348d 100644
--- a/boost/test/utils/is_cstring.hpp
+++ b/boost/test/utils/is_cstring.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2012-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/is_forward_iterable.hpp b/boost/test/utils/is_forward_iterable.hpp
index 8b46b1b268..a7259b82c3 100644
--- a/boost/test/utils/is_forward_iterable.hpp
+++ b/boost/test/utils/is_forward_iterable.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2012-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -12,10 +12,15 @@
#ifndef BOOST_TEST_UTILS_IS_FORWARD_ITERABLE_HPP
#define BOOST_TEST_UTILS_IS_FORWARD_ITERABLE_HPP
-#if defined(BOOST_NO_CXX11_DECLTYPE) || defined(BOOST_NO_CXX11_NULLPTR) || defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
- #define BOOST_TEST_FWD_ITERABLE_CXX03
-#endif
+#if defined(BOOST_NO_CXX11_DECLTYPE) || \
+ defined(BOOST_NO_CXX11_NULLPTR) || \
+ defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES)
+ // some issues with boost.config
+ #if !defined(BOOST_MSVC) || BOOST_MSVC_FULL_VER < 170061030 /* VC2012 upd 5 */
+ #define BOOST_TEST_FWD_ITERABLE_CXX03
+ #endif
+#endif
#if defined(BOOST_TEST_FWD_ITERABLE_CXX03)
// Boost
@@ -76,72 +81,81 @@ struct is_forward_iterable< std::set<K, C, A> > : public mpl::true_ {};
namespace ut_detail {
- template<typename T>
- struct is_present : public mpl::true_ {};
+template<typename T>
+struct is_present : public mpl::true_ {};
+
+//____________________________________________________________________________//
- // some compiler do not implement properly decltype non expression involving members (eg. VS2013)
- // a workaround is to use -> decltype syntax.
- template <class T>
- struct has_member_size {
- private:
+// some compiler do not implement properly decltype non expression involving members (eg. VS2013)
+// a workaround is to use -> decltype syntax.
+template <class T>
+struct has_member_size {
+private:
struct nil_t {};
- template<typename U> static auto test(U*) -> decltype( boost::declval<U>().size() );
- template<typename> static nil_t test(...);
+ template<typename U> static auto test( U* ) -> decltype(boost::declval<U>().size());
+ template<typename> static nil_t test( ... );
+
+public:
+ static bool const value = !std::is_same< decltype(test<T>( nullptr )), nil_t>::value;
+};
- public:
- static bool const value = !std::is_same< decltype(test<T>(nullptr)), nil_t>::value;
- };
+//____________________________________________________________________________//
- template <class T>
- struct has_member_begin {
- private:
+template <class T>
+struct has_member_begin {
+private:
struct nil_t {};
- template<typename U> static auto test(U*) -> decltype( boost::declval<U>().begin() );
- template<typename> static nil_t test(...);
- public:
- static bool const value = !std::is_same< decltype(test<T>(nullptr)), nil_t>::value;
- };
-
- template <class T>
- struct has_member_end {
- private:
+ template<typename U> static auto test( U* ) -> decltype(boost::declval<U>().begin());
+ template<typename> static nil_t test( ... );
+public:
+ static bool const value = !std::is_same< decltype(test<T>( nullptr )), nil_t>::value;
+};
+
+//____________________________________________________________________________//
+
+template <class T>
+struct has_member_end {
+private:
struct nil_t {};
- template<typename U> static auto test(U*) -> decltype( boost::declval<U>().end() );
- template<typename> static nil_t test(...);
- public:
- static bool const value = !std::is_same< decltype(test<T>(nullptr)), nil_t>::value;
- };
-
- template <class T, class enabled = void>
- struct is_forward_iterable_impl : std::false_type
- {};
-
- template <class T>
- struct is_forward_iterable_impl<
+ template<typename U> static auto test( U* ) -> decltype(boost::declval<U>().end());
+ template<typename> static nil_t test( ... );
+public:
+ static bool const value = !std::is_same< decltype(test<T>( nullptr )), nil_t>::value;
+};
+
+//____________________________________________________________________________//
+
+template <class T, class enabled = void>
+struct is_forward_iterable_impl : std::false_type {
+};
+
+//____________________________________________________________________________//
+
+template <class T>
+struct is_forward_iterable_impl<
T,
typename std::enable_if<
- is_present<typename T::const_iterator>::value &&
- is_present<typename T::value_type>::value &&
- has_member_size<T>::value &&
- has_member_begin<T>::value &&
- has_member_end<T>::value &&
- !is_cstring<T>::value
- >::type
- > : std::true_type
- {};
+ is_present<typename T::const_iterator>::value &&
+ is_present<typename T::value_type>::value &&
+ has_member_size<T>::value &&
+ has_member_begin<T>::value &&
+ has_member_end<T>::value &&
+ !is_cstring<T>::value
+ >::type
+> : std::true_type
+{};
+//____________________________________________________________________________//
} // namespace ut_detail
-
-/*! Indicates that a specific type implements the forward iterable concept.
- */
-template<typename T>
-struct is_forward_iterable {
- typedef typename std::remove_reference<T>::type T_ref;
- typedef ut_detail::is_forward_iterable_impl<T_ref> is_fwd_it_t;
- typedef mpl::bool_<is_fwd_it_t::value> type;
- enum { value = is_fwd_it_t::value };
+/*! Indicates that a specific type implements the forward iterable concept. */
+template<typename T>
+struct is_forward_iterable {
+ typedef typename std::remove_reference<T>::type T_ref;
+ typedef ut_detail::is_forward_iterable_impl<T_ref> is_fwd_it_t;
+ typedef mpl::bool_<is_fwd_it_t::value> type;
+ enum { value = is_fwd_it_t::value };
};
#endif /* defined(BOOST_TEST_FWD_ITERABLE_CXX03) */
diff --git a/boost/test/utils/iterator/ifstream_line_iterator.hpp b/boost/test/utils/iterator/ifstream_line_iterator.hpp
deleted file mode 100644
index 9a2154828c..0000000000
--- a/boost/test/utils/iterator/ifstream_line_iterator.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description :
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_IFSTREAM_LINE_ITERATOR_HPP
-#define BOOST_TEST_UTILS_IFSTREAM_LINE_ITERATOR_HPP
-
-// Boost
-#include <boost/test/utils/iterator/istream_line_iterator.hpp>
-
-// STL
-#include <fstream>
-
-#include <boost/test/detail/suppress_warnings.hpp>
-
-//____________________________________________________________________________//
-
-namespace boost {
-
-namespace unit_test {
-
-namespace ut_detail {
-
-// ************************************************************************** //
-// ************** ifstream_holder ************** //
-// ************************************************************************** //
-
-template<typename CharT>
-class ifstream_holder {
-public:
- // Constructor
- explicit ifstream_holder( basic_cstring<CharT const> file_name )
- {
- if( file_name.is_empty() )
- return;
-
- m_stream.open( file_name.begin(), std::ios::in );
- }
-
- bool is_valid()
- {
- return m_stream.is_open();
- }
-
-protected:
-#ifdef BOOST_CLASSIC_IOSTREAMS
- typedef std::ifstream stream_t;
-#else
- typedef std::basic_ifstream<CharT,std::char_traits<CharT> > stream_t;
-#endif
-
- // Data members
- stream_t m_stream;
-};
-
-} // namespace ut_detail
-
-// ************************************************************************** //
-// ************** basic_ifstream_line_iterator ************** //
-// ************************************************************************** //
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable: 4355) // 'this' : used in base member initializer list
-#endif
-
-template<typename CharT>
-class basic_ifstream_line_iterator : ut_detail::ifstream_holder<CharT>, public basic_istream_line_iterator<CharT>
-{
-public:
- basic_ifstream_line_iterator( basic_cstring<CharT const> file_name, CharT delimeter )
- : ut_detail::ifstream_holder<CharT>( file_name ), basic_istream_line_iterator<CharT>( this->m_stream, delimeter ) {}
-
- explicit basic_ifstream_line_iterator( basic_cstring<CharT const> file_name = basic_cstring<CharT const>() )
- : ut_detail::ifstream_holder<CharT>( file_name ), basic_istream_line_iterator<CharT>( this->m_stream ) {}
-};
-
-#ifdef BOOST_MSVC
-# pragma warning(default: 4355)
-# pragma warning(pop)
-#endif
-
-typedef basic_ifstream_line_iterator<char> ifstream_line_iterator;
-typedef basic_ifstream_line_iterator<wchar_t> wifstream_line_iterator;
-
-} // namespace unit_test
-
-} // namespace boost
-
-//____________________________________________________________________________//
-
-#include <boost/test/detail/enable_warnings.hpp>
-
-#endif // BOOST_TEST_UTILS_IFSTREAM_LINE_ITERATOR_HPP
-
diff --git a/boost/test/utils/iterator/input_iterator_facade.hpp b/boost/test/utils/iterator/input_iterator_facade.hpp
index a160808971..d695ee3a87 100644
--- a/boost/test/utils/iterator/input_iterator_facade.hpp
+++ b/boost/test/utils/iterator/input_iterator_facade.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -20,8 +20,8 @@
//____________________________________________________________________________//
namespace boost {
-
namespace unit_test {
+namespace utils {
// ************************************************************************** //
// ************** input_iterator_core_access ************** //
@@ -94,8 +94,8 @@ private:
}
};
+} // namespace utils
} // namespace unit_test
-
} // namespace boost
//____________________________________________________________________________//
@@ -103,4 +103,3 @@ private:
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_INPUT_ITERATOR_FACADE_HPP
-
diff --git a/boost/test/utils/iterator/istream_line_iterator.hpp b/boost/test/utils/iterator/istream_line_iterator.hpp
deleted file mode 100644
index f75be9ca77..0000000000
--- a/boost/test/utils/iterator/istream_line_iterator.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description :
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_ISTREAM_LINE_ITERATOR_HPP
-#define BOOST_TEST_UTILS_ISTREAM_LINE_ITERATOR_HPP
-
-// Boost
-#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
-#include <boost/test/utils/iterator/input_iterator_facade.hpp>
-
-// STL
-#include <iosfwd>
-
-#include <boost/test/detail/suppress_warnings.hpp>
-
-//____________________________________________________________________________//
-
-namespace boost {
-
-namespace unit_test {
-
-// ************************************************************************** //
-// ************** basic_istream_line_iterator ************** //
-// ************************************************************************** //
-
-// !! Should we support policy based delimitation
-
-template<typename CharT>
-class basic_istream_line_iterator
-: public input_iterator_facade<basic_istream_line_iterator<CharT>,
- std::basic_string<CharT>,
- basic_cstring<CharT const> > {
- typedef input_iterator_facade<basic_istream_line_iterator<CharT>,
- std::basic_string<CharT>,
- basic_cstring<CharT const> > base;
-#ifdef BOOST_CLASSIC_IOSTREAMS
- typedef std::istream istream_type;
-#else
- typedef std::basic_istream<CharT> istream_type;
-#endif
-public:
- // Constructors
- basic_istream_line_iterator() {}
- basic_istream_line_iterator( istream_type& input, CharT delimeter )
- : m_input_stream( &input ), m_delimeter( delimeter )
- {
- this->init();
- }
- explicit basic_istream_line_iterator( istream_type& input )
- : m_input_stream( &input )
- , m_delimeter( input.widen( '\n' ) )
- {
- this->init();
- }
-
-private:
- friend class input_iterator_core_access;
-
- // increment implementation
- bool get()
- {
- return !!std::getline( *m_input_stream, this->m_value, m_delimeter );
- }
-
- // Data members
- istream_type* m_input_stream;
- CharT m_delimeter;
-};
-
-typedef basic_istream_line_iterator<char> istream_line_iterator;
-typedef basic_istream_line_iterator<wchar_t> wistream_line_iterator;
-
-} // namespace unit_test
-
-} // namespace boost
-
-//____________________________________________________________________________//
-
-#include <boost/test/detail/enable_warnings.hpp>
-
-#endif // BOOST_TEST_UTILS_ISTREAM_LINE_ITERATOR_HPP
-
diff --git a/boost/test/utils/iterator/token_iterator.hpp b/boost/test/utils/iterator/token_iterator.hpp
index c41f071739..abc530041d 100644
--- a/boost/test/utils/iterator/token_iterator.hpp
+++ b/boost/test/utils/iterator/token_iterator.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -40,8 +40,8 @@ namespace std{ using ::ispunct; using ::isspace; }
#endif
namespace boost {
-
namespace unit_test {
+namespace utils {
// ************************************************************************** //
// ************** ti_delimeter_type ************** //
@@ -82,22 +82,21 @@ class delim_policy {
typedef basic_cstring<CharT const> cstring;
public:
// Constructor
- explicit delim_policy( ti_delimeter_type t = dt_char, cstring d = cstring() )
- : m_type( t )
+ explicit delim_policy( ti_delimeter_type type_ = dt_char, cstring delimeters_ = cstring() )
+ : m_type( type_ )
{
- set_delimeters( d );
+ set_delimeters( delimeters_ );
}
- void set_delimeters( ti_delimeter_type t ) { m_type = t; }
- template<typename Src>
- void set_delimeters( Src d )
+ void set_delimeters( ti_delimeter_type type_ ) { m_type = type_; }
+ void set_delimeters( cstring delimeters_ )
{
- nfp::optionally_assign( m_delimeters, d );
+ m_delimeters = delimeters_;
if( !m_delimeters.is_empty() )
m_type = dt_char;
}
-
+ void set_delimeters( nfp::nil ) {}
bool operator()( CharT c )
{
switch( m_type ) {
@@ -210,7 +209,7 @@ protected:
if( m.has( keep_empty_tokens ) )
m_keep_empty_tokens = true;
- nfp::optionally_assign( m_tokens_left, m, max_tokens );
+ nfp::opt_assign( m_tokens_left, m, max_tokens );
}
template<typename Iter>
@@ -406,8 +405,8 @@ make_range_token_iterator( Iter begin, Iter end, Modifier const& m )
//____________________________________________________________________________//
+} // namespace utils
} // namespace unit_test
-
} // namespace boost
//____________________________________________________________________________//
diff --git a/boost/test/utils/lazy_ostream.hpp b/boost/test/utils/lazy_ostream.hpp
index 8aef34133b..26bd8ed385 100644
--- a/boost/test/utils/lazy_ostream.hpp
+++ b/boost/test/utils/lazy_ostream.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2008-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -123,8 +123,6 @@ operator<<( lazy_ostream_impl<PrevPrevType,TPrev> const& prev, R& (BOOST_TEST_CA
} // namespace unit_test
} // namespace boost
-//____________________________________________________________________________//
-
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_LAZY_OSTREAM_HPP
diff --git a/boost/test/utils/named_params.hpp b/boost/test/utils/named_params.hpp
index 0e66dc39c5..ebd5a6a751 100644
--- a/boost/test/utils/named_params.hpp
+++ b/boost/test/utils/named_params.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -9,7 +9,7 @@
//
// Version : $Revision$
//
-// Description : facilities for named function parameters support
+// Description : named function parameters library
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_NAMED_PARAM
@@ -18,7 +18,6 @@
// Boost
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
-#include <boost/mpl/bool.hpp>
// Boost.Test
#include <boost/test/utils/rtti.hpp>
@@ -29,6 +28,14 @@
#include <boost/test/detail/throw_exception.hpp>
+// Boost
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/mpl/bool.hpp>
+
#include <boost/test/detail/suppress_warnings.hpp>
//____________________________________________________________________________//
@@ -40,29 +47,78 @@ namespace nfp { // named function parameters
// ************** forward declarations ************** //
// ************************************************************************** //
-template<typename T, typename unique_id,typename RefType> struct named_parameter;
-template<typename unique_id,bool required> struct keyword;
+template<typename unique_id, bool required> struct keyword;
+template<typename T, typename unique_id, bool required = false> struct typed_keyword;
-namespace nfp_detail {
+template<typename T, typename unique_id, typename RefType=T&> struct named_parameter;
+template<typename NP1,typename NP2> struct named_parameter_combine;
+
+// ************************************************************************** //
+// ************** is_named_param_pack ************** //
+// ************************************************************************** //
+
+/// is_named_param_pack<T>::value is true if T is parameters pack
+
+template<typename T>
+struct is_named_param_pack : public mpl::false_ {};
+
+template<typename T, typename unique_id, typename RefType>
+struct is_named_param_pack<named_parameter<T,unique_id,RefType> > : public mpl::true_ {};
-template<typename NP1,typename NP2> struct named_parameter_combine;
+template<typename NP, typename Rest>
+struct is_named_param_pack<named_parameter_combine<NP,Rest> > : public mpl::true_ {};
+
+// ************************************************************************** //
+// ************** param_type ************** //
+// ************************************************************************** //
+
+/// param_type<Params,Keyword,Default>::type is is the type of the parameter
+/// corresponding to the Keyword (if parameter is present) or Default
+
+template<typename NP, typename Keyword, typename DefaultType=void>
+struct param_type
+: mpl::if_<typename is_same<typename NP::id,typename Keyword::id>::type,
+ typename remove_cv<typename NP::data_type>::type,
+ DefaultType> {};
+
+template<typename NP, typename Rest, typename Keyword, typename DefaultType>
+struct param_type<named_parameter_combine<NP,Rest>,Keyword,DefaultType>
+: mpl::if_<typename is_same<typename NP::id,typename Keyword::id>::type,
+ typename remove_cv<typename NP::data_type>::type,
+ typename param_type<Rest,Keyword,DefaultType>::type> {};
+
+// ************************************************************************** //
+// ************** has_param ************** //
+// ************************************************************************** //
+
+/// has_param<Params,Keyword>::value is true id Params has parameter corresponding
+/// to the Keyword
+
+template<typename NP, typename Keyword>
+struct has_param : is_same<typename NP::id,typename Keyword::id> {};
+
+template<typename NP, typename Rest, typename Keyword>
+struct has_param<named_parameter_combine<NP,Rest>,Keyword>
+: mpl::or_<typename is_same<typename NP::id,typename Keyword::id>::type,
+ typename has_param<Rest,Keyword>::type> {};
// ************************************************************************** //
// ************** access_to_invalid_parameter ************** //
// ************************************************************************** //
+namespace nfp_detail {
+
struct access_to_invalid_parameter {};
//____________________________________________________________________________//
inline void
-report_access_to_invalid_parameter(bool v)
+report_access_to_invalid_parameter( bool v )
{
- if(v)
- BOOST_TEST_IMPL_THROW( access_to_invalid_parameter() );
+ BOOST_TEST_I_ASSRT( !v, access_to_invalid_parameter() );
}
-//____________________________________________________________________________//
+} // namespace nfp_detail
// ************************************************************************** //
// ************** nil ************** //
@@ -75,23 +131,23 @@ struct nil {
#else
operator T const&() const
#endif
- { report_access_to_invalid_parameter(true); static T* v = 0; return *v; }
+ { nfp_detail::report_access_to_invalid_parameter(true); static T* v = 0; return *v; }
template<typename T>
T any_cast() const
- { report_access_to_invalid_parameter(true); static typename remove_reference<T>::type* v = 0; return *v; }
+ { nfp_detail::report_access_to_invalid_parameter(true); static typename remove_reference<T>::type* v = 0; return *v; }
template<typename Arg1>
nil operator()( Arg1 const& )
- { report_access_to_invalid_parameter(true); return nil(); }
+ { nfp_detail::report_access_to_invalid_parameter(true); return nil(); }
template<typename Arg1,typename Arg2>
nil operator()( Arg1 const&, Arg2 const& )
- { report_access_to_invalid_parameter(true); return nil(); }
+ { nfp_detail::report_access_to_invalid_parameter(true); return nil(); }
template<typename Arg1,typename Arg2,typename Arg3>
nil operator()( Arg1 const&, Arg2 const&, Arg3 const& )
- { report_access_to_invalid_parameter(true); return nil(); }
+ { nfp_detail::report_access_to_invalid_parameter(true); return nil(); }
// Visitation support
template<typename Visitor>
@@ -106,6 +162,8 @@ private:
// ************** named_parameter_base ************** //
// ************************************************************************** //
+namespace nfp_detail {
+
template<typename Derived>
struct named_parameter_base {
template<typename NP>
@@ -113,7 +171,7 @@ struct named_parameter_base {
operator,( NP const& np ) const { return named_parameter_combine<NP,Derived>( np, *static_cast<Derived const*>(this) ); }
};
-//____________________________________________________________________________//
+} // namespace nfp_detail
// ************************************************************************** //
// ************** named_parameter_combine ************** //
@@ -122,7 +180,7 @@ struct named_parameter_base {
template<typename NP, typename Rest = nil>
struct named_parameter_combine
: Rest
-, named_parameter_base<named_parameter_combine<NP,Rest> > {
+, nfp_detail::named_parameter_base<named_parameter_combine<NP,Rest> > {
typedef typename NP::ref_type res_type;
typedef named_parameter_combine<NP,Rest> self_type;
@@ -130,7 +188,8 @@ struct named_parameter_combine
named_parameter_combine( NP const& np, Rest const& r )
: Rest( r )
, m_param( np )
- {}
+ {
+ }
// Access methods
res_type operator[]( keyword<typename NP::id,true> kw ) const { return m_param[kw]; }
@@ -143,14 +202,7 @@ struct named_parameter_combine
void erase( keyword<typename NP::id,false> kw ) const { m_param.erase( kw ); }
using Rest::erase;
-#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) || \
- BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0610))
- template<typename NP>
- named_parameter_combine<NP,self_type> operator,( NP const& np ) const
- { return named_parameter_combine<NP,self_type>( np, *this ); }
-#else
- using named_parameter_base<named_parameter_combine<NP,Rest> >::operator,;
-#endif
+ using nfp_detail::named_parameter_base<named_parameter_combine<NP,Rest> >::operator,;
// Visitation support
template<typename Visitor>
@@ -165,19 +217,16 @@ private:
NP m_param;
};
-} // namespace nfp_detail
-
// ************************************************************************** //
// ************** named_parameter ************** //
// ************************************************************************** //
-template<typename T, typename unique_id, typename ReferenceType=T&>
+template<typename T, typename unique_id, typename RefType>
struct named_parameter
-: nfp_detail::named_parameter_base<named_parameter<T, unique_id,ReferenceType> >
+: nfp_detail::named_parameter_base<named_parameter<T,unique_id,RefType> >
{
- typedef nfp_detail::nil nil_t;
typedef T data_type;
- typedef ReferenceType ref_type;
+ typedef RefType ref_type;
typedef unique_id id;
// Constructor
@@ -191,10 +240,10 @@ struct named_parameter
{}
// Access methods
- ref_type operator[]( keyword<unique_id,true> ) const { return m_erased ? nil_t::inst().template any_cast<ref_type>() : m_value; }
- ref_type operator[]( keyword<unique_id,false> ) const { return m_erased ? nil_t::inst().template any_cast<ref_type>() : m_value; }
+ ref_type operator[]( keyword<unique_id,true> ) const { return m_erased ? nil::inst().template any_cast<ref_type>() : m_value; }
+ ref_type operator[]( keyword<unique_id,false> ) const { return m_erased ? nil::inst().template any_cast<ref_type>() : m_value; }
template<typename UnknownId>
- nil_t operator[]( keyword<UnknownId,false> ) const { return nil_t::inst(); }
+ nil operator[]( keyword<UnknownId,false> ) const { return nil::inst(); }
bool has( keyword<unique_id,false> ) const { return !m_erased; }
template<typename UnknownId>
@@ -217,22 +266,16 @@ private:
mutable bool m_erased;
};
-//____________________________________________________________________________//
-
// ************************************************************************** //
// ************** no_params ************** //
// ************************************************************************** //
-namespace nfp_detail {
typedef named_parameter<char, struct no_params_type_t,char> no_params_type;
-} // namespace nfp_detail
namespace {
-nfp_detail::no_params_type no_params( '\0' );
+no_params_type no_params( '\0' );
} // local namespace
-//____________________________________________________________________________//
-
// ************************************************************************** //
// ************** keyword ************** //
// ************************************************************************** //
@@ -247,10 +290,10 @@ struct keyword {
template<typename T>
named_parameter<T,unique_id>
- operator=( T& t ) const { return named_parameter<T,unique_id>( t ); }
+ operator=( T& t ) const { return named_parameter<T,unique_id>( t ); }
named_parameter<char const*,unique_id,char const*>
- operator=( char const* t ) const { return named_parameter<char const*,unique_id,char const*>( t ); }
+ operator=( char const* t ) const { return named_parameter<char const*,unique_id,char const*>( t ); }
};
//____________________________________________________________________________//
@@ -259,7 +302,7 @@ struct keyword {
// ************** typed_keyword ************** //
// ************************************************************************** //
-template<typename T, typename unique_id, bool required = false>
+template<typename T, typename unique_id, bool required>
struct typed_keyword : keyword<unique_id,required> {
named_parameter<T const,unique_id>
operator=( T const& t ) const { return named_parameter<T const,unique_id>( t ); }
@@ -270,9 +313,9 @@ struct typed_keyword : keyword<unique_id,required> {
//____________________________________________________________________________//
-template<typename unique_id>
-struct typed_keyword<bool,unique_id,false>
-: keyword<unique_id,false>
+template<typename unique_id, bool required>
+struct typed_keyword<bool,unique_id,required>
+: keyword<unique_id,required>
, named_parameter<bool,unique_id,bool> {
typedef unique_id id;
@@ -282,84 +325,60 @@ struct typed_keyword<bool,unique_id,false>
operator!() const { return named_parameter<bool,unique_id,bool>( false ); }
};
-//____________________________________________________________________________//
-
// ************************************************************************** //
-// ************** optionally_assign ************** //
+// ************** opt_assign ************** //
// ************************************************************************** //
-template<typename T>
-inline void
-optionally_assign( T&, nfp_detail::nil )
+template<typename T, typename Params, typename Keyword>
+inline typename enable_if_c<!has_param<Params,Keyword>::value,void>::type
+opt_assign( T& target, Params const& p, Keyword k )
{
- nfp_detail::report_access_to_invalid_parameter(true);
}
//____________________________________________________________________________//
-template<typename T, typename Source>
-inline void
-#if BOOST_WORKAROUND( __MWERKS__, BOOST_TESTED_AT( 0x3003 ) ) \
- || BOOST_WORKAROUND( __DECCXX_VER, BOOST_TESTED_AT(60590042) )
-optionally_assign( T& target, Source src )
-#else
-optionally_assign( T& target, Source const& src )
-#endif
+template<typename T, typename Params, typename Keyword>
+inline typename enable_if_c<has_param<Params,Keyword>::value,void>::type
+opt_assign( T& target, Params const& p, Keyword k )
{
using namespace unit_test;
- assign_op( target, src, static_cast<int>(0) );
+ assign_op( target, p[k], static_cast<int>(0) );
}
-//____________________________________________________________________________//
-
-template<typename T, typename Params, typename Keyword>
-inline void
-optionally_assign( T& target, Params const& p, Keyword k )
-{
- if( p.has(k) )
- optionally_assign( target, p[k] );
-}
-
-//____________________________________________________________________________//
-
// ************************************************************************** //
-// ************** is_named_params ************** //
+// ************** opt_get ************** //
// ************************************************************************** //
-template<typename T>
-struct is_named_params : public boost::mpl::false_ {};
-
-template<typename T, typename unique_id, typename ReferenceType>
-struct is_named_params<named_parameter<T,unique_id,ReferenceType> > : public boost::mpl::true_ {};
+template<typename T, typename Params, typename Keyword>
+inline T
+opt_get( Params const& p, Keyword k, T default_val )
+{
+ opt_assign( default_val, p, k );
-template<typename NP, typename Rest>
-struct is_named_params<nfp_detail::named_parameter_combine<NP,Rest> > : public boost::mpl::true_ {};
+ return default_val;
+}
// ************************************************************************** //
-// ************** param_type ************** //
+// ************** opt_get ************** //
// ************************************************************************** //
-template<typename Params,typename KeywordType,typename DefaultType=void>
-struct param_type {
- typedef DefaultType type;
-};
-
-template<typename NP,typename Rest,typename Keyword,typename DefaultType>
-struct param_type<nfp_detail::named_parameter_combine<NP,Rest>,Keyword,DefaultType> : param_type<Rest,Keyword,DefaultType> {
-};
+template<typename Params, typename NP>
+inline typename enable_if_c<!has_param<Params,keyword<typename NP::id> >::value,
+named_parameter_combine<NP,Params> >::type
+opt_append( Params const& params, NP const& np )
+{
+ return (params,np);
+}
-template<typename T, typename unique_id, typename ReferenceType,bool required,typename DefaultType>
-struct param_type<named_parameter<T,unique_id,ReferenceType>,keyword<unique_id,required>,DefaultType> {
- typedef typename boost::remove_cv<T>::type type;
-};
+//____________________________________________________________________________//
-template<typename T, typename unique_id, typename ReferenceType,typename Rest,bool required,typename DefaultType>
-struct param_type<nfp_detail::named_parameter_combine<named_parameter<T,unique_id,ReferenceType>,Rest>,
- keyword<unique_id,required>,
- DefaultType> {
- typedef typename boost::remove_cv<T>::type type;
-};
+template<typename Params, typename NP>
+inline typename enable_if_c<has_param<Params,keyword<typename NP::id> >::value,Params>::type
+opt_append( Params const& params, NP const& )
+{
+ return params;
+}
} // namespace nfp
} // namespace boost
@@ -367,4 +386,3 @@ struct param_type<nfp_detail::named_parameter_combine<named_parameter<T,unique_i
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_NAMED_PARAM
-
diff --git a/boost/test/utils/nullstream.hpp b/boost/test/utils/nullstream.hpp
index b4cedd0842..27b17fae14 100644
--- a/boost/test/utils/nullstream.hpp
+++ b/boost/test/utils/nullstream.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2002-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// (C) Copyright Daryle Walker 2000-2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
diff --git a/boost/test/utils/rtti.hpp b/boost/test/utils/rtti.hpp
index 42f2bc648b..b230692d80 100644
--- a/boost/test/utils/rtti.hpp
+++ b/boost/test/utils/rtti.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -36,7 +36,7 @@ struct rttid_holder {
private:
struct rttid {};
- static rttid const& inst() { static rttid s_inst; return s_inst; }
+ static rttid const& inst() { static rttid s_inst; return s_inst; }
};
} // namespace rtti_detail
diff --git a/boost/test/utils/runtime/argument.hpp b/boost/test/utils/runtime/argument.hpp
index b5133e23c3..879ee96f9f 100644
--- a/boost/test/utils/runtime/argument.hpp
+++ b/boost/test/utils/runtime/argument.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -15,45 +15,40 @@
#ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
#define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test Runtime parameters
#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
+#include <boost/test/utils/runtime/errors.hpp>
// Boost.Test
#include <boost/test/utils/class_properties.hpp>
#include <boost/test/utils/rtti.hpp>
+#include <boost/test/utils/basic_cstring/compare.hpp>
+#include <boost/test/detail/throw_exception.hpp>
// STL
#include <cassert>
-namespace boost {
+#include <boost/test/detail/suppress_warnings.hpp>
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+namespace boost {
+namespace runtime {
// ************************************************************************** //
// ************** runtime::argument ************** //
// ************************************************************************** //
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4244)
-#endif
-
class argument {
public:
// Constructor
- argument( parameter const& p, rtti::id_t value_type )
- : p_formal_parameter( p )
- , p_value_type( value_type )
+ argument( rtti::id_t value_type )
+ : p_value_type( value_type )
{}
// Destructor
virtual ~argument() {}
// Public properties
- unit_test::readonly_property<parameter const&> p_formal_parameter;
- unit_test::readonly_property<rtti::id_t> p_value_type;
+ rtti::id_t const p_value_type;
};
// ************************************************************************** //
@@ -64,49 +59,73 @@ template<typename T>
class typed_argument : public argument {
public:
// Constructor
- explicit typed_argument( parameter const& p )
- : argument( p, rtti::type_id<T>() )
- {}
- typed_argument( parameter const& p, T const& t )
- : argument( p, rtti::type_id<T>() )
- , p_value( t )
+ explicit typed_argument( T const& v )
+ : argument( rtti::type_id<T>() )
+ , p_value( v )
{}
unit_test::readwrite_property<T> p_value;
};
// ************************************************************************** //
-// ************** runtime::arg_value ************** //
+// ************** runtime::arguments_store ************** //
// ************************************************************************** //
-template<typename T>
-inline T const&
-arg_value( argument const& arg_ )
-{
- assert( arg_.p_value_type == rtti::type_id<T>() ); // detect logic error
-
- return static_cast<typed_argument<T> const&>( arg_ ).p_value.value;
-}
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline T&
-arg_value( argument& arg_ )
-{
- assert( arg_.p_value_type == rtti::type_id<T>() ); // detect logic error
-
- return static_cast<typed_argument<T>&>( arg_ ).p_value.value;
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+class arguments_store {
+public:
+ typedef std::map<cstring, argument_ptr> storage_type;
+
+ /// Returns number of arguments in the store; mostly used for testing
+ std::size_t size() const { return m_arguments.size(); }
+
+ /// Clears the store for reuse
+ void clear() { m_arguments.clear(); }
+
+ /// Returns true if there is an argument corresponding to the specified parameter name
+ bool has( cstring parameter_name ) const
+ {
+ return m_arguments.find( parameter_name ) != m_arguments.end();
+ }
+
+ /// Provides types access to argument value by parameter name
+ template<typename T>
+ T const& get( cstring parameter_name ) const {
+ return const_cast<arguments_store*>(this)->get<T>( parameter_name );
+ }
+
+ template<typename T>
+ T& get( cstring parameter_name ) {
+ storage_type::const_iterator found = m_arguments.find( parameter_name );
+ BOOST_TEST_I_ASSRT( found != m_arguments.end(),
+ access_to_missing_argument()
+ << "There is no argument provided for parameter "
+ << parameter_name );
+
+ argument_ptr arg = found->second;
+
+ BOOST_TEST_I_ASSRT( arg->p_value_type == rtti::type_id<T>(),
+ arg_type_mismatch()
+ << "Access with invalid type for argument corresponding to parameter "
+ << parameter_name );
+
+ return static_cast<typed_argument<T>&>( *arg ).p_value.value;
+ }
+
+ /// Set's the argument value for specified parameter name
+ template<typename T>
+ void set( cstring parameter_name, T const& value )
+ {
+ m_arguments[parameter_name] = argument_ptr( new typed_argument<T>( value ) );
+ }
+
+private:
+ // Data members
+ storage_type m_arguments;
+};
+} // namespace runtime
} // namespace boost
+#include <boost/test/detail/enable_warnings.hpp>
+
#endif // BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
diff --git a/boost/test/utils/runtime/argument_factory.hpp b/boost/test/utils/runtime/argument_factory.hpp
new file mode 100644
index 0000000000..a163deb9a2
--- /dev/null
+++ b/boost/test/utils/runtime/argument_factory.hpp
@@ -0,0 +1,242 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : argument factories for different kinds of parameters
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
+#define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/errors.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+
+// Boost.Test
+#include <boost/test/utils/basic_cstring/io.hpp>
+#include <boost/test/utils/basic_cstring/compare.hpp>
+#include <boost/test/utils/string_cast.hpp>
+
+// Boost
+#include <boost/function/function2.hpp>
+
+// STL
+#include <vector>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** runtime::value_interpreter ************** //
+// ************************************************************************** //
+
+template<typename ValueType, bool is_enum>
+struct value_interpreter;
+
+//____________________________________________________________________________//
+
+template<typename ValueType>
+struct value_interpreter<ValueType, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ ValueType interpret( cstring param_name, cstring source ) const
+ {
+ ValueType res;
+ if( !unit_test::utils::string_as<ValueType>( source, res ) )
+ BOOST_TEST_I_THROW( format_error( param_name ) << source <<
+ " can't be interpreted as value of parameter " << param_name << "." );
+ return res;
+ }
+};
+
+//____________________________________________________________________________//
+
+template<>
+struct value_interpreter<std::string, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ std::string interpret( cstring, cstring source ) const
+ {
+ return std::string( source.begin(), source.size() );
+ }
+};
+
+//____________________________________________________________________________//
+
+template<>
+struct value_interpreter<cstring, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ cstring interpret( cstring, cstring source ) const
+ {
+ return source;
+ }
+};
+
+//____________________________________________________________________________//
+
+template<>
+struct value_interpreter<bool, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ bool interpret( cstring param_name, cstring source ) const
+ {
+ static cstring const s_YES( "YES" );
+ static cstring const s_Y( "Y" );
+ static cstring const s_NO( "NO" );
+ static cstring const s_N( "N" );
+ static cstring const s_TRUE( "TRUE" );
+ static cstring const s_FALSE( "FALSE" );
+ static cstring const s_one( "1" );
+ static cstring const s_zero( "0" );
+
+ source.trim();
+
+ if( source.is_empty() ||
+ case_ins_eq( source, s_YES ) ||
+ case_ins_eq( source, s_Y ) ||
+ case_ins_eq( source, s_one ) ||
+ case_ins_eq( source, s_TRUE ) )
+ return true;
+
+ if( case_ins_eq( source, s_NO ) ||
+ case_ins_eq( source, s_N ) ||
+ case_ins_eq( source, s_zero ) ||
+ case_ins_eq( source, s_FALSE ) )
+ return false;
+
+ BOOST_TEST_I_THROW( format_error( param_name ) << source << " can't be interpreted as bool value." );
+ }
+};
+
+//____________________________________________________________________________//
+
+template<typename EnumType>
+struct value_interpreter<EnumType, true> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& m )
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ : m_name_to_value( m[enum_values<EnumType>::value] )
+ {
+ }
+#else
+ {
+ std::vector<std::pair<cstring,EnumType> > const& values = m[enum_values<EnumType>::value];
+
+ m_name_to_value.insert( values.begin(), values.end() );
+ }
+#endif
+
+ EnumType interpret( cstring param_name, cstring source ) const
+ {
+ typename std::map<cstring,EnumType>::const_iterator found = m_name_to_value.find( source );
+
+ BOOST_TEST_I_ASSRT( found != m_name_to_value.end(),
+ format_error( param_name ) << source <<
+ " is not a valid enumeration value name for parameter " << param_name << "." );
+
+ return found->second;
+ }
+
+private:
+ // Data members
+ std::map<cstring,EnumType> m_name_to_value;
+};
+
+//____________________________________________________________________________//
+
+// ************************************************************************** //
+// ************** runtime::argument_factory ************** //
+// ************************************************************************** //
+
+template<typename ValueType, bool is_enum, bool repeatable>
+class argument_factory;
+
+//____________________________________________________________________________//
+
+template<typename ValueType, bool is_enum>
+class argument_factory<ValueType, is_enum, false> {
+public:
+ template<typename Modifiers>
+ explicit argument_factory( Modifiers const& m )
+ : m_interpreter( m )
+ , m_optional_value( nfp::opt_get( m, optional_value, ValueType() ) )
+ , m_default_value( nfp::opt_get( m, default_value, ValueType() ) )
+ {
+ }
+
+ void produce_argument( cstring source, cstring param_name, arguments_store& store ) const
+ {
+ store.set( param_name, source.empty() ? m_optional_value : m_interpreter.interpret( param_name, source ) );
+ }
+
+ void produce_default( cstring param_name, arguments_store& store ) const
+ {
+ store.set( param_name, m_default_value );
+ }
+
+private:
+ // Data members
+ typedef value_interpreter<ValueType, is_enum> interp_t;
+ interp_t m_interpreter;
+ ValueType m_optional_value;
+ ValueType m_default_value;
+};
+
+//____________________________________________________________________________//
+
+template<typename ValueType, bool is_enum>
+class argument_factory<ValueType, is_enum, true> {
+public:
+ template<typename Modifiers>
+ explicit argument_factory( Modifiers const& m )
+ : m_interpreter( m )
+ {
+ }
+
+ void produce_argument( cstring source, cstring param_name, arguments_store& store ) const
+ {
+ ValueType value = m_interpreter.interpret( param_name, source );
+
+ if( store.has( param_name ) ) {
+ std::vector<ValueType>& values = store.get<std::vector<ValueType> >( param_name );
+ values.push_back( value );
+ }
+ else {
+ std::vector<ValueType> values( 1, value );
+
+ store.set( param_name, values );
+ }
+
+ }
+ void produce_default( cstring param_name, arguments_store& store ) const
+ {
+ store.set( param_name, std::vector<ValueType>() );
+ }
+
+private:
+ // Data members
+ value_interpreter<ValueType, is_enum> m_interpreter;
+};
+
+//____________________________________________________________________________//
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
diff --git a/boost/test/utils/runtime/cla/argument_factory.hpp b/boost/test/utils/runtime/cla/argument_factory.hpp
deleted file mode 100644
index 6683540612..0000000000
--- a/boost/test/utils/runtime/cla/argument_factory.hpp
+++ /dev/null
@@ -1,216 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : generic typed_argument_factory implementation
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_FACTORY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_FACTORY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-#include <boost/test/utils/runtime/trace.hpp>
-#include <boost/test/utils/runtime/interpret_argument_value.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/value_generator.hpp>
-#include <boost/test/utils/runtime/cla/value_handler.hpp>
-#include <boost/test/utils/runtime/cla/validation.hpp>
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-#include <boost/test/utils/runtime/cla/detail/argument_value_usage.hpp>
-
-#include <boost/test/utils/runtime/cla/iface/argument_factory.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-#include <boost/function/function2.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** default_value_interpreter ************** //
-// ************************************************************************** //
-
-namespace rt_cla_detail {
-
-struct default_value_interpreter {
- template<typename T>
- void operator()( argv_traverser& tr, boost::optional<T>& value )
- {
- if( interpret_argument_value( tr.token(), value, 0 ) )
- tr.next_token();
- }
-};
-
-} // namespace rt_cla_detail
-
-// ************************************************************************** //
-// ************** typed_argument_factory ************** //
-// ************************************************************************** //
-
-template<typename T>
-struct typed_argument_factory : public argument_factory {
- // Constructor
- typed_argument_factory()
- : m_value_interpreter( rt_cla_detail::default_value_interpreter() )
- {}
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~typed_argument_factory() {}
-
- // properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- optionally_assign( m_value_handler, m, handler );
- optionally_assign( m_value_interpreter, m, interpreter );
-
- if( m.has( default_value ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !m_value_generator,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "multiple value generators for parameter" ) );
-
- T const& dv_ref = m[default_value];
- m_value_generator = rt_cla_detail::const_generator<T>( dv_ref );
- }
-
- if( m.has( default_refer_to ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !m_value_generator,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "multiple value generators for parameter" ) );
-
- cstring ref_id = m[default_refer_to];
- m_value_generator = rt_cla_detail::ref_generator<T>( ref_id );
- }
-
- if( m.has( assign_to ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !m_value_handler,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "multiple value handlers for parameter" ) );
-
- m_value_handler = rt_cla_detail::assigner<T>( m[assign_to] );
- }
- }
-
- // Argument factory implementation
- virtual argument_ptr produce_using( parameter& p, argv_traverser& tr );
- virtual argument_ptr produce_using( parameter& p, parser const& );
- virtual void argument_usage_info( format_stream& fs );
-
-// !! private?
- // Data members
- boost::function<void (parameter const&,T&)> m_value_handler;
- boost::function<void (parser const&,boost::optional<T>&)> m_value_generator;
- boost::function<void (argv_traverser&,boost::optional<T>&)> m_value_interpreter;
-};
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline argument_ptr
-typed_argument_factory<T>::produce_using( parameter& p, argv_traverser& tr )
-{
- boost::optional<T> value;
-
- BOOST_TEST_IMPL_TRY {
- m_value_interpreter( tr, value );
- }
- BOOST_TEST_IMPL_CATCHALL() { // !! should we do that?
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Fail to parse argument value" );
-
- if( !p.p_optional_value )
- BOOST_TEST_IMPL_RETHROW;
- }
-
- argument_ptr actual_arg = p.actual_argument();
-
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( !!value || p.p_optional_value, tr,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Argument value missing for parameter " ) << p.id_2_report() );
-
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( !actual_arg || p.p_multiplicable, tr,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Unexpected repetition of the parameter " ) << p.id_2_report() );
-
- if( !!value && !!m_value_handler )
- m_value_handler( p, *value );
-
- if( !p.p_multiplicable )
- actual_arg.reset( p.p_optional_value && (rtti::type_id<T>() != rtti::type_id<bool>())
- ? static_cast<argument*>(new typed_argument<boost::optional<T> >( p, value ))
- : static_cast<argument*>(new typed_argument<T>( p, *value )) );
- else {
- typedef std::list<boost::optional<T> > optional_list;
-
- if( !actual_arg )
- actual_arg.reset( p.p_optional_value
- ? static_cast<argument*>(new typed_argument<optional_list>( p ))
- : static_cast<argument*>(new typed_argument<std::list<T> >( p )) );
-
- if( p.p_optional_value ) {
- optional_list& values = arg_value<optional_list>( *actual_arg );
-
- values.push_back( value );
- }
- else {
- std::list<T>& values = arg_value<std::list<T> >( *actual_arg );
-
- values.push_back( *value );
- }
- }
-
- return actual_arg;
-}
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline argument_ptr
-typed_argument_factory<T>::produce_using( parameter& p, parser const& pa )
-{
- argument_ptr actual_arg;
-
- if( !m_value_generator )
- return actual_arg;
-
- boost::optional<T> value;
- m_value_generator( pa, value );
-
- if( !value )
- return actual_arg;
-
- if( !!m_value_handler )
- m_value_handler( p, *value );
-
- actual_arg.reset( new typed_argument<T>( p, *value ) );
-
- return actual_arg;
-}
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline void
-typed_argument_factory<T>::argument_usage_info( format_stream& fs )
-{
- rt_cla_detail::argument_value_usage( fs, 0, reinterpret_cast<T*>(0) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace boost
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace cla
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_FACTORY_HPP
diff --git a/boost/test/utils/runtime/cla/argv_traverser.cpp b/boost/test/utils/runtime/cla/argv_traverser.cpp
deleted file mode 100644
index 9716b8fb9c..0000000000
--- a/boost/test/utils/runtime/cla/argv_traverser.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : offline implementation for argc/argv traverser
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/argv_traverser.ipp>
diff --git a/boost/test/utils/runtime/cla/argv_traverser.hpp b/boost/test/utils/runtime/cla/argv_traverser.hpp
index 6f6e03dfc8..10fb67bde4 100644
--- a/boost/test/utils/runtime/cla/argv_traverser.hpp
+++ b/boost/test/utils/runtime/cla/argv_traverser.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Use, modification, and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -15,86 +15,91 @@
#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-
-// Boost
-#include <boost/noncopyable.hpp>
-#include <boost/shared_array.hpp>
+#include <boost/test/detail/suppress_warnings.hpp>
namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
+namespace runtime {
namespace cla {
// ************************************************************************** //
// ************** runtime::cla::argv_traverser ************** //
// ************************************************************************** //
-class argv_traverser : noncopyable {
- class parser;
+class argv_traverser {
+ typedef char const** argv_type;
public:
- // Constructor
- argv_traverser();
-
- // public_properties
- unit_test::readwrite_property<bool> p_ignore_mismatch;
- unit_test::readwrite_property<char_type> p_separator;
-
- // argc+argv <-> internal buffer exchange
- void init( int argc, char_type** argv );
- void remainder( int& argc, char_type** argv );
-
- // token based parsing
- cstring token() const;
- void next_token();
-
- // whole input parsing
- cstring input() const;
- void trim( std::size_t size );
- bool match_front( cstring );
- bool match_front( char_type c );
- bool eoi() const;
-
- // transaction logic support
- void commit();
- void rollback();
-
- // current position access; used to save some reference points in input
- std::size_t input_pos() const;
-
- // returns true if mismatch detected during input parsing handled successfully
- bool handle_mismatch();
+ /// Constructs traverser based on argc/argv pair
+ /// argv is taken "by reference" and later can be
+ /// updated in remainder method
+ argv_traverser( int argc, argv_type argv )
+ : m_argc( argc )
+ , m_curr_token( 0 )
+ , m_token_size( 0 )
+ , m_argv( argv )
+ {
+ // save program name
+ save_token();
+ }
+
+ /// Returns new argc
+ int remainder()
+ {
+ return m_argc;
+ }
+
+ /// Returns true, if we reached end on input
+ bool eoi() const
+ {
+ return m_curr_token == m_argc;
+ }
+
+ /// Returns current token in the input
+ cstring current_token()
+ {
+ if( eoi() )
+ return cstring();
+
+ return cstring( m_argv[m_curr_token], m_token_size );
+ }
+
+ /// Saves current token for remainder
+ void save_token()
+ {
+ ++m_curr_token;
+
+ if( !eoi() )
+ m_token_size = ::strlen( m_argv[m_curr_token] );
+ }
+
+ /// Commit current token and iterate to next one
+ void next_token()
+ {
+ if( !eoi() ) {
+ for( std::size_t i = m_curr_token; i < m_argc-1; ++i )
+ m_argv[i] = m_argv[i + 1];
+
+ --m_argc;
+
+ m_token_size = ::strlen( m_argv[m_curr_token] );
+ }
+ }
private:
- // Data members
- dstring m_buffer;
- cstring m_work_buffer;
- cstring m_token;
- cstring::iterator m_commited_end;
-
- shared_array<char_type> m_remainder;
- std::size_t m_remainder_size;
+ // Data members
+ std::size_t m_argc; // total number of arguments
+ std::size_t m_curr_token; // current token index in argv
+ std::size_t m_token_size; // current token size
+ argv_type m_argv; // all arguments
};
} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
+} // namespace runtime
} // namespace boost
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/argv_traverser.ipp>
-
-#endif
+#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
diff --git a/boost/test/utils/runtime/cla/argv_traverser.ipp b/boost/test/utils/runtime/cla/argv_traverser.ipp
deleted file mode 100644
index d1ae93be82..0000000000
--- a/boost/test/utils/runtime/cla/argv_traverser.ipp
+++ /dev/null
@@ -1,212 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements facility to hide input traversing details
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/trace.hpp>
-
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-
-// STL
-#include <memory>
-#include <cstring>
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std { using ::memcpy; }
-#endif
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::argv_traverser ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-argv_traverser::argv_traverser()
-: p_ignore_mismatch( false ), p_separator( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' ) )
-{
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::init( int argc, char_type** argv )
-{
- m_buffer.clear();
-
- for( int index = 1; index < argc; ++index ) {
- m_buffer += argv[index];
- if( index != argc-1 )
- m_buffer += BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' );
- }
-
- m_remainder.reset( new char_type[m_buffer.size()+1] );
- m_remainder_size = 0;
- m_work_buffer = m_buffer;
- m_commited_end = m_work_buffer.begin();
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Input buffer: " << m_buffer );
-
- next_token();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::remainder( int& argc, char_type** argv )
-{
- argc = 1;
- std::size_t pos = 0;
- while(pos < m_remainder_size ) {
- argv[argc++] = m_remainder.get() + pos;
-
- pos = static_cast<size_t>(std::find( m_remainder.get() + pos, m_remainder.get() + m_remainder_size,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' ) ) -
- m_remainder.get());
- m_remainder[pos++] = BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '\0' );
- }
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-argv_traverser::token() const
-{
- return m_token;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::next_token()
-{
- if( m_work_buffer.is_empty() )
- return;
-
- m_work_buffer.trim_left( m_token.size() ); // skip remainder of current token
-
- if( m_work_buffer.size() != m_buffer.size() ) // !! is there a better way to identify first token
- m_work_buffer.trim_left( 1 ); // skip separator if not first token;
-
- m_token.assign( m_work_buffer.begin(),
- std::find( m_work_buffer.begin(), m_work_buffer.end(), p_separator ) );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-argv_traverser::input() const
-{
- return m_work_buffer;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::trim( std::size_t size )
-{
- m_work_buffer.trim_left( size );
-
- if( size <= m_token.size() )
- m_token.trim_left( size );
- else {
- m_token.assign( m_work_buffer.begin(),
- std::find( m_work_buffer.begin(), m_work_buffer.end(), p_separator ) );
- }
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::match_front( cstring str )
-{
- return m_work_buffer.size() < str.size() ? false : m_work_buffer.substr( 0, str.size() ) == str;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::match_front( char_type c )
-{
- return first_char( m_work_buffer ) == c;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::eoi() const
-{
- return m_work_buffer.is_empty();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::commit()
-{
- m_commited_end = m_work_buffer.begin();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::rollback()
-{
- m_work_buffer.assign( m_commited_end, m_work_buffer.end() );
- m_token.assign( m_work_buffer.begin(),
- std::find( m_work_buffer.begin(), m_work_buffer.end(), p_separator ) );
-
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE std::size_t
-argv_traverser::input_pos() const
-{
- return static_cast<std::size_t>(m_work_buffer.begin() - m_commited_end);
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::handle_mismatch()
-{
- if( !p_ignore_mismatch )
- return false;
-
- std::memcpy( m_remainder.get() + m_remainder_size, token().begin(), token().size() );
- m_remainder_size += token().size();
- m_remainder[m_remainder_size++] = p_separator;
-
- next_token();
- commit();
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_IPP
diff --git a/boost/test/utils/runtime/cla/basic_parameter.hpp b/boost/test/utils/runtime/cla/basic_parameter.hpp
deleted file mode 100644
index 817b12a301..0000000000
--- a/boost/test/utils/runtime/cla/basic_parameter.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : generic custom parameter generator
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_BASIC_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_BASIC_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/typed_parameter.hpp>
-
-// Boost.Test
-#include <boost/test/utils/rtti.hpp>
-
-// Boost
-#include <boost/utility/base_from_member.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::basic_parameter ************** //
-// ************************************************************************** //
-
-template<typename T, typename IdPolicy>
-class basic_parameter : private base_from_member<IdPolicy>, public typed_parameter<T> {
-public:
- // Constructors
- explicit basic_parameter( cstring n )
- : base_from_member<IdPolicy>()
- , typed_parameter<T>( base_from_member<IdPolicy>::member )
- {
- this->accept_modifier( name = n );
- }
-
- // parameter properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- typed_parameter<T>::accept_modifier( m );
-
- base_from_member<IdPolicy>::member.accept_modifier( m );
- }
-};
-
-//____________________________________________________________________________//
-
-#define BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( param_type ) \
-template<typename T> \
-inline shared_ptr<param_type ## _t<T> > \
-param_type( cstring name = cstring() ) \
-{ \
- return shared_ptr<param_type ## _t<T> >( new param_type ## _t<T>( name ) ); \
-} \
- \
-inline shared_ptr<param_type ## _t<cstring> > \
-param_type( cstring name = cstring() ) \
-{ \
- return shared_ptr<param_type ## _t<cstring> >( new param_type ## _t<cstring>( name ) ); \
-} \
-/**/
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_BASIC_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/char_parameter.cpp b/boost/test/utils/runtime/cla/char_parameter.cpp
deleted file mode 100644
index 6e85fe4136..0000000000
--- a/boost/test/utils/runtime/cla/char_parameter.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : offline implementation of char parameter
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/char_parameter.ipp>
diff --git a/boost/test/utils/runtime/cla/char_parameter.hpp b/boost/test/utils/runtime/cla/char_parameter.hpp
deleted file mode 100644
index 0e2928b1af..0000000000
--- a/boost/test/utils/runtime/cla/char_parameter.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines model of parameter with single char name
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/basic_parameter.hpp>
-#include <boost/test/utils/runtime/cla/id_policy.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** char_name_policy ************** //
-// ************************************************************************** //
-
-class char_name_policy : public basic_naming_policy {
-public:
- // Constructor
- char_name_policy();
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~char_name_policy() {}
-
- // policy interface
- virtual bool conflict_with( identification_policy const& ) const;
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- basic_naming_policy::accept_modifier( m );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( p_name->size() <= 1, "Invalid parameter name " << p_name );
- }
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::char_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class char_parameter_t : public basic_parameter<T,char_name_policy> {
- typedef basic_parameter<T,char_name_policy> base;
-public:
- // Constructors
- explicit char_parameter_t( char_type name ) : base( cstring( &name, 1 ) ) {}
-};
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline shared_ptr<char_parameter_t<T> >
-char_parameter( char_type name )
-{
- return shared_ptr<char_parameter_t<T> >( new char_parameter_t<T>( name ) );
-}
-
-//____________________________________________________________________________//
-
-inline shared_ptr<char_parameter_t<cstring> >
-char_parameter( char_type name )
-{
- return shared_ptr<char_parameter_t<cstring> >( new char_parameter_t<cstring>( name ) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/char_parameter.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/char_parameter.ipp b/boost/test/utils/runtime/cla/char_parameter.ipp
deleted file mode 100644
index 398ce79ac4..0000000000
--- a/boost/test/utils/runtime/cla/char_parameter.ipp
+++ /dev/null
@@ -1,57 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements model of parameter with single char name
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/char_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** char_name_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-char_name_policy::char_name_policy()
-: basic_naming_policy( rtti::type_id<char_name_policy>() )
-{
- assign_op( p_prefix.value, BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "-" ), 0 );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-char_name_policy::conflict_with( identification_policy const& id ) const
-{
- return id.p_type_id == p_type_id &&
- p_name == static_cast<char_name_policy const&>( id ).p_name;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_IPP
diff --git a/boost/test/utils/runtime/cla/detail/argument_value_usage.hpp b/boost/test/utils/runtime/cla/detail/argument_value_usage.hpp
deleted file mode 100644
index a70b6d1fb7..0000000000
--- a/boost/test/utils/runtime/cla/detail/argument_value_usage.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : argument usage printing helpers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_VALUE_USAGE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_VALUE_USAGE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/basic_cstring/compare.hpp>
-
-#include <boost/lexical_cast.hpp>
-
-// STL
-// !! can we eliminate these includes?
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-namespace rt_cla_detail {
-
-// ************************************************************************** //
-// ************** argument_value_usage ************** //
-// ************************************************************************** //
-
-// generic case
-template<typename T>
-inline void
-argument_value_usage( format_stream& fs, long, T* = 0 )
-{
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "<value>" );
-}
-
-//____________________________________________________________________________//
-
-// specialization for list of values
-template<typename T>
-inline void
-argument_value_usage( format_stream& fs, int, std::list<T>* = 0 )
-{
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "(<value1>, ..., <valueN>)" );
-}
-
-//____________________________________________________________________________//
-
-// specialization for type bool
-inline void
-argument_value_usage( format_stream& fs, int, bool* = 0 )
-{
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "yes|y|no|n" );
-}
-
-//____________________________________________________________________________//
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_VALUE_USAGE_HPP
diff --git a/boost/test/utils/runtime/cla/dual_name_parameter.cpp b/boost/test/utils/runtime/cla/dual_name_parameter.cpp
deleted file mode 100644
index ab034ff04c..0000000000
--- a/boost/test/utils/runtime/cla/dual_name_parameter.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : offline implementation of generic parameter with dual naming
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/dual_name_parameter.ipp>
diff --git a/boost/test/utils/runtime/cla/dual_name_parameter.hpp b/boost/test/utils/runtime/cla/dual_name_parameter.hpp
deleted file mode 100644
index 789b67ad1d..0000000000
--- a/boost/test/utils/runtime/cla/dual_name_parameter.hpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines model of generic parameter with dual naming
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/named_parameter.hpp>
-#include <boost/test/utils/runtime/cla/char_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** dual_name_policy ************** //
-// ************************************************************************** //
-
-class dual_name_policy : public dual_id_policy<dual_name_policy,string_name_policy,char_name_policy> {
-public:
- dual_name_policy();
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- if( m.has( prefix ) ) {
- set_prefix( m[prefix] );
- m.erase( prefix );
- }
-
- if( m.has( name ) ) {
- set_name( m[name] );
- m.erase( name );
- }
-
- if( m.has( separator ) ) {
- set_separator( m[separator] );
- m.erase( separator );
- }
-
- dual_id_policy<dual_name_policy,string_name_policy,char_name_policy>::accept_modifier( m );
- }
-private:
- void set_prefix( cstring );
- void set_name( cstring );
- void set_separator( cstring );
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::dual_name_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class dual_name_parameter_t : public basic_parameter<T,dual_name_policy> {
- typedef basic_parameter<T,dual_name_policy> base;
-public:
- // Constructors
- explicit dual_name_parameter_t( cstring name ) : base( name ) {}
-};
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( dual_name_parameter )
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/dual_name_parameter.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/dual_name_parameter.ipp b/boost/test/utils/runtime/cla/dual_name_parameter.ipp
deleted file mode 100644
index e39d132d62..0000000000
--- a/boost/test/utils/runtime/cla/dual_name_parameter.ipp
+++ /dev/null
@@ -1,90 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements model of generic parameter with dual naming
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/dual_name_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** dual_name_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-dual_name_policy::dual_name_policy()
-{
- m_primary.accept_modifier( prefix = BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "--" ) );
- m_secondary.accept_modifier( prefix = BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "-" ) );
-}
-
-//____________________________________________________________________________//
-
-namespace {
-
-template<typename K>
-inline void
-split( string_name_policy& snp, char_name_policy& cnp, cstring src, K const& k )
-{
- cstring::iterator sep = std::find( src.begin(), src.end(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '|' ) );
-
- if( sep != src.begin() )
- snp.accept_modifier( k = cstring( src.begin(), sep ) );
-
- if( sep != src.end() )
- cnp.accept_modifier( k = cstring( sep+1, src.end() ) );
-}
-
-} // local namespace
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-dual_name_policy::set_prefix( cstring src )
-{
- split( m_primary, m_secondary, src, prefix );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-dual_name_policy::set_name( cstring src )
-{
- split( m_primary, m_secondary, src, name );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-dual_name_policy::set_separator( cstring src )
-{
- split( m_primary, m_secondary, src, separator );
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_IPP
diff --git a/boost/test/utils/runtime/cla/fwd.hpp b/boost/test/utils/runtime/cla/fwd.hpp
deleted file mode 100644
index df02974345..0000000000
--- a/boost/test/utils/runtime/cla/fwd.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : cla subsystem forward declarations
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_FWD_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_FWD_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost
-#include <boost/shared_ptr.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-class parser;
-class parameter;
-typedef shared_ptr<parameter> parameter_ptr;
-class naming_policy;
-typedef shared_ptr<naming_policy> naming_policy_ptr;
-class argv_traverser;
-
-namespace rt_cla_detail {
-
-template<typename T> class const_generator;
-template<typename T> class ref_generator;
-
-template<typename T> class assigner;
-
-class named_parameter_base;
-class positional_parameter_base;
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_FWD_HPP
diff --git a/boost/test/utils/runtime/cla/id_policy.cpp b/boost/test/utils/runtime/cla/id_policy.cpp
deleted file mode 100644
index b000e26f94..0000000000
--- a/boost/test/utils/runtime/cla/id_policy.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : some generic identification policies offline implementation
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/id_policy.ipp>
diff --git a/boost/test/utils/runtime/cla/id_policy.hpp b/boost/test/utils/runtime/cla/id_policy.hpp
deleted file mode 100644
index 3308b07c61..0000000000
--- a/boost/test/utils/runtime/cla/id_policy.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : some generic identification policies definition
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-
-#include <boost/test/utils/runtime/cla/iface/id_policy.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** naming_policy_base ************** //
-// ************************************************************************** //
-// model: <prefix> <name> <separtor>
-
-class basic_naming_policy : public identification_policy {
-public:
- // Public properties
- unit_test::readwrite_property<dstring> p_prefix;
- unit_test::readwrite_property<dstring> p_name;
- unit_test::readwrite_property<dstring> p_separator;
-
- // Policy interface
- virtual bool responds_to( cstring name ) const { return p_name == name; }
- virtual cstring id_2_report() const { return p_name.get(); }
- virtual void usage_info( format_stream& fs ) const;
- virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const;
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- nfp::optionally_assign( p_prefix.value, m, prefix );
- nfp::optionally_assign( p_name.value, m, name );
- nfp::optionally_assign( p_separator.value, m, separator );
- }
-
-protected:
- explicit basic_naming_policy( rtti::id_t dyn_type )
- : identification_policy( dyn_type )
- {}
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~basic_naming_policy() {}
-
- // Naming policy interface
- virtual bool match_prefix( argv_traverser& tr ) const;
- virtual bool match_name( argv_traverser& tr ) const;
- virtual bool match_separator( argv_traverser& tr, bool optional_value ) const;
-};
-
-// ************************************************************************** //
-// ************** dual_id_policy ************** //
-// ************************************************************************** //
-
-template<typename MostDerived,typename PrimaryId,typename SecondId>
-class dual_id_policy : public identification_policy {
-public:
- // Constructor
- dual_id_policy()
- : identification_policy( rtti::type_id<MostDerived>() )
- , m_primary()
- , m_secondary()
- {}
-
- // Policy interface
- virtual bool responds_to( cstring name ) const
- {
- return m_primary.responds_to( name ) || m_secondary.responds_to( name );
- }
- virtual bool conflict_with( identification_policy const& id_p ) const
- {
- return id_p.conflict_with( m_primary ) || id_p.conflict_with( m_secondary );
- }
- virtual cstring id_2_report() const
- {
- return m_primary.id_2_report();
- }
- virtual void usage_info( format_stream& fs ) const
- {
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '{' );
- m_primary.usage_info( fs );
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '|' );
- m_secondary.usage_info( fs );
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '}' );
- }
- virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const
- {
- return m_primary.matching( p, tr, primary ) || m_secondary.matching( p, tr, primary );
- }
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- m_primary.accept_modifier( m );
- m_secondary.accept_modifier( m );
- }
-
-protected:
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~dual_id_policy() {}
-
- // Data members
- PrimaryId m_primary;
- SecondId m_secondary;
-};
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/id_policy.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP
diff --git a/boost/test/utils/runtime/cla/id_policy.ipp b/boost/test/utils/runtime/cla/id_policy.ipp
deleted file mode 100644
index 879ccfd1e1..0000000000
--- a/boost/test/utils/runtime/cla/id_policy.ipp
+++ /dev/null
@@ -1,118 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : some generic identification policies implementation
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/id_policy.hpp>
-#include <boost/test/utils/runtime/cla/parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** basic_naming_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-basic_naming_policy::usage_info( format_stream& fs ) const
-{
- fs << p_prefix << p_name << p_separator;
-
- if( p_separator->empty() )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::match_prefix( argv_traverser& tr ) const
-{
- if( !tr.match_front( p_prefix.get() ) )
- return false;
-
- tr.trim( p_prefix->size() );
- return true;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::match_name( argv_traverser& tr ) const
-{
- if( !tr.match_front( p_name.get() ) )
- return false;
-
- tr.trim( p_name->size() );
- return true;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::match_separator( argv_traverser& tr, bool optional_value ) const
-{
- if( p_separator->empty() ) {
- if( !tr.token().is_empty() )
- return false;
-
- tr.trim( 1 );
- }
- else {
- if( !tr.match_front( p_separator.get() ) ) {
- // if parameter has optional value separator is optional as well
- if( optional_value && ( tr.eoi() || tr.match_front( ' ' ) ) ) {
- return true;
- }
- return false;
- }
-
- tr.trim( p_separator->size() );
- }
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::matching( parameter const& p, argv_traverser& tr, bool ) const
-{
- if( !match_prefix( tr ) )
- return false;
-
- if( !match_name( tr ) )
- return false;
-
- if( !match_separator( tr, p.p_optional_value ) )
- return false;
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_IPP
diff --git a/boost/test/utils/runtime/cla/iface/argument_factory.hpp b/boost/test/utils/runtime/cla/iface/argument_factory.hpp
deleted file mode 100644
index cbca713bd3..0000000000
--- a/boost/test/utils/runtime/cla/iface/argument_factory.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines interface for argument_factory
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ARGUMENT_FACTORY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ARGUMENT_FACTORY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** argument_factory ************** //
-// ************************************************************************** //
-// another name can be argument production policy
-
-class argument_factory {
-public:
- // Argument factory interface
- virtual argument_ptr produce_using( parameter& p, argv_traverser& tr ) = 0; /// produce argument based on input
- virtual argument_ptr produce_using( parameter& p, parser const& ) = 0; /// produce argument based on internal generator and/or values of other parameters
- virtual void argument_usage_info( format_stream& fs ) = 0; /// argument value format information
-protected:
- BOOST_TEST_PROTECTED_VIRTUAL ~argument_factory() {}
-};
-
-} // namespace boost
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace cla
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ARGUMENT_FACTORY_HPP
diff --git a/boost/test/utils/runtime/cla/iface/id_policy.hpp b/boost/test/utils/runtime/cla/iface/id_policy.hpp
deleted file mode 100644
index 5fa13e6bc7..0000000000
--- a/boost/test/utils/runtime/cla/iface/id_policy.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines interface for identification_policy
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ID_POLICY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ID_POLICY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** identification_policy ************** //
-// ************************************************************************** //
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4244)
-#endif
-
-class identification_policy {
-public:
- // Public properties
- unit_test::readwrite_property<rtti::id_t> p_type_id;
-
- // Policy interface
- virtual bool responds_to( cstring name ) const = 0;
- virtual cstring id_2_report() const = 0;
- virtual void usage_info( format_stream& fs ) const = 0;
- virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const = 0;
-
- virtual bool conflict_with( identification_policy const& ) const = 0;
-
-protected:
- // Constructor
- explicit identification_policy( rtti::id_t dyn_type )
- : p_type_id( dyn_type )
- {}
- BOOST_TEST_PROTECTED_VIRTUAL ~identification_policy() {}
-};
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ID_POLICY_HPP
diff --git a/boost/test/utils/runtime/cla/modifier.hpp b/boost/test/utils/runtime/cla/modifier.hpp
deleted file mode 100644
index 4b55536b73..0000000000
--- a/boost/test/utils/runtime/cla/modifier.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : parameter modifiers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_MODIFIER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_MODIFIER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost.Test
-#include <boost/test/utils/named_params.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** environment variable modifiers ************** //
-// ************************************************************************** //
-
-namespace {
-
-nfp::typed_keyword<bool,struct optional_t> optional_m;
-nfp::named_parameter<bool,optional_t,bool> optional( true );
-nfp::typed_keyword<bool,struct required_t> required_m;
-nfp::named_parameter<bool,required_t,bool> required( true );
-nfp::typed_keyword<bool,struct multiplicable_t> multiplicable_m;
-nfp::named_parameter<bool,multiplicable_t,bool> multiplicable( true );
-nfp::typed_keyword<bool,struct guess_name_t> guess_name_m;
-nfp::named_parameter<bool,guess_name_t,bool> guess_name( true );
-nfp::typed_keyword<bool,struct ignore_mismatch_t> ignore_mismatch_m;
-nfp::named_parameter<bool,ignore_mismatch_t,bool> ignore_mismatch( true );
-nfp::typed_keyword<bool,struct optional_value_t> optional_value_m;
-nfp::named_parameter<bool,optional_value_t,bool> optional_value( true );
-
-nfp::typed_keyword<char_type,struct input_separator_t> input_separator;
-nfp::typed_keyword<cstring,struct prefix_t> prefix;
-nfp::typed_keyword<cstring,struct name_t> name;
-nfp::typed_keyword<cstring,struct separator_t> separator;
-nfp::typed_keyword<cstring,struct description_t> description;
-nfp::typed_keyword<cstring,struct refer_to_t> default_refer_to;
-
-nfp::keyword<struct default_value_t> default_value;
-nfp::keyword<struct handler_t> handler;
-nfp::keyword<struct interpreter_t> interpreter;
-nfp::keyword<struct assign_to_t> assign_to;
-
-} // local namespace
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_MODIFIER_HPP
diff --git a/boost/test/utils/runtime/cla/named_parameter.cpp b/boost/test/utils/runtime/cla/named_parameter.cpp
deleted file mode 100644
index 7e94722dc9..0000000000
--- a/boost/test/utils/runtime/cla/named_parameter.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : offline implementation of named parameter
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/named_parameter.ipp>
diff --git a/boost/test/utils/runtime/cla/named_parameter.hpp b/boost/test/utils/runtime/cla/named_parameter.hpp
deleted file mode 100644
index be3f9c570b..0000000000
--- a/boost/test/utils/runtime/cla/named_parameter.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines model of named parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/basic_parameter.hpp>
-#include <boost/test/utils/runtime/cla/id_policy.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** string_name_policy ************** //
-// ************************************************************************** //
-
-class string_name_policy : public basic_naming_policy {
-public:
- // Constructor
- string_name_policy();
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~string_name_policy() {}
-
- // policy interface
- virtual bool responds_to( cstring name ) const;
- virtual bool conflict_with( identification_policy const& ) const;
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- basic_naming_policy::accept_modifier( m );
-
- if( m.has( guess_name_m ) )
- m_guess_name = true;
- }
-
-private:
- // Naming policy interface
- virtual bool match_name( argv_traverser& tr ) const;
-
- // Data members
- bool m_guess_name;
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::named_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class named_parameter_t : public basic_parameter<T,string_name_policy> {
- typedef basic_parameter<T,string_name_policy> base;
-public:
- // Constructors
- explicit named_parameter_t( cstring name ) : base( name ) {}
-};
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( named_parameter )
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/named_parameter.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/named_parameter.ipp b/boost/test/utils/runtime/cla/named_parameter.ipp
deleted file mode 100644
index e59ebdf89c..0000000000
--- a/boost/test/utils/runtime/cla/named_parameter.ipp
+++ /dev/null
@@ -1,129 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements model of named parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/named_parameter.hpp>
-#include <boost/test/utils/runtime/cla/char_parameter.hpp>
-
-// Boost.Test
-#include <boost/test/utils/algorithm.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** string_name_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-string_name_policy::string_name_policy()
-: basic_naming_policy( rtti::type_id<string_name_policy>() )
-, m_guess_name( false )
-{
- assign_op( p_prefix.value, BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "-" ), 0 );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-string_name_policy::responds_to( cstring name ) const
-{
- std::pair<cstring::iterator,dstring::const_iterator> mm_pos;
-
- mm_pos = unit_test::mismatch( name.begin(), name.end(), p_name->begin(), p_name->end() );
-
- return mm_pos.first == name.end() && (m_guess_name || (mm_pos.second == p_name->end()) );
-}
-
-//____________________________________________________________________________//
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4244)
-#endif
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-string_name_policy::conflict_with( identification_policy const& id ) const
-{
- if( id.p_type_id == p_type_id ) {
- string_name_policy const& snp = static_cast<string_name_policy const&>( id );
-
- if( p_name->empty() || snp.p_name->empty() )
- return false;
-
- if( p_prefix != snp.p_prefix )
- return false;
-
- std::pair<dstring::const_iterator,dstring::const_iterator> mm_pos =
- unit_test::mismatch( p_name->begin(), p_name->end(), snp.p_name->begin(), snp.p_name->end() );
-
- return mm_pos.first != p_name->begin() && // there is common substring
- ((m_guess_name && (mm_pos.second == snp.p_name->end()) ) || // that match other guy and I am guessing
- (snp.m_guess_name && (mm_pos.first == p_name->end()) )); // or me and the other guy is
- }
-
- if( id.p_type_id == rtti::type_id<char_name_policy>() ) {
- char_name_policy const& cnp = static_cast<char_name_policy const&>( id );
-
- return m_guess_name &&
- (p_prefix == cnp.p_prefix) &&
- unit_test::first_char( cstring( p_name ) ) == unit_test::first_char( cstring( cnp.p_name ) );
- }
-
- return false;
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-string_name_policy::match_name( argv_traverser& tr ) const
-{
- if( !m_guess_name )
- return basic_naming_policy::match_name( tr );
-
- cstring in = tr.input();
-
- std::pair<cstring::iterator,dstring::const_iterator> mm_pos;
-
- mm_pos = unit_test::mismatch( in.begin(), in.end(), p_name->begin(), p_name->end() );
-
- if( mm_pos.first == in.begin() )
- return false;
-
- tr.trim( static_cast<std::size_t>(mm_pos.first - in.begin()) );
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_IPP
diff --git a/boost/test/utils/runtime/cla/parameter.hpp b/boost/test/utils/runtime/cla/parameter.hpp
deleted file mode 100644
index 9e26d25007..0000000000
--- a/boost/test/utils/runtime/cla/parameter.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines model of formal parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
-#include <boost/test/utils/runtime/cla/iface/argument_factory.hpp>
-#include <boost/test/utils/runtime/cla/iface/id_policy.hpp>
-
-// Boost.Test
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::parameter ************** //
-// ************************************************************************** //
-
-class parameter : public BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::parameter {
-public:
- parameter( identification_policy& ID, argument_factory& F, bool optional_value = false )
- : p_optional( false )
- , p_multiplicable( false )
- , p_optional_value( optional_value )
- , m_id_policy( ID )
- , m_arg_factory( F )
- {}
-
- // Destructor
- virtual ~parameter() {}
-
- unit_test::readwrite_property<bool> p_optional;
- unit_test::readwrite_property<bool> p_multiplicable;
- unit_test::readwrite_property<bool> p_optional_value;
- unit_test::readwrite_property<dstring> p_description;
-
- // parameter properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- if( m.has( optional_m ) )
- p_optional.value = true;
-
- if( m.has( required_m ) )
- p_optional.value = false;
-
- if( m.has( multiplicable_m ) )
- p_multiplicable.value = true;
-
- if( m.has( optional_value_m ) )
- p_optional_value.value = true;
-
- nfp::optionally_assign( p_description.value, m, description );
- }
-
- // access methods
- bool has_argument() const { return !!m_actual_argument; }
- argument const& actual_argument() const { return *m_actual_argument; }
- argument_ptr actual_argument() { return m_actual_argument; }
- void reset() { m_actual_argument.reset(); }
-
-
- // identification interface
- bool responds_to( cstring name ) const { return m_id_policy.responds_to( name ); }
- bool conflict_with( parameter const& p ) const
- {
- return (id_2_report() == p.id_2_report() && !id_2_report().is_empty()) ||
- m_id_policy.conflict_with( p.m_id_policy ) ||
- ((m_id_policy.p_type_id != p.m_id_policy.p_type_id) && p.m_id_policy.conflict_with( m_id_policy ));
- }
- cstring id_2_report() const { return m_id_policy.id_2_report(); }
- void usage_info( format_stream& fs ) const
- {
- m_id_policy.usage_info( fs );
- if( p_optional_value )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '[' );
-
- m_arg_factory.argument_usage_info( fs );
-
- if( p_optional_value )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ']' );
- }
-
- // argument match/produce based on input
- bool matching( argv_traverser& tr, bool primary ) const
- {
- return m_id_policy.matching( *this, tr, primary );
- }
-
- // argument production based on different source
- void produce_argument( argv_traverser& tr )
- {
- m_id_policy.matching( *this, tr, true ); // !! can we save this position somehow
- m_actual_argument = m_arg_factory.produce_using( *this, tr );
- }
- void produce_argument( parser const& p )
- {
- m_actual_argument = m_arg_factory.produce_using( *this, p );
- }
-
-private:
- //Data members
- identification_policy& m_id_policy;
- argument_factory& m_arg_factory;
- argument_ptr m_actual_argument;
-};
-
-//____________________________________________________________________________//
-
-template<typename Parameter,typename Modifier>
-inline shared_ptr<Parameter>
-operator-( shared_ptr<Parameter> p, Modifier const& m )
-{
- p->accept_modifier( m );
-
- return p;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/parser.cpp b/boost/test/utils/runtime/cla/parser.cpp
deleted file mode 100644
index 8efc17d3b2..0000000000
--- a/boost/test/utils/runtime/cla/parser.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : offline implementation for parser
-// ***************************************************************************
-
-#include <boost/test/utils/runtime/config.hpp>
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/parser.ipp>
diff --git a/boost/test/utils/runtime/cla/parser.hpp b/boost/test/utils/runtime/cla/parser.hpp
index ffe09e4adc..effde33a52 100644
--- a/boost/test/utils/runtime/cla/parser.hpp
+++ b/boost/test/utils/runtime/cla/parser.hpp
@@ -1,158 +1,491 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Use, modification, and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/libs/test for the library home page.
//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines parser - public interface for CLA parsing and accessing
+//!@file
+//!@brief CLA parser
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_HPP
#define BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
+// Boost.Test Runtime parameters
#include <boost/test/utils/runtime/argument.hpp>
+#include <boost/test/utils/runtime/modifier.hpp>
+#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-// Boost
-#include <boost/optional.hpp>
+// Boost.Test
+#include <boost/test/utils/foreach.hpp>
+#include <boost/test/utils/algorithm.hpp>
+#include <boost/test/detail/throw_exception.hpp>
-// STL
-#include <list>
+#include <boost/algorithm/cxx11/all_of.hpp> // !! ?? unnecessary after cxx11
-namespace boost {
+// STL
+// !! ?? #include <unordered_set>
+#include <set>
+#include <iostream>
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+#include <boost/test/detail/suppress_warnings.hpp>
+namespace boost {
+namespace runtime {
namespace cla {
// ************************************************************************** //
-// ************** runtime::cla::parser ************** //
+// ************** runtime::cla::parameter_trie ************** //
// ************************************************************************** //
-namespace cla_detail {
+namespace rt_cla_detail {
-template<typename Modifier>
-class global_mod_parser {
-public:
- global_mod_parser( parser& p, Modifier const& m )
- : m_parser( p )
- , m_modifiers( m )
- {}
-
- template<typename Param>
- global_mod_parser const&
- operator<<( shared_ptr<Param> param ) const
+struct parameter_trie;
+typedef shared_ptr<parameter_trie> parameter_trie_ptr;
+typedef std::map<char,parameter_trie_ptr> trie_per_char;
+typedef std::vector<boost::reference_wrapper<parameter_cla_id const> > param_cla_id_list;
+
+struct parameter_trie {
+ parameter_trie() : m_has_final_candidate( false ) {}
+
+ /// If subtrie corresponding to the char c exists returns it otherwise creates new
+ parameter_trie_ptr make_subtrie( char c )
{
- param->accept_modifier( m_modifiers );
+ trie_per_char::const_iterator it = m_subtrie.find( c );
- m_parser << param;
+ if( it == m_subtrie.end() )
+ it = m_subtrie.insert( std::make_pair( c, parameter_trie_ptr( new parameter_trie ) ) ).first;
- return *this;
+ return it->second;
}
-private:
- // Data members;
- parser& m_parser;
- Modifier const& m_modifiers;
+ /// Creates series of sub-tries per characters in a string
+ parameter_trie_ptr make_subtrie( cstring s )
+ {
+ parameter_trie_ptr res;
+
+ BOOST_TEST_FOREACH( char, c, s )
+ res = (res ? res->make_subtrie( c ) : make_subtrie( c ));
+
+ return res;
+ }
+
+ /// Registers candidate parameter for this subtrie. If final, it needs to be unique
+ void add_candidate_id( parameter_cla_id const& param_id, basic_param_ptr param_candidate, bool final )
+ {
+ BOOST_TEST_I_ASSRT( !m_has_final_candidate && (!final || m_id_candidates.empty()),
+ conflicting_param() << "Parameter cla id " << param_id.m_tag << " conflicts with the "
+ << "parameter cla id " << m_id_candidates.back().get().m_tag );
+
+ m_has_final_candidate = final;
+ m_id_candidates.push_back( ref(param_id) );
+
+ if( m_id_candidates.size() == 1 )
+ m_param_candidate = param_candidate;
+ else
+ m_param_candidate.reset();
+ }
+
+ /// Gets subtrie for specified char if present or nullptr otherwise
+ parameter_trie_ptr get_subtrie( char c ) const
+ {
+ trie_per_char::const_iterator it = m_subtrie.find( c );
+
+ return it != m_subtrie.end() ? it->second : parameter_trie_ptr();
+ }
+
+ // Data members
+ trie_per_char m_subtrie;
+ param_cla_id_list m_id_candidates;
+ basic_param_ptr m_param_candidate;
+ bool m_has_final_candidate;
};
+// ************************************************************************** //
+// ************** runtime::cla::report_foreing_token ************** //
+// ************************************************************************** //
+
+static void
+report_foreing_token( cstring program_name, cstring token )
+{
+ std::cerr << "Boost.Test WARNING: token \"" << token << "\" does not correspond to the Boost.Test argument \n"
+ << " and should be placed after all Boost.Test arguments and the -- separator.\n"
+ << " For example: " << program_name << " --random -- " << token << "\n";
}
+} // namespace rt_cla_detail
+
// ************************************************************************** //
// ************** runtime::cla::parser ************** //
// ************************************************************************** //
class parser {
public:
- typedef std::list<parameter_ptr>::const_iterator param_iterator;
- typedef std::list<parameter_ptr>::size_type param_size_type;
-
- // Constructor
- explicit parser( cstring program_name = cstring() );
+ /// Initializes a parser and builds internal trie representation used for
+ /// parsing based on the supplied parameters
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ parser( parameters_store const& parameters, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ parser( parameters_store const& parameters, Modifiers const& m )
+#endif
+ {
+ nfp::opt_assign( m_end_of_param_indicator, m, end_of_params );
+ nfp::opt_assign( m_negation_prefix, m, negation_prefix );
- // parameter list construction interface
- parser& operator<<( parameter_ptr param );
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_end_of_param_indicator.begin(),
+ m_end_of_param_indicator.end(),
+ parameter_cla_id::valid_prefix_char ),
+ invalid_cla_id() << "End of parameters indicator can only consist of prefix characters." );
- // parser and global parameters modifiers
- template<typename Modifier>
- cla_detail::global_mod_parser<Modifier>
- operator-( Modifier const& m )
- {
- nfp::optionally_assign( m_traverser.p_separator.value, m, input_separator );
- nfp::optionally_assign( m_traverser.p_ignore_mismatch.value, m, ignore_mismatch_m );
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_negation_prefix.begin(),
+ m_negation_prefix.end(),
+ parameter_cla_id::valid_name_char ),
+ invalid_cla_id() << "Negation prefix can only consist of prefix characters." );
- return cla_detail::global_mod_parser<Modifier>( *this, m );
+ build_trie( parameters );
}
// input processing method
- void parse( int& argc, char_type** argv );
+ int
+ parse( int argc, char** argv, runtime::arguments_store& res )
+ {
+ // save program name for help message
+ m_program_name = argv[0];
+ cstring path_sep( "\\/" );
+
+ cstring::iterator it = unit_test::utils::find_last_of( m_program_name.begin(), m_program_name.end(),
+ path_sep.begin(), path_sep.end() );
+ if( it != m_program_name.end() )
+ m_program_name.trim_left( it + 1 );
+
+ // Set up the traverser
+ argv_traverser tr( argc, (char const**)argv );
+
+ // Loop till we reach end of input
+ while( !tr.eoi() ) {
+ cstring curr_token = tr.current_token();
+
+ cstring prefix;
+ cstring name;
+ cstring value_separator;
+ bool negative_form = false;
+
+ // Perform format validations and split the argument into prefix, name and separator
+ // False return value indicates end of params indicator is met
+ if( !validate_token_format( curr_token, prefix, name, value_separator, negative_form ) ) {
+ // get rid of "end of params" token
+ tr.next_token();
+ break;
+ }
+
+ // Locate trie corresponding to found prefix and skip it in the input
+ trie_ptr curr_trie = m_param_trie[prefix];
+
+ if( !curr_trie ) {
+ // format_error() << "Unrecognized parameter prefix in the argument " << tr.current_token()
+ rt_cla_detail::report_foreing_token( m_program_name, curr_token );
+ tr.save_token();
+ continue;
+ }
+
+ curr_token.trim_left( prefix.size() );
+
+ // Locate parameter based on a name and skip it in the input
+ locate_result locate_res = locate_parameter( curr_trie, name, curr_token );
+ parameter_cla_id const& found_id = locate_res.first;
+ basic_param_ptr found_param = locate_res.second;
+
+ if( negative_form ) {
+ BOOST_TEST_I_ASSRT( found_id.m_negatable,
+ format_error( found_param->p_name )
+ << "Parameter tag " << found_id.m_tag << " is not negatable." );
+
+ curr_token.trim_left( m_negation_prefix.size() );
+ }
+
+ curr_token.trim_left( name.size() );
+
+ cstring value;
+
+ // Skip validations if parameter has optional value and we are at the end of token
+ if( !value_separator.is_empty() || !found_param->p_has_optional_value ) {
+ // Validate and skip value separator in the input
+ BOOST_TEST_I_ASSRT( found_id.m_value_separator == value_separator,
+ format_error( found_param->p_name )
+ << "Invalid separator for the parameter "
+ << found_param->p_name
+ << " in the argument " << tr.current_token() );
+
+ curr_token.trim_left( value_separator.size() );
+
+ // Deduce value source
+ value = curr_token;
+ if( value.is_empty() ) {
+ tr.next_token();
+ value = tr.current_token();
+ }
+
+ BOOST_TEST_I_ASSRT( !value.is_empty(),
+ format_error( found_param->p_name )
+ << "Missing an argument value for the parameter "
+ << found_param->p_name
+ << " in the argument " << tr.current_token() );
+ }
+
+ // Validate against argument duplication
+ BOOST_TEST_I_ASSRT( !res.has( found_param->p_name ) || found_param->p_repeatable,
+ duplicate_arg( found_param->p_name )
+ << "Duplicate argument value for the parameter "
+ << found_param->p_name
+ << " in the argument " << tr.current_token() );
+
+ // Produce argument value
+ found_param->produce_argument( value, negative_form, res );
+
+ tr.next_token();
+ }
+
+ // generate the remainder and return it's size
+ return tr.remainder();
+ }
- // parameters access
- param_iterator first_param() const;
- param_iterator last_param() const;
- param_size_type num_params() const { return m_parameters.size(); }
- void reset();
+ // help/usage
+ void
+ usage( std::ostream& ostr, cstring param_name = cstring() )
+ {
+ if( !param_name.is_empty() ) {
+ basic_param_ptr param = locate_parameter( m_param_trie[help_prefix], param_name, "" ).second;
+ param->usage( ostr, m_negation_prefix );
+ }
+ else {
+ ostr << "Usage: " << m_program_name << " [Boost.Test argument]... ";
+ if( !m_end_of_param_indicator.empty() )
+ ostr << m_end_of_param_indicator << " [custom test module argument]...";
+ ostr << "\n";
+ }
+
+ ostr << "\nFor detailed help on Boost.Test parameters use:\n"
+ << " " << m_program_name << " --help\n"
+ << "or\n"
+ << " " << m_program_name << " --help=<parameter name>\n";
+ }
- // arguments access
- const_argument_ptr operator[]( cstring string_id ) const;
- cstring get( cstring string_id ) const;
+ void
+ help( std::ostream& ostr, parameters_store const& parameters, cstring param_name )
+ {
+ if( !param_name.is_empty() ) {
+ basic_param_ptr param = locate_parameter( m_param_trie[help_prefix], param_name, "" ).second;
+ param->help( ostr, m_negation_prefix );
+ return;
+ }
+
+ ostr << "Usage: " << m_program_name << " [Boost.Test argument]... ";
+ if( !m_end_of_param_indicator.empty() )
+ ostr << m_end_of_param_indicator << " [custom test module argument]...";
+
+ ostr << "\n\nBoost.Test arguments correspond to parameters listed below. "
+ "All parameters are optional. You can use specify parameter value either "
+ "as a command line argument or as a value of corresponding environment "
+ "variable. In case if argument for the same parameter is specified in both "
+ "places, command line is taking precedence. Command line argument format "
+ "supports parameter name guessing, so you can use any unambiguous "
+ "prefix to identify a parameter.";
+ if( !m_end_of_param_indicator.empty() )
+ ostr << " All the arguments after the " << m_end_of_param_indicator << " are ignored by the Boost.Test.";
+
+ ostr << "\n\nBoost.Test supports following parameters:\n";
+
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, parameters.all() ) {
+ basic_param_ptr param = v.second;
+
+ param->usage( ostr, m_negation_prefix );
+ }
+
+ ostr << "\nUse --help=<parameter name> to display detailed help for specific parameter.\n";
+ }
- template<typename T>
- T const& get( cstring string_id ) const
+private:
+ typedef rt_cla_detail::parameter_trie_ptr trie_ptr;
+ typedef rt_cla_detail::trie_per_char trie_per_char;
+ typedef std::map<cstring,trie_ptr> str_to_trie;
+
+ void
+ build_trie( parameters_store const& parameters )
{
- return arg_value<T>( valid_argument( string_id ) );
+ // Iterate over all parameters
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, parameters.all() ) {
+ basic_param_ptr param = v.second;
+
+ // Register all parameter's ids in trie.
+ BOOST_TEST_FOREACH( parameter_cla_id const&, id, param->cla_ids() ) {
+ // This is the trie corresponding to the prefix.
+ trie_ptr next_trie = m_param_trie[id.m_prefix];
+ if( !next_trie )
+ next_trie = m_param_trie[id.m_prefix] = trie_ptr( new rt_cla_detail::parameter_trie );
+
+ // Build the trie, by following name's characters
+ // and register this parameter as candidate on each level
+ for( size_t index = 0; index < id.m_tag.size(); ++index ) {
+ next_trie = next_trie->make_subtrie( id.m_tag[index] );
+
+ next_trie->add_candidate_id( id, param, index == (id.m_tag.size() - 1) );
+ }
+ }
+ }
}
- template<typename T>
- void get( cstring string_id, boost::optional<T>& res ) const
+ bool
+ validate_token_format( cstring token, cstring& prefix, cstring& name, cstring& separator, bool& negative_form )
{
- const_argument_ptr actual_arg = (*this)[string_id];
+ // Match prefix
+ cstring::iterator it = token.begin();
+ while( it != token.end() && parameter_cla_id::valid_prefix_char( *it ) )
+ ++it;
- if( actual_arg )
- res = arg_value<T>( *actual_arg );
- else
- res.reset();
- }
+ prefix.assign( token.begin(), it );
- // help/usage
- void usage( out_stream& ostr );
- void help( out_stream& ostr );
+ if( prefix.empty() )
+ return true;
-private:
- argument const& valid_argument( cstring string_id ) const;
+ // Match name
+ while( it != token.end() && parameter_cla_id::valid_name_char( *it ) )
+ ++it;
- // Data members
- argv_traverser m_traverser;
- std::list<parameter_ptr> m_parameters;
- dstring m_program_name;
-};
+ name.assign( prefix.end(), it );
-//____________________________________________________________________________//
+ if( name.empty() ) {
+ if( prefix == m_end_of_param_indicator )
+ return false;
-} // namespace cla
+ BOOST_TEST_I_THROW( format_error() << "Invalid format for an actual argument " << token );
+ }
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+ // Match value separator
+ while( it != token.end() && parameter_cla_id::valid_separator_char( *it ) )
+ ++it;
-} // namespace boost
+ separator.assign( name.end(), it );
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
+ // Match negation prefix
+ negative_form = !m_negation_prefix.empty() && ( name.substr( 0, m_negation_prefix.size() ) == m_negation_prefix );
+ if( negative_form )
+ name.trim_left( m_negation_prefix.size() );
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/parser.ipp>
+ return true;
+ }
+ // C++03: cannot have references as types
+ typedef std::pair<parameter_cla_id, basic_param_ptr> locate_result;
+
+ locate_result
+ locate_parameter( trie_ptr curr_trie, cstring name, cstring token )
+ {
+ std::vector<trie_ptr> typo_candidates;
+ std::vector<trie_ptr> next_typo_candidates;
+ trie_ptr next_trie;
+
+ BOOST_TEST_FOREACH( char, c, name ) {
+ if( curr_trie ) {
+ // locate next subtrie corresponding to the char
+ next_trie = curr_trie->get_subtrie( c );
+
+ if( next_trie )
+ curr_trie = next_trie;
+ else {
+ // Initiate search for typo candicates. We will account for 'wrong char' typo
+ // 'missing char' typo and 'extra char' typo
+ BOOST_TEST_FOREACH( trie_per_char::value_type const&, typo_cand, curr_trie->m_subtrie ) {
+ // 'wrong char' typo
+ typo_candidates.push_back( typo_cand.second );
+
+ // 'missing char' typo
+ if( (next_trie = typo_cand.second->get_subtrie( c )) )
+ typo_candidates.push_back( next_trie );
+ }
+
+ // 'extra char' typo
+ typo_candidates.push_back( curr_trie );
+
+ curr_trie.reset();
+ }
+ }
+ else {
+ // go over existing typo candidates and see if they are still viable
+ BOOST_TEST_FOREACH( trie_ptr, typo_cand, typo_candidates ) {
+ trie_ptr next_typo_cand = typo_cand->get_subtrie( c );
+
+ if( next_typo_cand )
+ next_typo_candidates.push_back( next_typo_cand );
+ }
+
+ next_typo_candidates.swap( typo_candidates );
+ next_typo_candidates.clear();
+ }
+ }
+
+ if( !curr_trie ) {
+ std::vector<cstring> typo_candidate_names;
+ std::set<parameter_cla_id const*> unique_typo_candidate; // !! ?? unordered_set
+ typo_candidate_names.reserve( typo_candidates.size() );
+// !! ?? unique_typo_candidate.reserve( typo_candidates.size() );
+
+ BOOST_TEST_FOREACH( trie_ptr, trie_cand, typo_candidates ) {
+ // avoid ambiguos candidate trie
+ if( trie_cand->m_id_candidates.size() > 1 )
+ continue;
+
+ BOOST_TEST_FOREACH( parameter_cla_id const&, param_cand, trie_cand->m_id_candidates ) {
+ if( !unique_typo_candidate.insert( &param_cand ).second )
+ continue;
+
+ typo_candidate_names.push_back( param_cand.m_tag );
+ }
+ }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ BOOST_TEST_I_THROW( unrecognized_param( std::move(typo_candidate_names) )
+ << "An unrecognized parameter in the argument "
+ << token );
+#else
+ BOOST_TEST_I_THROW( unrecognized_param( typo_candidate_names )
+ << "An unrecognized parameter in the argument "
+ << token );
#endif
+ }
+
+ if( curr_trie->m_id_candidates.size() > 1 ) {
+ std::vector<cstring> amb_names;
+ BOOST_TEST_FOREACH( parameter_cla_id const&, param_id, curr_trie->m_id_candidates )
+ amb_names.push_back( param_id.m_tag );
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ BOOST_TEST_I_THROW( ambiguous_param( std::move( amb_names ) )
+ << "An ambiguous parameter name in the argument " << token );
+#else
+ BOOST_TEST_I_THROW( ambiguous_param( amb_names )
+ << "An ambiguous parameter name in the argument " << token );
+#endif
+ }
+
+ return locate_result( curr_trie->m_id_candidates.back().get(), curr_trie->m_param_candidate );
+ }
+
+ // Data members
+ cstring m_program_name;
+ std::string m_end_of_param_indicator;
+ std::string m_negation_prefix;
+ str_to_trie m_param_trie;
+};
+
+} // namespace cla
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_HPP
diff --git a/boost/test/utils/runtime/cla/parser.ipp b/boost/test/utils/runtime/cla/parser.ipp
deleted file mode 100644
index b8a4ca4636..0000000000
--- a/boost/test/utils/runtime/cla/parser.ipp
+++ /dev/null
@@ -1,267 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements parser - public interface for CLA parsing and accessing
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/trace.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-#include <boost/test/utils/runtime/cla/parameter.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
-#include <boost/test/utils/runtime/cla/validation.hpp>
-#include <boost/test/utils/runtime/cla/parser.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/foreach.hpp>
-
-// Boost
-#include <boost/lexical_cast.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::parser ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-parser::parser( cstring program_name )
-{
- assign_op( m_program_name, program_name, 0 );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE parser::param_iterator
-parser::first_param() const
-{
- return m_parameters.begin();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE parser::param_iterator
-parser::last_param() const
-{
- return m_parameters.end();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE argument const&
-parser::valid_argument( cstring string_id ) const
-{
- const_argument_ptr arg = (*this)[string_id];
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !!arg, "Actual argument for parameter " << string_id << " is not present" );
-
- return *arg;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE parser&
-parser::operator<<( parameter_ptr new_param )
-{
- BOOST_TEST_FOREACH( parameter_ptr, old_param, m_parameters ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !old_param->conflict_with( *new_param ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Definition of parameter " ) << new_param->id_2_report() <<
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " conflicts with defintion of parameter " ) << old_param->id_2_report() );
- }
-
- m_parameters.push_back( new_param );
-
- return *this;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::parse( int& argc, char_type** argv )
-{
- if( m_program_name.empty() ) {
- m_program_name.assign( argv[0] );
- dstring::size_type pos = m_program_name.find_last_of( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "/\\" ) );
-
- if( pos != static_cast<dstring::size_type>(cstring::npos) )
- m_program_name.erase( 0, pos+1 );
- }
-
- m_traverser.init( argc, argv );
-
- BOOST_TEST_IMPL_TRY {
- while( !m_traverser.eoi() ) {
- parameter_ptr found_param;
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Total " << m_parameters.size() << " parameters registered" );
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Try parameter " << curr_param->id_2_report() );
-
- if( curr_param->matching( m_traverser, !found_param ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Match found" );
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( !found_param, (m_traverser.rollback(),m_traverser), "Ambiguous input" );
-
- found_param = curr_param;
- }
-
- m_traverser.rollback();
- }
-
- if( !found_param ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "No match found" );
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( m_traverser.handle_mismatch(), m_traverser,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Unexpected input" ) );
-
- continue;
- }
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Parse argument value" );
- found_param->produce_argument( m_traverser );
-
- m_traverser.commit();
- }
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- if( !curr_param->p_optional && !curr_param->actual_argument() ) {
- curr_param->produce_argument( *this );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( curr_param->actual_argument(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Required argument for parameter " ) << curr_param->id_2_report()
- << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " is missing" ) );
- }
- }
- }
- BOOST_TEST_IMPL_CATCH0( bad_lexical_cast ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_REPORT_LOGIC_ERROR(
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "String to value convertion error during input parsing" ) );
- };
-
- m_traverser.remainder( argc, argv );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE const_argument_ptr
-parser::operator[]( cstring string_id ) const
-{
- parameter_ptr found_param;
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- if( curr_param->responds_to( string_id ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !found_param,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Ambiguous parameter string id: " ) << string_id );
-
- found_param = curr_param;
- }
- }
-
- return found_param ? found_param->actual_argument() : argument_ptr();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-parser::get( cstring string_id ) const
-{
- return get<cstring>( string_id );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::usage( out_stream& ostr )
-{
- if( m_program_name.empty() )
- assign_op( m_program_name, BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "<program>" ), 0 );
-
- format_stream fs;
-
- fs << m_program_name;
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '[' );
-
- curr_param->usage_info( fs );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ']' );
-
- if( curr_param->p_multiplicable ) {
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( " ... " );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '[' );
-
- curr_param->usage_info( fs );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ']' );
- }
- }
-
- ostr << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "Usage:\n" ) << fs.str() << std::endl;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::help( out_stream& ostr )
-{
- usage( ostr );
-
- bool need_where = true;
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- if( curr_param->p_description->empty() )
- continue;
-
- if( need_where ) {
- ostr << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "where:\n" );
- need_where = false;
- }
-
- ostr << curr_param->id_2_report() << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( " - " ) << curr_param->p_description << std::endl;
- }
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::reset()
-{
- BOOST_TEST_FOREACH( parameter_ptr const&, param, m_parameters )
- param->reset();
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_IPP
diff --git a/boost/test/utils/runtime/cla/positional_parameter.hpp b/boost/test/utils/runtime/cla/positional_parameter.hpp
deleted file mode 100644
index f378743dd5..0000000000
--- a/boost/test/utils/runtime/cla/positional_parameter.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : positional parameter model
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_POSITIONAL_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_POSITIONAL_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/basic_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** trivial_id_policy ************** //
-// ************************************************************************** //
-
-class trivial_id_policy : public identification_policy {
-public:
- trivial_id_policy()
- : identification_policy( rtti::type_id<trivial_id_policy>() )
- {}
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~trivial_id_policy() {}
-
- virtual bool responds_to( cstring name ) const { return m_name == name; }
- virtual bool conflict_with( identification_policy const& ) const { return false; }
- virtual cstring id_2_report() const { return m_name; }
- virtual void usage_info( format_stream& fs ) const
- {
- if( !m_name.empty() )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '<' ) << m_name << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '>' );
- else
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "<value>" );
- }
-
- virtual bool matching( parameter const& p, argv_traverser&, bool primary ) const
- {
- return primary && ( !p.has_argument() || p.p_multiplicable );
- }
-
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- nfp::optionally_assign( m_name, m, name );
- }
-
-private:
- // Data members
- dstring m_name;
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::positional_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class positional_parameter_t : public basic_parameter<T,trivial_id_policy> {
- typedef basic_parameter<T,trivial_id_policy> base;
-public:
- // Constructors
- explicit positional_parameter_t( cstring name )
- : base( name )
- {}
-};
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( positional_parameter )
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_POSITIONAL_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/typed_parameter.hpp b/boost/test/utils/runtime/cla/typed_parameter.hpp
deleted file mode 100644
index 70c5bbc009..0000000000
--- a/boost/test/utils/runtime/cla/typed_parameter.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : generic typed parameter model
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_TYPED_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_TYPED_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/parameter.hpp>
-#include <boost/test/utils/runtime/cla/argument_factory.hpp>
-
-// Boost.Test
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::typed_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class typed_parameter : public cla::parameter {
-public:
- explicit typed_parameter( identification_policy& ID )
- : cla::parameter( ID, m_arg_factory, rtti::type_id<T>() == rtti::type_id<bool>() )
- {}
-
- // parameter properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- cla::parameter::accept_modifier( m );
-
- m_arg_factory.accept_modifier( m );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !p_optional || !m_arg_factory.m_value_generator,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "can't define a value generator for optional parameter " ) << id_2_report() );
- }
-
-private:
- // Data members
- typed_argument_factory<T> m_arg_factory;
-};
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_TYPED_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/validation.cpp b/boost/test/utils/runtime/cla/validation.cpp
deleted file mode 100644
index 7f19a5ca45..0000000000
--- a/boost/test/utils/runtime/cla/validation.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : input validation helpers offline implementation
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/validation.ipp>
diff --git a/boost/test/utils/runtime/cla/validation.hpp b/boost/test/utils/runtime/cla/validation.hpp
deleted file mode 100644
index 8a3da14c5b..0000000000
--- a/boost/test/utils/runtime/cla/validation.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : input validation helpers definition
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::report_input_error ************** //
-// ************************************************************************** //
-
-void report_input_error( argv_traverser const& tr, format_stream& msg );
-
-//____________________________________________________________________________//
-
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( b, tr, msg ) \
- if( b ) ; else ::boost::BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::cla::report_input_error( tr, format_stream().ref() << msg )
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/validation.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_HPP
diff --git a/boost/test/utils/runtime/cla/validation.ipp b/boost/test/utils/runtime/cla/validation.ipp
deleted file mode 100644
index 9d8cd27b4a..0000000000
--- a/boost/test/utils/runtime/cla/validation.ipp
+++ /dev/null
@@ -1,61 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-//! @file
-//! @brief Input validation helpers implementation
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-#include <boost/test/utils/runtime/cla/validation.hpp>
-#include <boost/test/utils/runtime/validation.hpp> // BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::logic_error
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/detail/throw_exception.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::validation ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-report_input_error( argv_traverser const& tr, format_stream& msg )
-{
- if( tr.eoi() )
- msg << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " at the end of input" );
- else {
- msg << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " in the following position: " );
-
- if( tr.input().size() > 5 )
- msg << tr.input().substr( 0, 5 ) << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "..." );
- else
- msg << tr.input();
- }
-
- BOOST_TEST_IMPL_THROW( BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::logic_error( msg.str() ) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_IPP
diff --git a/boost/test/utils/runtime/cla/value_generator.hpp b/boost/test/utils/runtime/cla/value_generator.hpp
deleted file mode 100644
index 0efc25def1..0000000000
--- a/boost/test/utils/runtime/cla/value_generator.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : specific value generators
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_GENERATOR_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_GENERATOR_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/parser.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-namespace rt_cla_detail {
-
-// ************************************************************************** //
-// ************** runtime::cla::const_generator ************** //
-// ************************************************************************** //
-
-template<typename T>
-class const_generator {
-public:
- // Constructor
- explicit const_generator( T const& t ) : m_const_value( t ) {}
-
- // generator interface
- void operator()( parser const&, boost::optional<T>& t ) const { t = m_const_value; }
-
-private:
- // Data members
- T m_const_value;
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::ref_generator ************** //
-// ************************************************************************** //
-
-template<typename T>
-class ref_generator {
-public:
- // Constructor
- explicit ref_generator( cstring ref_id ) : m_ref_id( ref_id ) {}
-
- // generator interface
- void operator()( parser const& p, boost::optional<T>& t ) const
- {
- p.get( m_ref_id, t );
- }
-
-private:
- // Data members
- cstring m_ref_id;
-};
-
-//____________________________________________________________________________//
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_GENERATOR_HPP
diff --git a/boost/test/utils/runtime/cla/value_handler.hpp b/boost/test/utils/runtime/cla/value_handler.hpp
deleted file mode 100644
index 38792602ac..0000000000
--- a/boost/test/utils/runtime/cla/value_handler.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : specific value handlers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_HANDLER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_HANDLER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-namespace rt_cla_detail {
-
-// ************************************************************************** //
-// ************** runtime::cla::assigner ************** //
-// ************************************************************************** //
-
-template<typename T>
-class assigner {
-public:
- // Constructor
- explicit assigner( T& loc ) : m_target( loc ) {}
-
- // value handler implementation
- void operator()( parameter const&, T& t ) { m_target = t; }
-
-private:
- // Data members
- T& m_target;
-};
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_HANDLER_HPP
diff --git a/boost/test/utils/runtime/config.hpp b/boost/test/utils/runtime/config.hpp
deleted file mode 100644
index dfa9ae30de..0000000000
--- a/boost/test/utils/runtime/config.hpp
+++ /dev/null
@@ -1,162 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : Runtime.Param library configuration
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CONFIG_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CONFIG_HPP
-
-// Boost
-#include <boost/config.hpp>
-#ifdef BOOST_MSVC
-# pragma warning(disable: 4511) // copy constructor could not be generated
-# pragma warning(disable: 4512) // assignment operator could not be generated
-# pragma warning(disable: 4181) // qualifier applied to reference type; ignored
-# pragma warning(disable: 4675) // resolved overload was found by argument-dependent lookup
-#endif
-
-// Boost.Test
-#include <boost/test/detail/config.hpp>
-#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
-#include <boost/test/utils/wrap_stringstream.hpp>
-#include <boost/test/utils/basic_cstring/io.hpp> // operator<<(boost::runtime::cstring)
-
-// STL
-#include <string>
-#include <cstdlib>
-
-#ifdef __SUNPRO_CC
- #include <stdlib.h>
-#endif
-
-//____________________________________________________________________________//
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_CUSTOM_STRING
-# ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_WIDE_STRING
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE runtime
-# else
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE wide_runtime
-# endif
-#endif
-
-
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_CUSTOM_STRING
-# ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_WIDE_STRING
-
-typedef char char_type;
-typedef std::string dstring;
-typedef unit_test::const_string cstring;
-typedef unit_test::literal_string literal_cstring;
-typedef wrap_stringstream format_stream;
-
-#ifdef BOOST_CLASSIC_IOSTREAMS
-typedef std::ostream out_stream;
-#else
-typedef std::basic_ostream<char_type> out_stream;
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4996) // putenv
-#endif
-
-#if defined(__MINGW32__)
-extern "C" int putenv( const char * );
-#endif
-
-#ifndef UNDER_CE
-#if defined(__COMO__) && 0
-inline void
-putenv_impl( cstring name, cstring value )
-{
- using namespace std;
- // !! this may actually fail. What should we do?
- setenv( name.begin(), value.begin(), 1 );
-}
-#else
-inline void
-putenv_impl( cstring name, cstring value )
-{
- format_stream fs;
-
- fs << name << '=' << value;
-
- // !! this may actually fail. What should we do?
- // const_cast is used to satisfy putenv interface
- using namespace std;
- putenv( const_cast<char*>( fs.str().c_str() ) );
-}
-#endif
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( l ) l
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( l ) cstring( l, sizeof( l ) - 1 )
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_GETENV getenv
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_PUTENV ::boost::BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::putenv_impl
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_EXCEPTION_INHERIT_STD
-
-//____________________________________________________________________________//
-
-# else
-
-typedef wchar_t char_type;
-typedef std::basic_string<char_type> dstring;
-typedef unit_test::basic_cstring<wchar_t const> cstring;
-typedef const unit_test::basic_cstring<wchar_t const> literal_cstring;
-typedef wrap_wstringstream format_stream;
-typedef std::wostream out_stream;
-
-#ifndef UNDER_CE
-inline void
-putenv_impl( cstring name, cstring value )
-{
- format_stream fs;
-
- fs << name << '=' << value;
-
- // !! this may actually fail. What should we do?
- // const_cast is used to satisfy putenv interface
- using namespace std;
- wputenv( const_cast<wchar_t*>( fs.str().c_str() ) );
-}
-#endif
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( l ) L ## l
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( l ) cstring( L ## l, sizeof( L ## l )/sizeof(wchar_t) - 1 )
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_GETENV wgetenv
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_PUTENV putenv_impl
-
-# endif
-#endif
-
-#ifdef __GNUC__
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL virtual
-#else
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL
-#endif
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CONFIG_HPP
diff --git a/boost/test/utils/runtime/configuration.hpp b/boost/test/utils/runtime/configuration.hpp
deleted file mode 100644
index bf731736ee..0000000000
--- a/boost/test/utils/runtime/configuration.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : abstract interface for the formal parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CONFIGURATION_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CONFIGURATION_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::configuration ************** //
-// ************************************************************************** //
-
-class config_source {
- virtual parameter const& config_param_begin() const = 0;
- virtual parameter const& config_param_end() const = 0;
-
-protected:
- config_source() {}
- ~config_source() {}
-};
-
-// ************************************************************************** //
-// ************** runtime::configuration ************** //
-// ************************************************************************** //
-
-template<typename StoragePolicy,typename IdentificationPlicy,typename ConflictResolutionPolicy>
-class configuration : public StoragePolicy, public IdentificationPlicy, public ConflictResolutionPolicy {
-public:
- // Constructor
- configuration();
-
- void use( config_source const& )
- {
-
- }
-private:
-};
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CONFIGURATION_HPP
diff --git a/boost/test/utils/runtime/env/environment.cpp b/boost/test/utils/runtime/env/environment.cpp
deleted file mode 100644
index ddf47b342c..0000000000
--- a/boost/test/utils/runtime/env/environment.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements offline model of program environment
-// ***************************************************************************
-
-#include <boost/test/utils/runtime/config.hpp>
-
-#ifdef BOOST_MSVC
-# pragma warning(disable: 4127) // conditional expression is constant
-# pragma warning(disable: 4701) // local environment 'result' may be used without having been initialized
-#endif
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/env/environment.ipp>
diff --git a/boost/test/utils/runtime/env/environment.hpp b/boost/test/utils/runtime/env/environment.hpp
deleted file mode 100644
index 62b2ae6dc1..0000000000
--- a/boost/test/utils/runtime/env/environment.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines and implements inline model of program environment
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_HPP
-
-#ifdef UNDER_CE
-#error Windows CE does not support environment variables.
-#endif
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-#include <boost/test/utils/runtime/interpret_argument_value.hpp>
-
-#include <boost/test/utils/runtime/env/fwd.hpp>
-#include <boost/test/utils/runtime/env/modifier.hpp>
-#include <boost/test/utils/runtime/env/variable.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::environment implementation ************** //
-// ************************************************************************** //
-
-namespace environment {
-
-namespace rt_env_detail {
-
-template<typename T, typename Modifiers>
-variable_data&
-init_new_var( cstring var_name, Modifiers m = nfp::no_params )
-{
- rt_env_detail::variable_data& new_vd = new_var_record( var_name );
-
- cstring str_value = sys_read_var( new_vd.m_var_name );
-
- if( !str_value.is_empty() ) {
- BOOST_TEST_IMPL_TRY {
- boost::optional<T> value;
-
- if( m.has( interpreter ) )
- m[interpreter]( str_value, value );
- else
- interpret_argument_value( str_value, value, 0 );
-
- if( !!value ) {
- new_vd.m_value.reset( new typed_argument<T>( new_vd ) );
-
- arg_value<T>( *new_vd.m_value ) = *value;
- }
- }
- BOOST_TEST_IMPL_CATCHALL() { // !! could we do that
- // !! should we report an error?
- }
- }
-
- if( !new_vd.m_value && m.has( default_value ) ) {
- new_vd.m_value.reset( new typed_argument<T>( new_vd ) );
-
- nfp::optionally_assign( arg_value<T>( *new_vd.m_value ), m[default_value] );
- }
-
- nfp::optionally_assign( new_vd.m_global_id, m, global_id );
-
- return new_vd;
-}
-
-//____________________________________________________________________________//
-
-} // namespace rt_env_detail
-
-} // namespace environment
-
-// ************************************************************************** //
-// ************** runtime::environment ************** //
-// ************************************************************************** //
-
-namespace environment {
-
- // variable access
- variable_base
- var( cstring var_name );
-
- //________________________________________________________________________//
-
- template<typename T>
- inline variable<T>
- var( cstring var_name )
- {
- rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
-
- return environment::variable<T>( !vd ? rt_env_detail::init_new_var<T>( var_name, nfp::no_params ) : *vd );
- }
-
- //________________________________________________________________________//
-
- template<typename T, typename Modifiers>
- inline variable<T>
- var( cstring var_name, Modifiers const& m )
- {
- rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
-
- return environment::variable<T>( !vd ? rt_env_detail::init_new_var<T>( var_name, m ) : *vd );
- }
-
- //________________________________________________________________________//
-
- // direct variable value access
- inline cstring
- get( cstring var_name )
- {
- return environment::var<cstring>( var_name ).value();
- }
-
- //________________________________________________________________________//
-
- template<typename T>
- inline T const&
- get( cstring var_name )
- {
- return environment::var<T>( var_name ).value();
- }
-
- //________________________________________________________________________//
-
- template<typename T>
- inline void
- get( cstring var_name, boost::optional<T>& res )
- {
- variable<T> const& v = environment::var<T>( var_name );
- v.value( res );
- }
-
- //________________________________________________________________________//
-
-} // namespace environment
-
-namespace env = environment;
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/env/environment.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_HPP
diff --git a/boost/test/utils/runtime/env/environment.ipp b/boost/test/utils/runtime/env/environment.ipp
deleted file mode 100644
index 6baf72f430..0000000000
--- a/boost/test/utils/runtime/env/environment.ipp
+++ /dev/null
@@ -1,125 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements model of program environment
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_IPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/env/variable.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/compare.hpp>
-#include <boost/test/utils/basic_cstring/io.hpp>
-
-// STL
-#include <map>
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-// ************************************************************************** //
-// ************** runtime::environment ************** //
-// ************************************************************************** //
-
-namespace rt_env_detail {
-
-typedef std::map<cstring,rt_env_detail::variable_data> registry;
-typedef std::list<dstring> keys;
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE registry& s_registry() { static registry instance; return instance; }
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE keys& s_keys() { static keys instance; return instance; }
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE variable_data&
-new_var_record( cstring var_name )
-{
- // save the name in list of keys
- s_keys().push_back( dstring() );
- dstring& key = s_keys().back();
- assign_op( key, var_name, 0 );
-
- // create and return new record
- variable_data& new_var_data = s_registry()[key];
-
- new_var_data.m_var_name = key;
-
- return new_var_data;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE variable_data*
-find_var_record( cstring var_name )
-{
- registry::iterator it = s_registry().find( var_name );
-
- return it == s_registry().end() ? 0 : &(it->second);
-}
-
-//____________________________________________________________________________//
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4996) // getenv
-#endif
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-sys_read_var( cstring var_name )
-{
- using namespace std;
- return BOOST_TEST_UTILS_RUNTIME_PARAM_GETENV( var_name.begin() );
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-sys_write_var( cstring var_name, format_stream& var_value )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_PUTENV( var_name, cstring( var_value.str() ) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace rt_env_detail
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE variable_base
-var( cstring var_name )
-{
- rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !!vd,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "First access to the environment variable " )
- << var_name << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " should be typed" ) );
-
- return variable_base( *vd );
-}
-
-//____________________________________________________________________________//
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_IPP_062904GER
diff --git a/boost/test/utils/runtime/env/fetch.hpp b/boost/test/utils/runtime/env/fetch.hpp
new file mode 100644
index 0000000000..97d54d4905
--- /dev/null
+++ b/boost/test/utils/runtime/env/fetch.hpp
@@ -0,0 +1,108 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : implements fetching absent parameter athuments from environment
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_FETCH_HPP
+#define BOOST_TEST_UTILS_RUNTIME_ENV_FETCH_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/parameter.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+// C Runtime
+#include <stdlib.h>
+
+namespace boost {
+namespace runtime {
+namespace env {
+
+namespace env_detail {
+
+#ifndef UNDER_CE
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4996) // getenv
+#endif
+
+inline std::pair<cstring,bool>
+sys_read_var( cstring var_name )
+{
+ using namespace std;
+ char const* res = getenv( var_name.begin() );
+
+ return std::make_pair( cstring(res), res != NULL );
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#else
+
+inline std::pair<cstring,bool>
+sys_read_var( cstring var_name )
+{
+ return std::make_pair( cstring(), false );
+}
+
+#endif
+
+//____________________________________________________________________________//
+
+template<typename ReadFunc>
+inline void
+fetch_absent( parameters_store const& params, runtime::arguments_store& args, ReadFunc read_func )
+{
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, params.all() ) {
+ basic_param_ptr param = v.second;
+
+ if( args.has( param->p_name ) || param->p_env_var.empty() )
+ continue;
+
+ std::pair<cstring,bool> value = read_func( param->p_env_var );
+
+ if( !value.second )
+ continue;
+
+ // Validate against unexpected empty value
+ BOOST_TEST_I_ASSRT( !value.first.is_empty() || param->p_has_optional_value,
+ format_error( param->p_name )
+ << "Missing an argument value for the parameter " << param->p_name
+ << " in the environment." );
+
+ // Produce argument value
+ param->produce_argument( value.first, false, args );
+
+ }
+}
+
+//____________________________________________________________________________//
+
+} // namespace env_detail
+
+inline void
+fetch_absent( parameters_store const& params, runtime::arguments_store& args )
+{
+ env_detail::fetch_absent( params, args, &env_detail::sys_read_var );
+}
+
+} // namespace env
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_ENV_FETCH_HPP
diff --git a/boost/test/utils/runtime/env/fwd.hpp b/boost/test/utils/runtime/env/fwd.hpp
deleted file mode 100644
index 438795ea8f..0000000000
--- a/boost/test/utils/runtime/env/fwd.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : environment subsystem forward declarations
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_FWD_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_FWD_HPP
-
-#ifdef UNDER_CE
-#error Windows CE does not support environment variables.
-#endif
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-template<typename T>
-class variable;
-
-class variable_base;
-variable_base var( cstring var_name );
-
-template<typename T>
-inline variable<T>
- var( cstring var_name );
-
-namespace rt_env_detail {
-
-struct variable_data;
-
-variable_data& new_var_record( cstring var_name );
-variable_data* find_var_record( cstring var_name );
-
-cstring sys_read_var( cstring var_name );
-void sys_write_var( cstring var_name, format_stream& var_value );
-
-}
-
-template <typename T> class variable;
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_FWD_HPP
diff --git a/boost/test/utils/runtime/env/modifier.hpp b/boost/test/utils/runtime/env/modifier.hpp
deleted file mode 100644
index 536461a549..0000000000
--- a/boost/test/utils/runtime/env/modifier.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines variable modifiers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_MODIFIER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_MODIFIER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost.Test
-#include <boost/test/utils/named_params.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-// ************************************************************************** //
-// ************** environment variable modifiers ************** //
-// ************************************************************************** //
-
-namespace {
-
-nfp::typed_keyword<cstring,struct global_id_t> global_id;
-nfp::keyword<struct default_value_t> default_value;
-nfp::keyword<struct interpreter_t> interpreter;
-
-} // local namespace
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_MODIFIER_HPP
diff --git a/boost/test/utils/runtime/env/variable.hpp b/boost/test/utils/runtime/env/variable.hpp
deleted file mode 100644
index df776a619a..0000000000
--- a/boost/test/utils/runtime/env/variable.hpp
+++ /dev/null
@@ -1,223 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines model of program environment variable
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_VARIABLE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_VARIABLE_HPP
-
-#ifdef UNDER_CE
-#error Windows CE does not support environment variables.
-#endif
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-
-#include <boost/test/utils/runtime/env/fwd.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-// ************************************************************************** //
-// ************** runtime::environment::variable_data ************** //
-// ************************************************************************** //
-
-namespace rt_env_detail {
-
-struct variable_data : public runtime::parameter {
- cstring m_var_name;
- dstring m_global_id;
- argument_ptr m_value;
-};
-
-} // namespace rt_env_detail
-
-// ************************************************************************** //
-// ************** runtime::environment::variable_base ************** //
-// ************************************************************************** //
-
-class variable_base {
-public:
- explicit variable_base( rt_env_detail::variable_data& data ) : m_data( &data ) {}
-
- // arguments access
- template<typename T>
- T const& value() const
- {
- return arg_value<T>( *m_data->m_value );
- }
-
- template<typename T>
- void value( boost::optional<T>& res ) const
- {
- if( has_value() )
- res = arg_value<T>( *m_data->m_value );
- else
- res.reset();
- }
-
- bool has_value() const { return !!m_data->m_value; }
- cstring name() const { return m_data->m_var_name; }
-
-protected:
- // Data members
- rt_env_detail::variable_data* m_data;
-} ;
-
-// ************************************************************************** //
-// ************** runtime::environment::variable ************** //
-// ************************************************************************** //
-
-template<typename T = cstring>
-class variable : public variable_base {
-public:
- // Constructors
- explicit variable( cstring var_name );
-
- template<typename Modifiers>
- explicit variable( cstring var_name, Modifiers const& m );
-
- explicit variable( rt_env_detail::variable_data& data )
- : variable_base( data ) {}
-
- // other variable assignment
- void operator=( variable const& v ) { m_data = v.m_data; }
-
- // access methods
- T const& value() const { return variable_base::value<T>(); }
-
-#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) || \
- BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0593))
- template<typename T>
- void value( boost::optional<T>& res ) const { variable_base::value( res ); }
-#else
- using variable_base::value;
-#endif
-
- // Value assignment
- template<typename V>
- void operator=( V const& v )
- {
- if( !has_value() )
- m_data->m_value.reset( new typed_argument<T>( *m_data ) );
-
- arg_value<T>( *m_data->m_value ) = v;
-
- rt_env_detail::sys_write_var( m_data->m_var_name, format_stream().ref() << value() );
- }
-}; // class variable
-
-//____________________________________________________________________________//
-
-template<typename CharT, typename Tr,typename T>
-inline std::basic_ostream<CharT,Tr>&
-operator<<( std::basic_ostream<CharT,Tr>& os, variable<T> const& v )
-{
- os << v.name() << '=';
-
- if( v.has_value() )
- os << v.value();
-
- return os;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator==( variable<T> ev, V const& v )
-{
- return ev.has_value() && ev.value() == v;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator==( V const& v, variable<T> ev )
-{
- return ev.has_value() && ev.value() == v;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator!=( variable<T> ev, V const& v )
-{
- return !ev.has_value() || ev.value() != v;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator!=( V const& v, variable<T> ev )
-{
- return !ev.has_value() || ev.value() != v;
-}
-
-//____________________________________________________________________________//
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-// ************************************************************************** //
-// ************************************************************************** //
-// Implementation
-
-#include <boost/test/utils/runtime/env/environment.hpp>
-
-// ************************************************************************** //
-// ************** runtime::environment::variable ************** //
-// ************************************************************************** //
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-template<typename T>
-variable<T>::variable( cstring var_name )
-: variable_base( environment::var<T>( var_name ) )
-{}
-
-//____________________________________________________________________________//
-
-template<typename T>
-template<typename Modifiers>
-variable<T>::variable( cstring var_name, Modifiers const& m )
-: variable_base( environment::var<T>( var_name, m ) )
-{}
-
-//____________________________________________________________________________//
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_VARIABLE_HPP
diff --git a/boost/test/utils/runtime/errors.hpp b/boost/test/utils/runtime/errors.hpp
new file mode 100644
index 0000000000..c11686132c
--- /dev/null
+++ b/boost/test/utils/runtime/errors.hpp
@@ -0,0 +1,195 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : defines runtime parameters setup error
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_INIT_ERROR_HPP
+#define BOOST_TEST_UTILS_RUNTIME_INIT_ERROR_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
+
+// Boost.Test
+#include <boost/test/utils/string_cast.hpp>
+
+// Boost.Test
+#include <boost/config.hpp>
+
+// STL
+#include <exception>
+#include <vector>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** runtime::param_error ************** //
+// ************************************************************************** //
+
+class param_error : public std::exception {
+public:
+ ~param_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+ virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ return msg.c_str();
+ }
+
+ cstring param_name;
+ std::string msg;
+
+protected:
+ explicit param_error( cstring param_name_ ) : param_name( param_name_) {}
+};
+
+//____________________________________________________________________________//
+
+class init_error : public param_error {
+protected:
+ explicit init_error( cstring param_name ) : param_error( param_name ) {}
+ ~init_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+};
+
+class input_error : public param_error {
+protected:
+ explicit input_error( cstring param_name ) : param_error( param_name ) {}
+ ~input_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+};
+
+//____________________________________________________________________________//
+
+template<typename Derived, typename Base>
+class specific_param_error : public Base {
+protected:
+ explicit specific_param_error( cstring param_name ) : Base( param_name ) {}
+ ~specific_param_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+};
+
+//____________________________________________________________________________//
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<typename Derived, typename Base>
+inline Derived
+operator<<(specific_param_error<Derived, Base>&& ex, char const* val)
+{
+ ex.msg.append( val );
+
+ return reinterpret_cast<Derived&&>(ex);
+}
+
+//____________________________________________________________________________//
+
+template<typename Derived, typename Base, typename T>
+inline Derived
+operator<<(specific_param_error<Derived, Base>&& ex, T const& val)
+{
+ ex.msg.append( unit_test::utils::string_cast( val ) );
+
+ return reinterpret_cast<Derived&&>(ex);
+}
+
+//____________________________________________________________________________//
+
+#else
+
+template<typename Derived, typename Base>
+inline Derived
+operator<<(specific_param_error<Derived, Base> const& ex, char const* val)
+{
+ const_cast<specific_param_error<Derived, Base>&>(ex).msg.append( val );
+
+ return static_cast<Derived const&>(ex);
+}
+
+//____________________________________________________________________________//
+
+template<typename Derived, typename Base, typename T>
+inline Derived
+operator<<(specific_param_error<Derived, Base> const& ex, T const& val)
+{
+ const_cast<specific_param_error<Derived, Base>&>(ex).msg.append( unit_test::utils::string_cast( val ) );
+
+ return static_cast<Derived const&>(ex);
+}
+
+//____________________________________________________________________________//
+
+#endif
+
+// ************************************************************************** //
+// ************** specific exception types ************** //
+// ************************************************************************** //
+
+#define SPECIFIC_EX_TYPE( type, base ) \
+class type : public specific_param_error<type,base> { \
+public: \
+ explicit type( cstring param_name = cstring() ) \
+ : specific_param_error<type,base>( param_name ) \
+ {} \
+} \
+/**/
+
+SPECIFIC_EX_TYPE( invalid_cla_id, init_error );
+SPECIFIC_EX_TYPE( duplicate_param, init_error );
+SPECIFIC_EX_TYPE( conflicting_param, init_error );
+SPECIFIC_EX_TYPE( unknown_param, init_error );
+SPECIFIC_EX_TYPE( access_to_missing_argument, init_error );
+SPECIFIC_EX_TYPE( arg_type_mismatch, init_error );
+SPECIFIC_EX_TYPE( invalid_param_spec, init_error );
+
+SPECIFIC_EX_TYPE( format_error, input_error );
+SPECIFIC_EX_TYPE( duplicate_arg, input_error );
+SPECIFIC_EX_TYPE( missing_req_arg, input_error );
+
+#undef SPECIFIC_EX_TYPE
+
+class ambiguous_param : public specific_param_error<ambiguous_param, input_error> {
+public:
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ explicit ambiguous_param( std::vector<cstring>&& amb_candidates )
+ : specific_param_error<ambiguous_param,input_error>( "" )
+ , m_amb_candidates( std::move( amb_candidates ) ) {}
+#else
+ explicit ambiguous_param( std::vector<cstring> const& amb_candidates )
+ : specific_param_error<ambiguous_param,input_error>( "" )
+ , m_amb_candidates( amb_candidates ) {}
+#endif
+ ~ambiguous_param() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+ std::vector<cstring> m_amb_candidates;
+};
+
+class unrecognized_param : public specific_param_error<unrecognized_param, input_error> {
+public:
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ explicit unrecognized_param( std::vector<cstring>&& type_candidates )
+ : specific_param_error<unrecognized_param,input_error>( "" )
+ , m_typo_candidates( std::move( type_candidates ) ) {}
+#else
+ explicit unrecognized_param( std::vector<cstring> const& type_candidates )
+ : specific_param_error<unrecognized_param,input_error>( "" )
+ , m_typo_candidates( type_candidates ) {}
+#endif
+ ~unrecognized_param() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+ std::vector<cstring> m_typo_candidates;
+};
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_INIT_ERROR_HPP
diff --git a/boost/test/utils/runtime/file/config_file.cpp b/boost/test/utils/runtime/file/config_file.cpp
deleted file mode 100644
index 1e13d66eee..0000000000
--- a/boost/test/utils/runtime/file/config_file.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : implements models configuration file, it's parameter and parameter namespaces
-// ***************************************************************************
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/file/config_file.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-// Boost.Test
-#include <boost/test/utils/foreach.hpp>
-#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/iterator/token_iterator.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// ************************************************************************** //
-// ************** runtime::file::parameter ************** //
-// ************************************************************************** //
-
-parameter::parameter( cstring name, cstring value, param_namespace const& parent )
-: m_parent( parent )
-{
- assign_op( p_name.value, name, 0 );
- assign_op( p_value.value, value, 0 );
-}
-
-//____________________________________________________________________________//
-
-std::ostream&
-operator<<( std::ostream& os, parameter const& p )
-{
- p.m_parent.print_full_name( os );
-
- return os << p.p_name << " = \"" << p.p_value << "\"";
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::param_namespace ************** //
-// ************************************************************************** //
-
-param_namespace::param_namespace( cstring name, param_namespace const* parent )
-: p_parent( parent )
-{
- assign_op( p_name.value, name, 0 );
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::insert_param( cstring param_name, cstring param_value )
-{
- BOOST_TEST_FOREACH( parameter const&, p, m_parameters )
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( p.p_name != param_name,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Duplicate parameter " ) << param_name );
-
- m_parameters.push_back( parameter( param_name, param_value, *this ) );
-}
-
-//____________________________________________________________________________//
-
-param_namespace&
-param_namespace::subnamespace( cstring namespace_name )
-{
- BOOST_TEST_FOREACH( param_namespace&, subns, m_subnamespaces )
- if( subns.p_name == namespace_name )
- return subns;
-
- m_subnamespaces.push_back( param_namespace( namespace_name, this ) );
-
- return m_subnamespaces.back();
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::clear()
-{
- m_parameters.clear();
- m_subnamespaces.clear();
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::print_full_name( std::ostream& os ) const
-{
- if( !p_parent )
- return;
-
- p_parent.get()->print_full_name( os );
-
- os << p_name << "::";
-}
-
-//____________________________________________________________________________//
-
-boost::optional<cstring>
-get_param_value( param_namespace const& where_from,
- cstring name_part1,
- cstring name_part2,
- cstring name_part3,
- cstring name_part4,
- cstring name_part5 )
-{
- if( name_part2.is_empty() ) {
- boost::optional<cstring> res;
-
- BOOST_TEST_FOREACH( parameter const&, p, where_from ) {
- if( p.p_name == name_part1 ) {
- res = cstring( p.p_value );
- break;
- }
- }
-
- return res;
- }
-
- param_namespace const* sns = get_param_subns( where_from, name_part1 );
-
- return sns ? get_param_value( *sns, name_part2, name_part3, name_part4, name_part5 )
- : boost::optional<cstring>();
-}
-
-//____________________________________________________________________________//
-
-cstring
-get_requ_param_value( param_namespace const& where_from,
- cstring name_part1,
- cstring name_part2,
- cstring name_part3,
- cstring name_part4,
- cstring name_part5 )
-{
- boost::optional<cstring> v = get_param_value( where_from, name_part1, name_part2, name_part3, name_part4, name_part5 );
-
-#define APPEND_PART( part ) (part.is_empty() ? "" : "::") << (part.is_empty() ? cstring() : part)
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !!v, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Required parameter " )
- << name_part1
- << APPEND_PART( name_part2 )
- << APPEND_PART( name_part3 )
- << APPEND_PART( name_part4 )
- << APPEND_PART( name_part5 )
- << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " value is missing" ) );
-#undef APPEND_PART
-
- return *v;
-}
-
-//____________________________________________________________________________//
-
-param_namespace const*
-get_param_subns( param_namespace const& where_from, cstring namespace_name )
-{
- param_namespace::sub_ns_const_iterator it = where_from.sub_ns_begin();
- param_namespace::sub_ns_const_iterator end = where_from.sub_ns_end();
-
- while( it != end ) {
- if( it->p_name == namespace_name )
- return &*it;
-
- ++it;
- }
-
- return 0;
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::load_impl( config_file_iterator cf_it,
- cstring value_marker, cstring value_delimeter, cstring namespace_delimeter )
-{
- using namespace unit_test;
-
- while( cf_it != config_file_iterator() ) {
- string_token_iterator ti( *cf_it, (max_tokens = 2,kept_delimeters = dt_none, dropped_delimeters = value_delimeter) );
-
- cstring param_name = *ti;
- cstring param_value = *(++ti);
-
- param_value.trim( value_marker );
-
- param_namespace* targ_ns = this;
-
- while( !param_name.is_empty() ) {
- cstring::size_type pos = param_name.find( namespace_delimeter );
- cstring subname( param_name.begin(), pos == cstring::npos ? param_name.size() : pos );
-
- if( subname.size() == param_name.size() ) {
- targ_ns->insert_param( param_name, param_value );
- break;
- }
- else {
- targ_ns = &targ_ns->subnamespace( subname );
-
- param_name.trim_left( subname.size() + namespace_delimeter.size() );
- }
- }
- ++cf_it;
- }
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::config_file ************** //
-// ************************************************************************** //
-
-config_file::config_file()
-: param_namespace( cstring() )
-{
-}
-
-//____________________________________________________________________________//
-
-config_file::config_file( cstring file_name )
-: param_namespace( cstring() )
-{
- load( file_name );
-}
-
-//____________________________________________________________________________//
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-// EOF
diff --git a/boost/test/utils/runtime/file/config_file.hpp b/boost/test/utils/runtime/file/config_file.hpp
deleted file mode 100644
index e7baf08bf2..0000000000
--- a/boost/test/utils/runtime/file/config_file.hpp
+++ /dev/null
@@ -1,182 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines models configuration file, it's parameter and parameter namespaces
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/file/config_file_iterator.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/utils/named_params.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-
-// STL
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// ************************************************************************** //
-// ************** runtime::file::parameter ************** //
-// ************************************************************************** //
-
-class param_namespace;
-
-class parameter {
-public:
- // Constructor
- parameter( cstring name, cstring value, param_namespace const& parent );
-
- BOOST_READONLY_PROPERTY( dstring, (parameter)) p_name;
- BOOST_READONLY_PROPERTY( dstring, (parameter)) p_value;
-
- friend std::ostream& operator<<( std::ostream& os, parameter const& );
-
-private:
- // Data members
- param_namespace const& m_parent;
-};
-
-// ************************************************************************** //
-// ************** runtime::file::modifiers ************** //
-// ************************************************************************** //
-
-namespace {
-nfp::typed_keyword<cstring, struct value_marker_t> value_marker;
-nfp::typed_keyword<cstring, struct value_delimeter_t> value_delimeter;
-nfp::typed_keyword<cstring, struct namespace_delimeter_t> namespace_delimeter;
-} // local namespace
-
-// ************************************************************************** //
-// ************** runtime::file::param_namespace ************** //
-// ************************************************************************** //
-
-class param_namespace {
-public:
- typedef std::list<parameter>::iterator iterator;
- typedef std::list<parameter>::const_iterator const_iterator;
- typedef std::list<param_namespace>::iterator sub_ns_iterator;
- typedef std::list<param_namespace>::const_iterator sub_ns_const_iterator;
-
- // Public properties
- BOOST_READONLY_PROPERTY( dstring, (param_namespace)) p_name;
- unit_test::readonly_property<param_namespace const*> p_parent;
-
- void load( config_file_iterator cf_it ) { load( cf_it, nfp::no_params ); }
- template<typename Modifier>
- void load( config_file_iterator cf_it, Modifier const& m )
- {
- cstring vm = m.has( value_marker ) ? m[value_marker] : BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "\"" );
- cstring vd = m.has( value_delimeter ) ? m[value_delimeter] : BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "= \t\n\r" );
- cstring nd = m.has( namespace_delimeter ) ? m[namespace_delimeter] : BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "::" );
-
- load_impl( cf_it, vm, vd, nd );
- }
- void load( cstring file_name )
- {
- load( file_name, nfp::no_params );
- }
- template<typename Modifier>
- void load( cstring file_name, Modifier const& m )
- {
- config_file_iterator cfi( file_name, m );
-
- load( cfi, m );
- }
-
- void insert_param( cstring param_name, cstring param_value );
- param_namespace& subnamespace( cstring namespace_name ); // find and insert if not present
- void clear();
-
- iterator begin() { return m_parameters.begin(); }
- const_iterator begin() const { return m_parameters.begin(); }
-
- iterator end() { return m_parameters.end(); }
- const_iterator end() const { return m_parameters.end(); }
-
- sub_ns_iterator sub_ns_begin() { return m_subnamespaces.begin(); }
- sub_ns_const_iterator sub_ns_begin() const { return m_subnamespaces.begin(); }
-
- sub_ns_iterator sub_ns_end() { return m_subnamespaces.end(); }
- sub_ns_const_iterator sub_ns_end() const { return m_subnamespaces.end(); }
-
- void print_full_name( std::ostream& os ) const;
-
-protected:
- explicit param_namespace( cstring name, param_namespace const* parent = 0 );
-
-private:
- void load_impl( config_file_iterator cf_it,
- cstring value_marker_, cstring value_delimeter_, cstring namespace_delimeter_ );
-
- // Data members
- std::list<parameter> m_parameters;
- std::list<param_namespace> m_subnamespaces;
-};
-
-//____________________________________________________________________________//
-
-boost::optional<cstring>
-get_param_value( param_namespace const& where_from,
- cstring name_part1,
- cstring name_part2 = cstring(),
- cstring name_part3 = cstring(),
- cstring name_part4 = cstring(),
- cstring name_part5 = cstring() );
-
-//____________________________________________________________________________//
-
-cstring
-get_requ_param_value( param_namespace const& where_from,
- cstring name_part1,
- cstring name_part2 = cstring(),
- cstring name_part3 = cstring(),
- cstring name_part4 = cstring(),
- cstring name_part5 = cstring() );
-
-//____________________________________________________________________________//
-
-param_namespace const*
-get_param_subns( param_namespace const& where_from,
- cstring namespace_name );
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::config_file ************** //
-// ************************************************************************** //
-
-class config_file : public param_namespace {
-public:
- // Constructor
- config_file();
- config_file( cstring file_name );
-};
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_HPP_010105GER
diff --git a/boost/test/utils/runtime/file/config_file_iterator.cpp b/boost/test/utils/runtime/file/config_file_iterator.cpp
deleted file mode 100644
index 5d6cbdf7dc..0000000000
--- a/boost/test/utils/runtime/file/config_file_iterator.cpp
+++ /dev/null
@@ -1,685 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : flexible configuration file iterator implementation
-// ***************************************************************************
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/file/config_file_iterator.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#ifndef UNDER_CE
-#include <boost/test/utils/runtime/env/environment.hpp>
-#endif
-
-
-// Boost
-#include <boost/scoped_array.hpp>
-#include <boost/bind.hpp>
-#include <boost/noncopyable.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/compare.hpp>
-#include <boost/test/utils/algorithm.hpp>
-#include <boost/test/utils/iterator/token_iterator.hpp>
-#include <boost/test/utils/assign_op.hpp>
-
-// STL
-#include <memory>
-#include <map>
-#include <list>
-#include <vector>
-#include <fstream>
-#include <cctype>
-#include <iostream>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// ************************************************************************** //
-// ************** symbol_to_value_map ************** //
-// ************************************************************************** //
-
-template<typename ValueType>
-struct symbol_to_value_map : std::map<cstring, ValueType> {
- template<typename ParamType>
- void add( cstring name, ParamType const& value )
- {
- using namespace unit_test;
-
- m_name_store.push_back( dstring() );
-
- assign_op( m_name_store.back(), name, 0 );
- assign_op( (*this)[m_name_store.back()], value, 0 );
- }
- void remove( cstring name )
- {
- std::list<dstring>::iterator it = std::find( m_name_store.begin(), m_name_store.end(), name );
-
- m_name_store.erase( it );
-
- this->erase( name );
- }
-
-private:
- std::list<dstring> m_name_store;
-};
-
-// ************************************************************************** //
-// ************** symbol_table_t ************** //
-// ************************************************************************** //
-
-typedef symbol_to_value_map<dstring> symbol_table_t;
-
-// ************************************************************************** //
-// ************** command_handler_map ************** //
-// ************************************************************************** //
-
-typedef symbol_to_value_map<config_file_iterator::command_handler> command_handler_map;
-
-// ************************************************************************** //
-// ************** is_valid_identifier ************** //
-// ************************************************************************** //
-
-static bool
-is_valid_identifier( cstring const& source )
-{
- if( source.is_empty() )
- return false;
-
- cstring::const_iterator it = source.begin();
-
- if( !std::isalpha( *it ) )
- return false;
-
- while( ++it < source.end() ) {
- if( !std::isalnum( *it ) && *it != BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '_' ) && *it != BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '-' ) )
- return false;
- }
-
- return true;
-}
-
-// ************************************************************************** //
-// ************** include_level ************** //
-// ************************************************************************** //
-
-struct include_level;
-typedef std::auto_ptr<include_level> include_level_ptr;
-
-struct include_level : noncopyable
-{
- // Constructor
- explicit include_level( cstring file_name, cstring path_separators, include_level* parent = 0 );
-
- // Data members
- std::ifstream m_stream;
- location m_curr_location;
- include_level_ptr m_parent;
-};
-
-//____________________________________________________________________________//
-
-include_level::include_level( cstring file_name, cstring path_separators, include_level* parent_ )
-: m_parent( parent_ )
-{
- if( file_name.is_empty() )
- return;
-
- assign_op( m_curr_location.first, file_name, 0 );
- m_curr_location.second = 0;
-
- m_stream.open( m_curr_location.first.c_str() );
-
- if( !m_stream.is_open() && !!m_parent.get() ) {
- cstring parent_path = m_parent->m_curr_location.first;
- cstring::iterator it = unit_test::find_last_of( parent_path.begin(), parent_path.end(),
- path_separators.begin(),
- path_separators.end() );
-
- if( it != parent_path.end() ) {
- assign_op( m_curr_location.first, cstring( parent_path.begin(), it+1 ), 0 );
- m_curr_location.first.append( file_name.begin(), file_name.end() );
- m_stream.clear();
- m_stream.open( m_curr_location.first.c_str() );
- }
- }
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_stream.is_open(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "can't open file " ) << file_name );
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** config_file_iterator::Impl ************** //
-// ************************************************************************** //
-
-struct config_file_iterator::Impl : noncopyable {
- // Constructor
- Impl();
-
- bool get_next_line( cstring& next_line );
-
- void process_command_line( cstring line );
- void process_include( cstring line );
- void process_define( cstring line );
- void process_undef( cstring line );
- void process_ifdef( cstring line );
- void process_ifndef( cstring line );
- void process_else( cstring line );
- void process_endif( cstring line );
-
- boost::optional<cstring>
- get_macro_value( cstring macro_name, bool ignore_missing = true );
- void substitute_macros( cstring& where );
-
- bool is_active_line() { return m_inactive_ifdef_level == 0; }
-
- static bool match_front( cstring str, cstring pattern )
- {
- return str.size() >= pattern.size() && str.substr( 0, pattern.size() ) == pattern;
- }
- static bool match_back( cstring str, cstring pattern )
- {
- return str.size() >= pattern.size() && str.substr( str.size() - pattern.size() ) == pattern;
- }
-
- // Configurable parameters
- dstring m_path_separators;
- char_type m_line_delimeter;
- dstring m_sl_comment_delimeter;
- dstring m_command_delimeter;
- dstring m_line_beak;
- dstring m_macro_ref_begin;
- dstring m_macro_ref_end;
-
- dstring m_include_kw;
- dstring m_define_kw;
- dstring m_undef_kw;
- dstring m_ifdef_kw;
- dstring m_ifndef_kw;
- dstring m_else_kw;
- dstring m_endif_kw;
-
- std::size_t m_buffer_size;
-
- bool m_trim_trailing_spaces;
- bool m_trim_leading_spaces;
- bool m_skip_empty_lines;
- bool m_detect_missing_macro;
-
- // Data members
- dstring m_post_subst_line;
- scoped_array<char> m_buffer;
- include_level_ptr m_curr_level;
- symbol_table_t m_symbols_table;
- std::vector<bool> m_conditional_states;
- std::size_t m_inactive_ifdef_level;
- command_handler_map m_command_handler_map;
-};
-
-//____________________________________________________________________________//
-
-config_file_iterator::Impl::Impl()
-: m_path_separators( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "/\\" ) )
-, m_line_delimeter( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '\n' ) )
-, m_sl_comment_delimeter( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "#" ) )
-, m_command_delimeter( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "$" ) )
-, m_line_beak( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "\\" ) )
-, m_macro_ref_begin( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "$" ) )
-, m_macro_ref_end( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "$" ) )
-
-, m_include_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "include" ) )
-, m_define_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "define" ) )
-, m_undef_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "undef" ) )
-, m_ifdef_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "ifdef" ) )
-, m_ifndef_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "ifndef" ) )
-, m_else_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "else" ) )
-, m_endif_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "endif" ) )
-
-, m_buffer_size( 8192 )
-
-, m_trim_trailing_spaces( true )
-, m_trim_leading_spaces( false )
-, m_skip_empty_lines( true )
-, m_detect_missing_macro( true )
-
-, m_inactive_ifdef_level( 0 )
-{}
-
-//____________________________________________________________________________//
-
-bool
-config_file_iterator::Impl::get_next_line( cstring& line )
-{
- bool broken_line = false;
-
- line.clear();
-
- while( !m_curr_level->m_stream.eof() || !!m_curr_level->m_parent.get() ) {
- // 10. Switch to upper include level if current one is finished
- // 20. Read/append next file line
- // 30. Increment line number
- // 40. Remove comments
- // 50. Remove trailing and leading spaces
- // 60. Skip empty string
- // 70. Concatenate broken lines if needed. Put the result into line
- // 80. If line is not completed, try to finish it by reading the next line
- // 90. Process command line
- // 100. Substitute macros references with their definitions
- // 110. Next line found.
-
- if( m_curr_level->m_stream.eof() ) { // 10 //
- m_curr_level = m_curr_level->m_parent;
- continue;
- }
-
- std::ifstream& input = m_curr_level->m_stream;
- char_type* buffer_insert_pos = broken_line ? m_buffer.get() + line.size() : m_buffer.get();
-
- input.getline( buffer_insert_pos, (std::streamsize)(m_buffer_size - line.size()), // 20 //
- m_line_delimeter );
-
- cstring next_line( buffer_insert_pos,
- input.gcount() > 0
- ? buffer_insert_pos + (input.eof() ? input.gcount() : (input.gcount()-1))
- : buffer_insert_pos );
-
-
- m_curr_level->m_curr_location.second++; // 30 //
-
- cstring::size_type comment_pos = next_line.find( m_sl_comment_delimeter );
- if( comment_pos != cstring::npos )
- next_line.trim_right( next_line.begin()+comment_pos ); // 40 //
-
- if( m_trim_trailing_spaces ) // 50 //
- next_line.trim_right();
- if( m_trim_leading_spaces && !broken_line )
- next_line.trim_left();
-
- if( next_line.is_empty() ) { // 60 //
- if( m_skip_empty_lines )
- continue;
- else
- next_line.assign( buffer_insert_pos, buffer_insert_pos );
- }
-
- line = broken_line ? cstring( line.begin(), next_line.end() ) : next_line; // 70 //
-
- broken_line = match_back( line, m_line_beak );
- if( broken_line ) { // 80 //
- line.trim_right( 1 );
- continue;
- }
-
- if( match_front( line, m_command_delimeter ) ) { // 90 //
- process_command_line( line );
- continue;
- }
-
- if( !is_active_line() )
- continue;
-
- substitute_macros( line ); // 100 //
-
- return true; // 110 //
- }
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !broken_line, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "broken line is not completed" ) );
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_conditional_states.size() == 0,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "matching endif command is missing" ) );
-
- return false;
-}
-
-//____________________________________________________________________________//
-
-boost::optional<cstring>
-config_file_iterator::Impl::get_macro_value( cstring macro_name, bool ignore_missing )
-{
- symbol_table_t::const_iterator it = m_symbols_table.find( macro_name );
-
- if( it == m_symbols_table.end() ) {
- boost::optional<cstring> macro_value; // !! variable actually may have different type
-
- #ifndef UNDER_CE
- env::get( macro_name, macro_value );
- #endif
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( macro_value || ignore_missing || !m_detect_missing_macro,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Unknown macro \"" ) << macro_name << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "\"" ) );
-
- if( !macro_value ) {
- if( !ignore_missing )
- macro_value = cstring();
- }
- else
- m_symbols_table.add( macro_name, *macro_value );
-
- return macro_value;
- }
-
- return boost::optional<cstring>( cstring( it->second ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_command_line( cstring line )
-{
- line.trim_left( m_command_delimeter.size() );
-
- unit_test::string_token_iterator tit( line, unit_test::max_tokens = 2 );
-
- command_handler_map::const_iterator it = m_command_handler_map.find( *tit );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( it != m_command_handler_map.end(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Invalid command " ) << *tit );
-
- ++tit;
-
- (it->second)( *tit );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_include( cstring line )
-{
- using namespace unit_test;
-
- if( !is_active_line() )
- return;
-
- string_token_iterator tit( line, kept_delimeters = dt_none );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( tit != string_token_iterator(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "include file name missing" ) );
-
- cstring include_file_name = *tit;
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( ++tit == string_token_iterator(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "unexpected tokens at the end of include command" ) );
-
- substitute_macros( include_file_name );
-
- m_curr_level.reset( new include_level( include_file_name, m_path_separators, m_curr_level.release() ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_define( cstring line )
-{
- using namespace unit_test;
-
- if( !is_active_line() )
- return;
-
- string_token_iterator tit( line, (kept_delimeters = dt_none, max_tokens = 2 ));
-
- cstring macro_name = *tit;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- cstring macro_value = *(++tit);
- substitute_macros( macro_value );
-
- m_symbols_table.add( macro_name, macro_value );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_undef( cstring line )
-{
- if( !is_active_line() )
- return;
-
- cstring macro_name = line;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- m_symbols_table.remove( macro_name );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_ifdef( cstring line )
-{
- m_conditional_states.push_back( true );
- if( !is_active_line() )
- return;
-
- cstring macro_name = line;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- if( !get_macro_value( macro_name ) )
- m_inactive_ifdef_level = m_conditional_states.size();
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_ifndef( cstring line )
-{
- m_conditional_states.push_back( true );
- if( !is_active_line() )
- return;
-
- cstring macro_name = line;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- if( get_macro_value( macro_name ) )
- m_inactive_ifdef_level = m_conditional_states.size();
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_else( cstring line )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_conditional_states.size() > 0 && m_conditional_states.back(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "else without matching if" ) );
-
- m_inactive_ifdef_level = m_conditional_states.size() == m_inactive_ifdef_level ? 0 : m_conditional_states.size();
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( line.is_empty(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "unexpected tokens at the end of else command" ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_endif( cstring line )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_conditional_states.size() > 0, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "endif without matching if" ) );
-
- if( m_conditional_states.size() == m_inactive_ifdef_level )
- m_inactive_ifdef_level = 0;
-
- m_conditional_states.pop_back();
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( line.is_empty(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "unexpected tokens at the end of endif command" ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::substitute_macros( cstring& where )
-{
- m_post_subst_line.clear();
- cstring::size_type pos;
-
- while( (pos = where.find( m_macro_ref_begin )) != cstring::npos ) {
- m_post_subst_line.append( where.begin(), pos );
-
- where.trim_left( where.begin() + pos + m_macro_ref_begin.size() );
-
- pos = where.find( m_macro_ref_end );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( pos != cstring::npos, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "incomplete macro reference" ) );
-
- cstring value = *get_macro_value( where.substr( 0, pos ), false );
- m_post_subst_line.append( value.begin(), value.size() );
-
- where.trim_left( where.begin() + pos + m_macro_ref_end.size() );
- }
-
- if( !m_post_subst_line.empty() ) {
- m_post_subst_line.append( where.begin(), where.size() );
- where = m_post_subst_line;
- }
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::config_file_iterator ************** //
-// ************************************************************************** //
-
-void
-config_file_iterator::construct()
-{
- m_pimpl.reset( new Impl );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::load( cstring file_name )
-{
- m_pimpl->m_curr_level.reset( new include_level( file_name, m_pimpl->m_path_separators ) );
- m_pimpl->m_buffer.reset( new char[m_pimpl->m_buffer_size] );
-
- register_command_handler( m_pimpl->m_include_kw, boost::bind( &Impl::process_include, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_define_kw, boost::bind( &Impl::process_define, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_undef_kw, boost::bind( &Impl::process_undef, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_ifdef_kw, boost::bind( &Impl::process_ifdef, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_ifndef_kw, boost::bind( &Impl::process_ifndef, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_else_kw, boost::bind( &Impl::process_else, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_endif_kw, boost::bind( &Impl::process_endif, m_pimpl.get(), _1 ) );
-
- init();
-}
-
-//____________________________________________________________________________//
-
-location const&
-config_file_iterator::curr_location()
-{
- return m_pimpl->m_curr_level->m_curr_location;
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::register_command_handler( cstring command_kw, command_handler const& ch )
-{
- m_pimpl->m_command_handler_map.add( command_kw, ch );
-}
-
-//____________________________________________________________________________//
-
-bool
-config_file_iterator::get()
-{
- return m_pimpl->get_next_line( m_value );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, cstring value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::path_separators_t )
- assign_op( m_pimpl->m_path_separators , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::sl_comment_delimeter_t )
- assign_op( m_pimpl->m_sl_comment_delimeter , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::command_delimeter_t )
- assign_op( m_pimpl->m_command_delimeter , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::line_beak_t )
- assign_op( m_pimpl->m_line_beak , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::macro_ref_begin_t )
- assign_op( m_pimpl->m_macro_ref_begin , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::macro_ref_end_t )
- assign_op( m_pimpl->m_macro_ref_end , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::include_kw_t )
- assign_op( m_pimpl->m_include_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::define_kw_t )
- assign_op( m_pimpl->m_define_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::undef_kw_t )
- assign_op( m_pimpl->m_undef_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::ifdef_kw_t )
- assign_op( m_pimpl->m_ifdef_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::ifndef_kw_t )
- assign_op( m_pimpl->m_ifndef_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::else_kw_t )
- assign_op( m_pimpl->m_else_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::endif_kw_t )
- assign_op( m_pimpl->m_endif_kw , value, 0 );
- }
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, bool value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::trim_leading_spaces_t )
- m_pimpl->m_trim_leading_spaces = value;
- BOOST_RTTI_CASE( cfg_detail::trim_trailing_spaces_t )
- m_pimpl->m_trim_trailing_spaces = value;
- BOOST_RTTI_CASE( cfg_detail::skip_empty_lines_t )
- m_pimpl->m_skip_empty_lines = value;
- BOOST_RTTI_CASE( cfg_detail::detect_missing_macro_t )
- m_pimpl->m_detect_missing_macro = value;
- }
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, char_type value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::line_delimeter_t )
- m_pimpl->m_line_delimeter = value;
- }
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, std::size_t value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::buffer_size_t )
- m_pimpl->m_buffer_size = value;
- }
-}
-
-//____________________________________________________________________________//
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-// EOF
diff --git a/boost/test/utils/runtime/file/config_file_iterator.hpp b/boost/test/utils/runtime/file/config_file_iterator.hpp
deleted file mode 100644
index 6c6273fca1..0000000000
--- a/boost/test/utils/runtime/file/config_file_iterator.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Use, modification, and distribution are subject to the
-// Boost Software License, Version 1.0. (See accompanying file
-// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : flexible configuration file iterator definition
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_ITERATOR_HPP
-#define BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_ITERATOR_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-
-// Boost.Test
-#include <boost/test/utils/iterator/input_iterator_facade.hpp>
-#include <boost/test/utils/named_params.hpp>
-
-// Boost
-#include <boost/shared_ptr.hpp>
-#include <boost/function.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// Public typedef
-typedef std::pair<dstring,long> location;
-
-// ************************************************************************** //
-// ************** modifiers ************** //
-// ************************************************************************** //
-
-namespace cfg_detail {
- struct path_separators_t;
- struct line_delimeter_t;
- struct sl_comment_delimeter_t;
- struct command_delimeter_t;
- struct line_beak_t;
- struct macro_ref_begin_t;
- struct macro_ref_end_t;
- struct include_kw_t;
- struct define_kw_t;
- struct undef_kw_t;
- struct ifdef_kw_t;
- struct ifndef_kw_t;
- struct else_kw_t;
- struct endif_kw_t;
-
- struct buffer_size_t;
-
- struct trim_leading_spaces_t;
- struct trim_trailing_spaces_t;
- struct skip_empty_lines_t;
- struct detect_missing_macro_t;
-} // namespace cfg_detail
-
-namespace {
-
-nfp::typed_keyword<cstring,cfg_detail::path_separators_t> path_separators;
-nfp::typed_keyword<char_type ,cfg_detail::line_delimeter_t> line_delimeter;
-nfp::typed_keyword<cstring,cfg_detail::sl_comment_delimeter_t> single_line_comment_delimeter;
-nfp::typed_keyword<cstring,cfg_detail::command_delimeter_t> command_delimeter;
-nfp::typed_keyword<cstring,cfg_detail::line_beak_t> line_beak;
-nfp::typed_keyword<cstring,cfg_detail::macro_ref_begin_t> macro_ref_begin;
-nfp::typed_keyword<cstring,cfg_detail::macro_ref_end_t> macro_ref_end;
-nfp::typed_keyword<cstring,cfg_detail::include_kw_t> include_kw;
-nfp::typed_keyword<cstring,cfg_detail::define_kw_t> define_kw;
-nfp::typed_keyword<cstring,cfg_detail::undef_kw_t> undef_kw;
-nfp::typed_keyword<cstring,cfg_detail::ifdef_kw_t> ifdef_kw;
-nfp::typed_keyword<cstring,cfg_detail::ifndef_kw_t> ifndef_kw;
-nfp::typed_keyword<cstring,cfg_detail::else_kw_t> else_kw;
-nfp::typed_keyword<cstring,cfg_detail::endif_kw_t> endif_kw;
-
-nfp::typed_keyword<std::size_t,cfg_detail::buffer_size_t> buffer_size;
-
-nfp::typed_keyword<bool,cfg_detail::trim_leading_spaces_t> trim_leading_spaces;
-nfp::typed_keyword<bool,cfg_detail::trim_trailing_spaces_t> trim_trailing_spaces;
-nfp::typed_keyword<bool,cfg_detail::skip_empty_lines_t> skip_empty_lines;
-nfp::typed_keyword<bool,cfg_detail::detect_missing_macro_t> detect_missing_macro;
-
-} // local namespace
-
-// ************************************************************************** //
-// ************** runtime::file::config_file_iterator ************** //
-// ************************************************************************** //
-
-class config_file_iterator : public unit_test::input_iterator_facade<config_file_iterator,cstring,cstring> {
- typedef unit_test::input_iterator_facade<config_file_iterator,cstring,cstring> base;
-public:
- // Public typedefs
- typedef boost::function<void (cstring)> command_handler;
-
- // Constructors
- config_file_iterator() {}
- explicit config_file_iterator( cstring file_name )
- {
- construct();
- load( file_name );
- }
- template<typename Modifiers>
- config_file_iterator( cstring file_name, Modifiers const& m )
- {
- construct();
- m.apply_to( *this );
- load( file_name );
- }
- config_file_iterator( config_file_iterator const& rhs )
- : base( rhs )
- , m_pimpl( rhs.m_pimpl )
- {
- rhs.m_valid = false;
- }
-
- void operator=( config_file_iterator const& rhs )
- {
- if( this == &rhs )
- return;
-
- (base&)(*this) = rhs;
- m_pimpl = rhs.m_pimpl;
- rhs.m_valid = false;
- } // Assignment
-
-
- // Access methods
- location const& curr_location();
- void register_command_handler( cstring command_kw, command_handler const& );
-
- // Parameters setters
- void set_parameter( rtti::id_t, cstring );
- void set_parameter( rtti::id_t, bool );
- void set_parameter( rtti::id_t, char_type );
- void set_parameter( rtti::id_t, std::size_t );
-
-private:
- friend class unit_test::input_iterator_core_access;
-
- void construct();
- void load( cstring file_name );
-
- // increment implementation
- bool get();
-
- // Data members
- struct Impl;
- shared_ptr<Impl> m_pimpl;
-};
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_ITERATOR_HPP
diff --git a/boost/test/utils/runtime/finalize.hpp b/boost/test/utils/runtime/finalize.hpp
new file mode 100644
index 0000000000..181428550c
--- /dev/null
+++ b/boost/test/utils/runtime/finalize.hpp
@@ -0,0 +1,56 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : runtime parameters initialization final step
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_FINALIZE_HPP
+#define BOOST_TEST_UTILS_RUNTIME_FINALIZE_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/parameter.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+
+// Boost.Test
+#include <boost/test/utils/foreach.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+inline void
+finalize_arguments( parameters_store const& params, runtime::arguments_store& args )
+{
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, params.all() ) {
+ basic_param_ptr param = v.second;
+
+ if( !args.has( param->p_name ) ) {
+ if( param->p_has_default_value )
+ param->produce_default( args );
+
+ if( !args.has( param->p_name ) ) {
+ BOOST_TEST_I_ASSRT( param->p_optional,
+ missing_req_arg( param->p_name ) << "Missing argument for required parameter " << param->p_name << "." );
+ }
+ }
+
+ if( args.has( param->p_name ) && !!param->p_callback )
+ param->p_callback( param->p_name );
+ }
+}
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_FINALIZE_HPP
diff --git a/boost/test/utils/runtime/fwd.hpp b/boost/test/utils/runtime/fwd.hpp
index 2647184c5d..17ae881222 100644
--- a/boost/test/utils/runtime/fwd.hpp
+++ b/boost/test/utils/runtime/fwd.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -9,33 +9,37 @@
//
// Version : $Revision$
//
-// Description : global framework level forward declaration
+// Description : runtime parameters forward declaration
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_RUNTIME_FWD_HPP
#define BOOST_TEST_UTILS_RUNTIME_FWD_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test
+#include <boost/test/detail/config.hpp>
+#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
+#include <boost/test/utils/basic_cstring/io.hpp> // operator<<(boost::runtime::cstring)
// Boost
#include <boost/shared_ptr.hpp>
-namespace boost {
+// STL
+#include <map>
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+namespace boost {
+namespace runtime {
-class parameter;
+typedef unit_test::const_string cstring;
class argument;
typedef shared_ptr<argument> argument_ptr;
-typedef shared_ptr<argument const> const_argument_ptr;
-template<typename T> class value_interpreter;
template<typename T> class typed_argument;
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+class basic_param;
+typedef shared_ptr<basic_param> basic_param_ptr;
+} // namespace runtime
} // namespace boost
#endif // BOOST_TEST_UTILS_RUNTIME_FWD_HPP
diff --git a/boost/test/utils/runtime/interpret_argument_value.hpp b/boost/test/utils/runtime/interpret_argument_value.hpp
deleted file mode 100644
index 016caa017f..0000000000
--- a/boost/test/utils/runtime/interpret_argument_value.hpp
+++ /dev/null
@@ -1,163 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : default algorithms for string to specific type convertions
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_INTERPRET_ARGUMENT_VALUE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_INTERPRET_ARGUMENT_VALUE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/trace.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/basic_cstring/compare.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-#include <boost/lexical_cast.hpp>
-
-// STL
-// !! could we eliminate these includes?
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::interpret_argument_value ************** //
-// ************************************************************************** //
-// returns true if source is used false otherwise
-
-// generic case
-template<typename T>
-struct interpret_argument_value_impl {
- static bool _( cstring source, boost::optional<T>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<" << typeid(T).name() << ">" );
-
- res = lexical_cast<T>( source );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "String " << source << " is interpreted as " << *res );
- return true;
- }
-};
-
-
-//____________________________________________________________________________//
-
-// dstring case
-template<>
-struct interpret_argument_value_impl<dstring> {
- static bool _( cstring source, boost::optional<dstring>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<dstring>" );
-
- res = dstring();
- assign_op( *res, source, 0 );
-
- return true;
- }
-};
-
-//____________________________________________________________________________//
-
-// cstring case
-template<>
-struct interpret_argument_value_impl<cstring> {
- static bool _( cstring source, boost::optional<cstring>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<cstring>" );
-
- res = source;
-
- return true;
- }
-};
-
-//____________________________________________________________________________//
-
-// specialization for type bool
-template<>
-struct interpret_argument_value_impl<bool> {
- static bool _( cstring source, boost::optional<bool>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<bool>" );
-
- static literal_cstring YES( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "YES" ) );
- static literal_cstring Y( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "Y" ) );
- static literal_cstring NO( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "NO" ) );
- static literal_cstring N( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "N" ) );
- static literal_cstring one( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "1" ) );
- static literal_cstring zero( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "0" ) );
-
- source.trim();
-
- if( case_ins_eq( source, YES ) || case_ins_eq( source, Y ) || case_ins_eq( source, one ) ) {
- res = true;
- return true;
- }
- else if( case_ins_eq( source, NO ) || case_ins_eq( source, N ) || case_ins_eq( source, zero ) ) {
- res = false;
- return true;
- }
- else {
- res = true;
- return source.is_empty();
- }
- }
-};
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline bool
-interpret_argument_value( cstring source, boost::optional<T>& res, long )
-{
- return interpret_argument_value_impl<T>::_( source, res );
-}
-
-//____________________________________________________________________________//
-
-// specialization for list of values
-template<typename T>
-inline bool
-interpret_argument_value( cstring source, boost::optional<std::list<T> >& res, int )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value<std::list<T>>" );
-
- res = std::list<T>();
-
- while( !source.is_empty() ) {
- // !! should we use token_iterator
- cstring::iterator single_value_end = std::find( source.begin(), source.end(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ',' ) );
-
- boost::optional<T> value;
- interpret_argument_value( cstring( source.begin(), single_value_end ), value, 0 );
-
- res->push_back( *value );
-
- source.trim_left( single_value_end + 1 );
- }
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_INTERPRET_ARGUMENT_VALUE_HPP
diff --git a/boost/test/utils/runtime/modifier.hpp b/boost/test/utils/runtime/modifier.hpp
new file mode 100644
index 0000000000..ed77ca0afe
--- /dev/null
+++ b/boost/test/utils/runtime/modifier.hpp
@@ -0,0 +1,101 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Use, modification, and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : parameter modifiers
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_MODIFIER_HPP
+#define BOOST_TEST_UTILS_RUNTIME_MODIFIER_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
+
+// Boost.Test
+#include <boost/test/utils/named_params.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** environment variable modifiers ************** //
+// ************************************************************************** //
+
+namespace {
+
+#if !defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+#define BOOST_TEST_CLA_NEW_API
+#endif
+
+#ifdef BOOST_TEST_CLA_NEW_API
+auto const& description = unit_test::static_constant<nfp::typed_keyword<cstring,struct description_t>>::value;
+auto const& help = unit_test::static_constant<nfp::typed_keyword<cstring,struct help_t>>::value;
+auto const& env_var = unit_test::static_constant<nfp::typed_keyword<cstring,struct env_var_t>>::value;
+auto const& end_of_params = unit_test::static_constant<nfp::typed_keyword<cstring,struct end_of_params_t>>::value;
+auto const& negation_prefix = unit_test::static_constant<nfp::typed_keyword<cstring,struct neg_prefix_t>>::value;
+auto const& value_hint = unit_test::static_constant<nfp::typed_keyword<cstring,struct value_hint_t>>::value;
+auto const& optional_value = unit_test::static_constant<nfp::keyword<struct optional_value_t>>::value;
+auto const& default_value = unit_test::static_constant<nfp::keyword<struct default_value_t>>::value;
+auto const& callback = unit_test::static_constant<nfp::keyword<struct callback_t>>::value;
+
+template<typename EnumType>
+using enum_values = unit_test::static_constant<
+ nfp::typed_keyword<std::initializer_list<std::pair<const cstring,EnumType>>, struct enum_values_t>
+>;
+
+#else
+
+nfp::typed_keyword<cstring,struct description_t> description;
+nfp::typed_keyword<cstring,struct help_t> help;
+nfp::typed_keyword<cstring,struct env_var_t> env_var;
+nfp::typed_keyword<cstring,struct end_of_params_t> end_of_params;
+nfp::typed_keyword<cstring,struct neg_prefix_t> negation_prefix;
+nfp::typed_keyword<cstring,struct value_hint_t> value_hint;
+nfp::keyword<struct optional_value_t> optional_value;
+nfp::keyword<struct default_value_t> default_value;
+nfp::keyword<struct callback_t> callback;
+
+template<typename EnumType>
+struct enum_values_list {
+ typedef std::pair<cstring,EnumType> ElemT;
+ typedef std::vector<ElemT> ValuesT;
+
+ enum_values_list const&
+ operator()( cstring k, EnumType v ) const
+ {
+ const_cast<enum_values_list*>(this)->m_values.push_back( ElemT( k, v ) );
+
+ return *this;
+ }
+
+ operator ValuesT const&() const { return m_values; }
+
+private:
+ ValuesT m_values;
+};
+
+template<typename EnumType>
+struct enum_values : unit_test::static_constant<
+ nfp::typed_keyword<enum_values_list<EnumType>, struct enum_values_t> >
+{
+};
+
+#endif
+
+} // local namespace
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_MODIFIER_HPP
diff --git a/boost/test/utils/runtime/parameter.hpp b/boost/test/utils/runtime/parameter.hpp
index 2dd4ba725c..c198688493 100644
--- a/boost/test/utils/runtime/parameter.hpp
+++ b/boost/test/utils/runtime/parameter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -9,30 +9,464 @@
//
// Version : $Revision$
//
-// Description : abstract interface for the formal parameter
+// Description : formal parameter definition
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_RUNTIME_PARAMETER_HPP
#define BOOST_TEST_UTILS_RUNTIME_PARAMETER_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
+#include <boost/test/utils/runtime/modifier.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+#include <boost/test/utils/runtime/argument_factory.hpp>
+
+// Boost.Test
+#include <boost/test/utils/class_properties.hpp>
+#include <boost/test/utils/foreach.hpp>
+
+// Boost
+#include <boost/function/function2.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+
+// STL
+#include <algorithm>
+
+#include <boost/test/detail/suppress_warnings.hpp>
namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** runtime::parameter_cla_id ************** //
+// ************************************************************************** //
+// set of attributes identifying the parameter in the command line
+
+struct parameter_cla_id {
+ parameter_cla_id( cstring prefix, cstring tag, cstring value_separator, bool negatable )
+ : m_prefix( prefix.begin(), prefix.size() )
+ , m_tag( tag.begin(), tag.size() )
+ , m_value_separator( value_separator.begin(), value_separator.size() )
+ , m_negatable( negatable )
+ {
+
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_prefix.begin(), m_prefix.end(), valid_prefix_char ),
+ invalid_cla_id() << "Parameter " << m_tag
+ << " has invalid characters in prefix." );
+
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_tag.begin(), m_tag.end(), valid_name_char ),
+ invalid_cla_id() << "Parameter " << m_tag
+ << " has invalid characters in name." );
+
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_value_separator.begin(), m_value_separator.end(), valid_separator_char ),
+ invalid_cla_id() << "Parameter " << m_tag
+ << " has invalid characters in value separator." );
+ }
+
+ static bool valid_prefix_char( char c )
+ {
+ return c == '-' || c == '/' ;
+ }
+ static bool valid_separator_char( char c )
+ {
+ return c == '=' || c == ':' || c == ' ' || c == '\0';
+ }
+ static bool valid_name_char( char c )
+ {
+ return std::isalnum( c ) || c == '+' || c == '_' || c == '?';
+ }
+
+ std::string m_prefix;
+ std::string m_tag;
+ std::string m_value_separator;
+ bool m_negatable;
+};
+
+typedef std::vector<parameter_cla_id> param_cla_ids;
+
+// ************************************************************************** //
+// ************** runtime::basic_param ************** //
+// ************************************************************************** //
+
+cstring const help_prefix("////");
+
+class basic_param {
+ typedef function<void (cstring)> callback_type;
+ typedef unit_test::readwrite_property<bool> bool_property;
+
+protected:
+ /// Constructor with modifiers
+ template<typename Modifiers>
+ basic_param( cstring name, bool is_optional, bool is_repeatable, Modifiers const& m )
+ : p_name( name.begin(), name.end() )
+ , p_description( nfp::opt_get( m, description, std::string() ) )
+ , p_help( nfp::opt_get( m, runtime::help, std::string() ) )
+ , p_env_var( nfp::opt_get( m, env_var, std::string() ) )
+ , p_value_hint( nfp::opt_get( m, value_hint, std::string() ) )
+ , p_optional( is_optional )
+ , p_repeatable( is_repeatable )
+ , p_has_optional_value( m.has( optional_value ) )
+ , p_has_default_value( m.has( default_value ) || is_repeatable )
+ , p_callback( nfp::opt_get( m, callback, callback_type() ) )
+ {
+ add_cla_id( help_prefix, name, ":" );
+ }
+
+public:
+ virtual ~basic_param() {}
+
+ // Pubic properties
+ std::string const p_name;
+ std::string const p_description;
+ std::string const p_help;
+ std::string const p_env_var;
+ std::string const p_value_hint;
+ bool const p_optional;
+ bool const p_repeatable;
+ bool_property p_has_optional_value;
+ bool_property p_has_default_value;
+ callback_type const p_callback;
+
+ /// interface for cloning typed parameters
+ virtual basic_param_ptr clone() const = 0;
+
+ /// Access methods
+ param_cla_ids const& cla_ids() const { return m_cla_ids; }
+ void add_cla_id( cstring prefix, cstring tag, cstring value_separator )
+ {
+ add_cla_id_impl( prefix, tag, value_separator, false, true );
+ }
+
+ /// interface for producing argument values for this parameter
+ virtual void produce_argument( cstring token, bool negative_form, arguments_store& store ) const = 0;
+ virtual void produce_default( arguments_store& store ) const = 0;
+
+ /// interfaces for help message reporting
+ virtual void usage( std::ostream& ostr, cstring negation_prefix_ )
+ {
+ ostr << "Parameter: " << p_name << '\n';
+ if( !p_description.empty() )
+ ostr << ' ' << p_description << '\n';
+
+ ostr << " Command line formats:\n";
+ BOOST_TEST_FOREACH( parameter_cla_id const&, id, cla_ids() ) {
+ if( id.m_prefix == help_prefix )
+ continue;
+
+ ostr << " " << id.m_prefix;
+ if( id.m_negatable )
+ cla_name_help( ostr, id.m_tag, negation_prefix_ );
+ else
+ cla_name_help( ostr, id.m_tag, "" );
+
+ bool optional_value_ = false;
+
+ if( p_has_optional_value ) {
+ optional_value_ = true;
+ ostr << '[';
+ }
+
+ if( id.m_value_separator.empty() )
+ ostr << ' ';
+ else {
+ ostr << id.m_value_separator;
+ }
+
+ value_help( ostr );
+
+ if( optional_value_ )
+ ostr << ']';
+
+ ostr << '\n';
+ }
+ if( !p_env_var.empty() )
+ ostr << " Environment variable: " << p_env_var << '\n';
+ }
+
+ virtual void help( std::ostream& ostr, cstring negation_prefix_ )
+ {
+ usage( ostr, negation_prefix_ );
+
+ if( !p_help.empty() )
+ ostr << '\n' << p_help << '\n';
+ }
+
+protected:
+ void add_cla_id_impl( cstring prefix,
+ cstring tag,
+ cstring value_separator,
+ bool negatable,
+ bool validate_value_separator )
+ {
+ BOOST_TEST_I_ASSRT( !tag.is_empty(),
+ invalid_cla_id() << "Parameter can't have an empty name." );
+
+ BOOST_TEST_I_ASSRT( !prefix.is_empty(),
+ invalid_cla_id() << "Parameter " << tag
+ << " can't have an empty prefix." );
+
+ BOOST_TEST_I_ASSRT( !value_separator.is_empty(),
+ invalid_cla_id() << "Parameter " << tag
+ << " can't have an empty value separator." );
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+ // We trim value separator from all the spaces, so token end will indicate separator
+ value_separator.trim();
+ BOOST_TEST_I_ASSRT( !validate_value_separator || !value_separator.is_empty() || !p_has_optional_value,
+ invalid_cla_id() << "Parameter " << tag
+ << " with optional value attribute can't use space as value separator." );
+
+ m_cla_ids.push_back( parameter_cla_id( prefix, tag, value_separator, negatable ) );
+ }
+
+private:
+ /// interface for usage/help customization
+ virtual void cla_name_help( std::ostream& ostr, cstring cla_tag, cstring negation_prefix_ ) const
+ {
+ ostr << cla_tag;
+ }
+ virtual void value_help( std::ostream& ostr ) const
+ {
+ if( p_value_hint.empty() )
+ ostr << "<value>";
+ else
+ ostr << p_value_hint;
+ }
+
+ // Data members
+ param_cla_ids m_cla_ids;
+};
// ************************************************************************** //
// ************** runtime::parameter ************** //
// ************************************************************************** //
-class parameter {
+enum args_amount {
+ OPTIONAL_PARAM, // 0-1
+ REQUIRED_PARAM, // exactly 1
+ REPEATABLE_PARAM // 0-N
+};
+
+//____________________________________________________________________________//
+
+template<typename ValueType, args_amount a = runtime::OPTIONAL_PARAM, bool is_enum = false>
+class parameter : public basic_param {
public:
- virtual ~parameter() {}
+ /// Constructor with modifiers
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ parameter( cstring name, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ parameter( cstring name, Modifiers const& m )
+#endif
+ : basic_param( name, a != runtime::REQUIRED_PARAM, a == runtime::REPEATABLE_PARAM, m )
+ , m_arg_factory( m )
+ {
+ BOOST_TEST_I_ASSRT( !m.has( default_value ) || a == runtime::OPTIONAL_PARAM,
+ invalid_param_spec() << "Parameter " << name
+ << " is not optional and can't have default_value." );
+
+ BOOST_TEST_I_ASSRT( !m.has( optional_value ) || !this->p_repeatable,
+ invalid_param_spec() << "Parameter " << name
+ << " is repeatable and can't have optional_value." );
+ }
+
+private:
+ virtual basic_param_ptr clone() const
+ {
+ return basic_param_ptr( new parameter( *this ) );
+ }
+ virtual void produce_argument( cstring token, bool , arguments_store& store ) const
+ {
+ m_arg_factory.produce_argument( token, this->p_name, store );
+ }
+ virtual void produce_default( arguments_store& store ) const
+ {
+ if( !this->p_has_default_value )
+ return;
+
+ m_arg_factory.produce_default( this->p_name, store );
+ }
+
+ // Data members
+ typedef argument_factory<ValueType, is_enum, a == runtime::REPEATABLE_PARAM> factory_t;
+ factory_t m_arg_factory;
+};
+
+//____________________________________________________________________________//
+
+class option : public basic_param {
+public:
+ /// Constructor with modifiers
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ option( cstring name, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ option( cstring name, Modifiers const& m )
+#endif
+ : basic_param( name, true, false, nfp::opt_append( nfp::opt_append( m, optional_value = true), default_value = false) )
+ , m_arg_factory( nfp::opt_append( nfp::opt_append( m, optional_value = true), default_value = false) )
+ {
+ }
+
+ void add_cla_id( cstring prefix, cstring tag, cstring value_separator, bool negatable = false )
+ {
+ add_cla_id_impl( prefix, tag, value_separator, negatable, false );
+ }
+
+private:
+ virtual basic_param_ptr clone() const
+ {
+ return basic_param_ptr( new option( *this ) );
+ }
+
+ virtual void produce_argument( cstring token, bool negative_form, arguments_store& store ) const
+ {
+ if( token.empty() )
+ store.set( p_name, !negative_form );
+ else {
+ BOOST_TEST_I_ASSRT( !negative_form,
+ format_error( p_name ) << "Can't set value to negative form of the argument." );
+
+ m_arg_factory.produce_argument( token, p_name, store );
+ }
+ }
+
+ virtual void produce_default( arguments_store& store ) const
+ {
+ m_arg_factory.produce_default( p_name, store );
+ }
+ virtual void cla_name_help( std::ostream& ostr, cstring cla_tag, cstring negation_prefix_ ) const
+ {
+ if( negation_prefix_.is_empty() )
+ ostr << cla_tag;
+ else
+ ostr << '[' << negation_prefix_ << ']' << cla_tag;
+ }
+ virtual void value_help( std::ostream& ostr ) const
+ {
+ if( p_value_hint.empty() )
+ ostr << "<boolean value>";
+ else
+ ostr << p_value_hint;
+ }
+
+ // Data members
+ typedef argument_factory<bool, false, false> factory_t;
+ factory_t m_arg_factory;
};
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+//____________________________________________________________________________//
+template<typename EnumType, args_amount a = runtime::OPTIONAL_PARAM>
+class enum_parameter : public parameter<EnumType, a, true> {
+ typedef parameter<EnumType, a, true> base;
+public:
+ /// Constructor with modifiers
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ enum_parameter( cstring name, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ enum_parameter( cstring name, Modifiers const& m )
+#endif
+ : base( name, m )
+ {
+#ifdef BOOST_TEST_CLA_NEW_API
+ auto const& values = m[enum_values<EnumType>::value];
+ auto it = values.begin();
+#else
+ std::vector<std::pair<cstring, EnumType> > const& values = m[enum_values<EnumType>::value];
+ typename std::vector<std::pair<cstring, EnumType> >::const_iterator it = values.begin();
+#endif
+ while( it != values.end() ) {
+ m_valid_names.push_back( it->first );
+ ++it;
+ }
+ }
+
+private:
+ virtual basic_param_ptr clone() const
+ {
+ return basic_param_ptr( new enum_parameter( *this ) );
+ }
+
+ virtual void value_help( std::ostream& ostr ) const
+ {
+ if( this->p_value_hint.empty() ) {
+ ostr << "<";
+ bool first = true;
+ BOOST_TEST_FOREACH( cstring, name, m_valid_names ) {
+ if( first )
+ first = false;
+ else
+ ostr << '|';
+ ostr << name;
+ }
+ ostr << ">";
+ }
+ else
+ ostr << this->p_value_hint;
+ }
+
+ // Data members
+ std::vector<cstring> m_valid_names;
+};
+
+
+// ************************************************************************** //
+// ************** runtime::parameters_store ************** //
+// ************************************************************************** //
+
+class parameters_store {
+ struct lg_compare {
+ bool operator()( cstring lh, cstring rh ) const
+ {
+ return std::lexicographical_compare(lh.begin(), lh.end(),
+ rh.begin(), rh.end());
+ }
+ };
+public:
+
+ typedef std::map<cstring, basic_param_ptr, lg_compare> storage_type;
+
+ /// Adds parameter into the persistent store
+ void add( basic_param const& in )
+ {
+ basic_param_ptr p = in.clone();
+
+ BOOST_TEST_I_ASSRT( m_parameters.insert( std::make_pair( cstring(p->p_name), p ) ).second,
+ duplicate_param() << "Parameter " << p->p_name << " is duplicate." );
+ }
+
+ /// Returns true if there is no parameters registered
+ bool is_empty() const { return m_parameters.empty(); }
+ /// Returns map of all the registered parameter
+ storage_type const& all() const { return m_parameters; }
+ /// Returns true if parameter with psecified name is registered
+ bool has( cstring name ) const
+ {
+ return m_parameters.find( name ) != m_parameters.end();
+ }
+ /// Returns map of all the registered parameter
+ basic_param_ptr get( cstring name ) const
+ {
+ storage_type::const_iterator const& found = m_parameters.find( name );
+ BOOST_TEST_I_ASSRT( found != m_parameters.end(),
+ unknown_param() << "Parameter " << name << " is unknown." );
+
+ return found->second;
+ }
+
+private:
+ // Data members
+ storage_type m_parameters;
+};
+
+} // namespace runtime
} // namespace boost
+#include <boost/test/detail/enable_warnings.hpp>
+
#endif // BOOST_TEST_UTILS_RUNTIME_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/trace.hpp b/boost/test/utils/runtime/trace.hpp
deleted file mode 100644
index 17a169b283..0000000000
--- a/boost/test/utils/runtime/trace.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : optional internal tracing
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_TRACE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_TRACE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#ifdef BOOST_TEST_UTILS_RUNTIME_PARAM_DEBUG
-
-#include <iostream>
-
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( str ) std::cerr << str << std::endl
-#else
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( str )
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_TRACE_HPP
diff --git a/boost/test/utils/runtime/validation.hpp b/boost/test/utils/runtime/validation.hpp
deleted file mode 100644
index 54163dc6a6..0000000000
--- a/boost/test/utils/runtime/validation.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// See http://www.boost.org/libs/test for the library home page.
-//
-// File : $RCSfile$
-//
-// Version : $Revision$
-//
-// Description : defines exceptions and validation tools
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_VALIDATION_HPP
-#define BOOST_TEST_UTILS_RUNTIME_VALIDATION_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/detail/throw_exception.hpp>
-
-// Boost
-#include <boost/shared_ptr.hpp>
-
-// STL
-#ifdef BOOST_TEST_UTILS_RUNTIME_PARAM_EXCEPTION_INHERIT_STD
-#include <stdexcept>
-#endif
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::logic_error ************** //
-// ************************************************************************** //
-
-class logic_error
-#ifdef BOOST_TEST_UTILS_RUNTIME_PARAM_EXCEPTION_INHERIT_STD
-: public std::exception
-#endif
-{
- typedef shared_ptr<dstring> dstring_ptr;
-public:
- // Constructor // !! could we eliminate shared_ptr
- explicit logic_error( cstring msg ) : m_msg( new dstring( msg.begin(), msg.size() ) ) {}
- ~logic_error() BOOST_NOEXCEPT_OR_NOTHROW
- {}
-
- dstring const& msg() const { return *m_msg; }
- virtual char_type const* what() const BOOST_NOEXCEPT_OR_NOTHROW
- { return m_msg->c_str(); }
-
-private:
- dstring_ptr m_msg;
-};
-
-// ************************************************************************** //
-// ************** runtime::report_logic_error ************** //
-// ************************************************************************** //
-
-inline void
-report_logic_error( format_stream& msg )
-{
- BOOST_TEST_IMPL_THROW( BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::logic_error( msg.str() ) );
-}
-
-//____________________________________________________________________________//
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_REPORT_LOGIC_ERROR( msg ) \
- boost::BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::report_logic_error( format_stream().ref() << msg )
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( b, msg ) \
- if( b ) {} else BOOST_TEST_UTILS_RUNTIME_PARAM_REPORT_LOGIC_ERROR( msg )
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_VALIDATION_HPP
diff --git a/boost/test/utils/setcolor.hpp b/boost/test/utils/setcolor.hpp
index f47ec84d8d..c70209038a 100644
--- a/boost/test/utils/setcolor.hpp
+++ b/boost/test/utils/setcolor.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2009-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -28,6 +28,7 @@
namespace boost {
namespace unit_test {
+namespace utils {
// ************************************************************************** //
// ************** term_attr ************** //
@@ -102,13 +103,21 @@ struct scope_setcolor {
~scope_setcolor()
{
if( m_os )
- *m_os << setcolor();
+ *m_os << setcolor();
}
private:
// Data members
std::ostream* m_os;
};
+#define BOOST_TEST_SCOPE_SETCOLOR( is_color_output, os, attr, color ) \
+ utils::scope_setcolor const& sc = is_color_output \
+ ? utils::scope_setcolor( os, utils::attr, utils::color ) \
+ : utils::scope_setcolor(); \
+ ut_detail::ignore_unused_variable_warning( sc ) \
+/**/
+
+} // namespace utils
} // namespace unit_test
} // namespace boost
diff --git a/boost/test/utils/string_cast.hpp b/boost/test/utils/string_cast.hpp
new file mode 100644
index 0000000000..3c069a8403
--- /dev/null
+++ b/boost/test/utils/string_cast.hpp
@@ -0,0 +1,69 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/test for the library home page.
+//
+// File : $RCSfile$
+//
+// Version : $Revision$
+//
+// Description : trivial utility to cast to/from strings
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_STRING_CAST_HPP
+#define BOOST_TEST_UTILS_STRING_CAST_HPP
+
+// Boost.Test
+#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
+
+// STL
+#include <sstream>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+//____________________________________________________________________________//
+
+namespace boost {
+namespace unit_test {
+namespace utils {
+
+// ************************************************************************** //
+// ************** string_cast ************** //
+// ************************************************************************** //
+
+template<typename T>
+inline std::string
+string_cast( T const& t )
+{
+ std::ostringstream buff;
+ buff << t;
+ return buff.str();
+}
+
+//____________________________________________________________________________//
+
+// ************************************************************************** //
+// ************** string_as ************** //
+// ************************************************************************** //
+
+template<typename T>
+inline bool
+string_as( const_string str, T& res )
+{
+ std::istringstream buff( std::string( str.begin(), str.end() ) );
+ buff >> res;
+
+ return !buff.fail() && buff.eof();
+}
+
+//____________________________________________________________________________//
+
+} // namespace utils
+} // namespace unit_test
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_STRING_CAST_HPP
diff --git a/boost/test/utils/trivial_singleton.hpp b/boost/test/utils/trivial_singleton.hpp
index 818bad73ea..ac612b6393 100644
--- a/boost/test/utils/trivial_singleton.hpp
+++ b/boost/test/utils/trivial_singleton.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/wrap_stringstream.hpp b/boost/test/utils/wrap_stringstream.hpp
index e42adbd3ad..425d7ed75b 100644
--- a/boost/test/utils/wrap_stringstream.hpp
+++ b/boost/test/utils/wrap_stringstream.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2002-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
diff --git a/boost/test/utils/xml_printer.hpp b/boost/test/utils/xml_printer.hpp
index 8552a173f9..ffaf8fcc05 100644
--- a/boost/test/utils/xml_printer.hpp
+++ b/boost/test/utils/xml_printer.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
@@ -17,7 +17,6 @@
// Boost.Test
#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
-#include <boost/test/utils/fixed_mapping.hpp>
#include <boost/test/utils/custom_manip.hpp>
#include <boost/test/utils/foreach.hpp>
#include <boost/test/utils/basic_cstring/io.hpp>
@@ -34,6 +33,7 @@
namespace boost {
namespace unit_test {
+namespace utils {
// ************************************************************************** //
// ************** xml print helpers ************** //
@@ -42,21 +42,31 @@ namespace unit_test {
inline void
print_escaped( std::ostream& where_to, const_string value )
{
- static fixed_mapping<char,char const*> char_type(
- '<' , "lt",
- '>' , "gt",
- '&' , "amp",
- '\'', "apos" ,
- '"' , "quot",
-
- 0
- );
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ static std::map<char,char const*> const char_type{{
+ {'<' , "lt"},
+ {'>' , "gt"},
+ {'&' , "amp"},
+ {'\'', "apos"},
+ {'"' , "quot"}
+ }};
+#else
+ static std::map<char,char const*> char_type;
+
+ if( char_type.empty() ) {
+ char_type['<'] = "lt";
+ char_type['>'] = "gt";
+ char_type['&'] = "amp";
+ char_type['\'']= "apos";
+ char_type['"'] = "quot";
+ }
+#endif
BOOST_TEST_FOREACH( char, c, value ) {
- char const* ref = char_type[c];
+ std::map<char,char const*>::const_iterator found_ref = char_type.find( c );
- if( ref )
- where_to << '&' << ref << ';';
+ if( found_ref != char_type.end() )
+ where_to << '&' << found_ref->second << ';';
else
where_to << c;
}
@@ -124,6 +134,7 @@ operator<<( custom_printer<cdata> const& p, const_string value )
//____________________________________________________________________________//
+} // namespace utils
} // namespace unit_test
} // namespace boost
diff --git a/boost/thread/concurrent_queues/sync_queue.hpp b/boost/thread/concurrent_queues/sync_queue.hpp
index 7183c9cad8..1dbbef05dd 100644
--- a/boost/thread/concurrent_queues/sync_queue.hpp
+++ b/boost/thread/concurrent_queues/sync_queue.hpp
@@ -10,6 +10,7 @@
// See http://www.boost.org/libs/thread for documentation.
//
//////////////////////////////////////////////////////////////////////////////
+#include <iostream>
#include <boost/thread/detail/config.hpp>
#include <boost/thread/concurrent_queues/detail/sync_queue_base.hpp>
@@ -150,13 +151,19 @@ namespace concurrent
template <class ValueType, class Container>
queue_op_status sync_queue<ValueType, Container>::wait_pull(ValueType& elem, unique_lock<mutex>& lk)
{
+ //std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
if (super::empty(lk))
{
+ //std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
if (super::closed(lk)) return queue_op_status::closed;
}
+ //std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
bool has_been_closed = super::wait_until_not_empty_or_closed(lk);
+ //std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
if (has_been_closed) return queue_op_status::closed;
+ //std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
pull(elem, lk);
+ //std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
return queue_op_status::success;
}
diff --git a/boost/thread/concurrent_queues/sync_timed_queue.hpp b/boost/thread/concurrent_queues/sync_timed_queue.hpp
index 8f24f43ecd..36223d8715 100644
--- a/boost/thread/concurrent_queues/sync_timed_queue.hpp
+++ b/boost/thread/concurrent_queues/sync_timed_queue.hpp
@@ -235,7 +235,7 @@ namespace detail
if (super::closed(lk)) return true;
super::not_empty_.wait(lk);
}
- return false;
+ //return false;
}
///////////////////////////
diff --git a/boost/thread/csbl/devector.hpp b/boost/thread/csbl/devector.hpp
index c11ad29ba1..c2bc0bbe99 100644
--- a/boost/thread/csbl/devector.hpp
+++ b/boost/thread/csbl/devector.hpp
@@ -21,8 +21,8 @@ namespace boost
template <class T>
class devector
{
- typedef vector<T> vector_type;
- vector<T> data_;
+ typedef csbl::vector<T> vector_type;
+ vector_type data_;
std::size_t front_index_;
BOOST_COPYABLE_AND_MOVABLE(devector)
@@ -58,7 +58,9 @@ namespace boost
}
devector& operator=(BOOST_RV_REF(devector) x)
- BOOST_NOEXCEPT_IF(vector<T>::allocator_traits_type::propagate_on_container_move_assignment::value)
+#if defined BOOST_THREAD_USES_BOOST_VECTOR
+ BOOST_NOEXCEPT_IF(vector_type::allocator_traits_type::propagate_on_container_move_assignment::value)
+#endif
{
data_ = boost::move(x.data_);
front_index_ = x.front_index_;
diff --git a/boost/thread/detail/invoker.hpp b/boost/thread/detail/invoker.hpp
index 7ab3b33990..9f38e9798d 100644
--- a/boost/thread/detail/invoker.hpp
+++ b/boost/thread/detail/invoker.hpp
@@ -72,13 +72,21 @@ namespace boost
BOOST_SYMBOL_VISIBLE
invoker& operator=(BOOST_THREAD_RV_REF(invoker) f)
{
- f_ = boost::move(BOOST_THREAD_RV(f).f_);
+ if (this != &f)
+ {
+ f_ = boost::move(BOOST_THREAD_RV(f).f_);
+ }
+ return *this;
}
BOOST_SYMBOL_VISIBLE
invoker& operator=( BOOST_THREAD_COPY_ASSIGN_REF(invoker) f)
{
- f_ = f.f_;
+ if (this != &f)
+ {
+ f_ = f.f_;
+ }
+ return *this;
}
result_type operator()()
@@ -91,7 +99,7 @@ namespace boost
result_type
execute(tuple_indices<Indices...>)
{
- return invoke(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
+ return detail::invoke(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
}
};
@@ -128,7 +136,7 @@ namespace boost
result_type
execute(tuple_indices<Indices...>)
{
- return invoke<R>(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
+ return detail::invoke<R>(boost::move(csbl::get<0>(f_)), boost::move(csbl::get<Indices>(f_))...);
}
};
//BOOST_THREAD_DCL_MOVABLE_BEG(X) invoker<Fp> BOOST_THREAD_DCL_MOVABLE_END
@@ -182,7 +190,7 @@ namespace boost
{} \
\
result_type operator()() { \
- return invoke(boost::move(fp_) \
+ return detail::invoke(boost::move(fp_) \
BOOST_PP_REPEAT(n, BOOST_THREAD_MOVE_DCL, ~) \
); \
} \
@@ -307,7 +315,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -373,7 +381,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -434,7 +442,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -490,7 +498,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -541,7 +549,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -587,7 +595,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -628,7 +636,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
, boost::move(v2_)
@@ -664,7 +672,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
, boost::move(v1_)
);
@@ -695,7 +703,7 @@ namespace boost
result_type operator()()
{
- return invoke(boost::move(fp_)
+ return detail::invoke(boost::move(fp_)
, boost::move(v0_)
);
}
diff --git a/boost/thread/detail/move.hpp b/boost/thread/detail/move.hpp
index 611557093e..26e4f9dc6d 100644
--- a/boost/thread/detail/move.hpp
+++ b/boost/thread/detail/move.hpp
@@ -94,6 +94,11 @@ namespace boost
template <typename T> \
struct enable_move_utility_emulation_dummy_specialization<
+#define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
+ namespace detail { \
+ template <typename T1, typename T2> \
+ struct enable_move_utility_emulation_dummy_specialization<
+
#define BOOST_THREAD_DCL_MOVABLE_END > \
: integral_constant<bool, false> \
{}; \
@@ -115,6 +120,11 @@ namespace boost
template <typename T> \
struct enable_move_utility_emulation_dummy_specialization<
+#define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
+ namespace detail { \
+ template <typename T1, typename T2> \
+ struct enable_move_utility_emulation_dummy_specialization<
+
#define BOOST_THREAD_DCL_MOVABLE_END > \
: integral_constant<bool, false> \
{}; \
@@ -136,6 +146,11 @@ namespace boost
template <typename T> \
struct enable_move_utility_emulation_dummy_specialization<
+#define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
+ namespace detail { \
+ template <typename T1, typename T2> \
+ struct enable_move_utility_emulation_dummy_specialization<
+
#define BOOST_THREAD_DCL_MOVABLE_END > \
: integral_constant<bool, false> \
{}; \
@@ -161,6 +176,10 @@ struct enable_move_utility_emulation< TYPE > \
template <typename T> \
struct enable_move_utility_emulation<
+#define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
+template <typename T1, typename T2> \
+struct enable_move_utility_emulation<
+
#define BOOST_THREAD_DCL_MOVABLE_END > \
{ \
static const bool value = false; \
diff --git a/boost/thread/detail/nullary_function.hpp b/boost/thread/detail/nullary_function.hpp
index a0e9fd456a..b3989cf682 100644
--- a/boost/thread/detail/nullary_function.hpp
+++ b/boost/thread/detail/nullary_function.hpp
@@ -228,7 +228,7 @@ namespace boost
};
}
- //BOOST_THREAD_DCL_MOVABLE_BEG(F) detail::nullary_function<F> BOOST_THREAD_DCL_MOVABLE_END
+ BOOST_THREAD_DCL_MOVABLE_BEG(F) detail::nullary_function<F> BOOST_THREAD_DCL_MOVABLE_END
}
#endif // header
diff --git a/boost/thread/detail/thread.hpp b/boost/thread/detail/thread.hpp
index b80eacfa1b..9e7e8b8f5e 100644
--- a/boost/thread/detail/thread.hpp
+++ b/boost/thread/detail/thread.hpp
@@ -72,7 +72,7 @@ namespace boost
void run2(tuple_indices<Indices...>)
{
- invoke(std::move(std::get<0>(fp)), std::move(std::get<Indices>(fp))...);
+ detail::invoke(std::move(std::get<0>(fp)), std::move(std::get<Indices>(fp))...);
}
void run()
{
@@ -173,7 +173,6 @@ namespace boost
private:
bool start_thread_noexcept();
bool start_thread_noexcept(const attributes& attr);
- //public:
void start_thread()
{
if (!start_thread_noexcept())
@@ -355,6 +354,8 @@ namespace boost
#if defined BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
if (joinable()) std::terminate();
+#else
+ detach();
#endif
thread_info=BOOST_THREAD_RV(other).thread_info;
BOOST_THREAD_RV(other).thread_info.reset();
@@ -485,9 +486,9 @@ namespace boost
bool try_join_until(const chrono::time_point<Clock, Duration>& t)
{
using namespace chrono;
- system_clock::time_point s_now = system_clock::now();
bool joined= false;
do {
+ system_clock::time_point s_now = system_clock::now();
typename Clock::duration d = ceil<nanoseconds>(t-Clock::now());
if (d <= Clock::duration::zero()) return false; // in case the Clock::time_point t is already reached
joined = try_join_until(s_now + d);
diff --git a/boost/thread/detail/thread_group.hpp b/boost/thread/detail/thread_group.hpp
index 69ce991e78..4105c73468 100644
--- a/boost/thread/detail/thread_group.hpp
+++ b/boost/thread/detail/thread_group.hpp
@@ -6,6 +6,7 @@
// (C) Copyright 2007-9 Anthony Williams
#include <list>
+#include <boost/thread/csbl/memory/unique_ptr.hpp>
#include <boost/thread/shared_mutex.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/lock_guard.hpp>
@@ -75,7 +76,7 @@ namespace boost
thread* create_thread(F threadfunc)
{
boost::lock_guard<shared_mutex> guard(m);
- std::auto_ptr<thread> new_thread(new thread(threadfunc));
+ boost::csbl::unique_ptr<thread> new_thread(new thread(threadfunc));
threads.push_back(new_thread.get());
return new_thread.release();
}
diff --git a/boost/thread/executors/basic_thread_pool.hpp b/boost/thread/executors/basic_thread_pool.hpp
index 64ba1e90e0..e0d4df2c76 100644
--- a/boost/thread/executors/basic_thread_pool.hpp
+++ b/boost/thread/executors/basic_thread_pool.hpp
@@ -13,7 +13,7 @@
#include <boost/thread/detail/config.hpp>
#include <boost/thread/detail/delete.hpp>
#include <boost/thread/detail/move.hpp>
-#include <boost/thread/scoped_thread.hpp>
+#include <boost/thread/thread.hpp>
#include <boost/thread/concurrent_queues/sync_queue.hpp>
#include <boost/thread/executors/work.hpp>
#include <boost/thread/csbl/vector.hpp>
@@ -30,15 +30,14 @@ namespace executors
/// type-erasure to store the works to do
typedef executors::work work;
private:
- /// the kind of stored threads are scoped threads to ensure that the threads are joined.
+ typedef thread thread_t;
/// A move aware vector type
- typedef scoped_thread<> thread_t;
typedef csbl::vector<thread_t> thread_vector;
- /// the thread safe work queue
- concurrent::sync_queue<work > work_queue;
/// A move aware vector
thread_vector threads;
+ /// the thread safe work queue
+ concurrent::sync_queue<work > work_queue;
public:
/**
@@ -61,7 +60,7 @@ namespace executors
catch (...)
{
std::terminate();
- return false;
+ //return false;
}
}
/**
@@ -88,7 +87,9 @@ namespace executors
{
work task;
queue_op_status st = work_queue.wait_pull(task);
- if (st == queue_op_status::closed) return;
+ if (st == queue_op_status::closed) {
+ return;
+ }
task();
}
}
@@ -222,7 +223,8 @@ namespace executors
{
// signal to all the worker threads that there will be no more submissions.
close();
- // joins all the threads as the threads were scoped_threads
+ // joins all the threads before destroying the thread pool resources (e.g. the queue).
+ join();
}
/**
@@ -264,23 +266,28 @@ namespace executors
* \b Throws: \c sync_queue_is_closed if the thread pool is closed.
* Whatever exception that can be throw while storing the closure.
*/
+ void submit(BOOST_THREAD_RV_REF(work) closure) {
+ work_queue.push(boost::move(closure));
+ }
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Closure>
void submit(Closure & closure)
{
- work_queue.push(work(closure));
+ submit(work(closure));
}
#endif
void submit(void (*closure)())
{
- work_queue.push(work(closure));
+ submit(work(closure));
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
- work_queue.push(work(boost::forward<Closure>(closure)));
+ //submit(work(boost::forward<Closure>(closure)));
+ work w((boost::forward<Closure>(closure)));
+ submit(boost::move(w));
}
/**
diff --git a/boost/thread/executors/executor.hpp b/boost/thread/executors/executor.hpp
index 1075bce733..96198201f0 100644
--- a/boost/thread/executors/executor.hpp
+++ b/boost/thread/executors/executor.hpp
@@ -99,9 +99,10 @@ namespace boost
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
- work w = boost::move(closure);
+ //submit(work(boost::forward<Closure>(closure)));
+ work w((boost::forward<Closure>(closure)));
submit(boost::move(w));
}
diff --git a/boost/thread/executors/executor_adaptor.hpp b/boost/thread/executors/executor_adaptor.hpp
index ebe4e3476c..ca1a35f2d9 100644
--- a/boost/thread/executors/executor_adaptor.hpp
+++ b/boost/thread/executors/executor_adaptor.hpp
@@ -98,9 +98,6 @@ namespace executors
void submit(BOOST_THREAD_RV_REF(work) closure) {
return ex.submit(boost::move(closure));
}
-// void submit(work & closure) {
-// return ex.submit(closure);
-// }
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Closure>
@@ -115,9 +112,11 @@ namespace executors
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
- submit(work(boost::forward<Closure>(closure)));
+ //submit(work(boost::forward<Closure>(closure)));
+ work w((boost::forward<Closure>(closure)));
+ submit(boost::move(w));
}
/**
diff --git a/boost/thread/executors/generic_executor_ref.hpp b/boost/thread/executors/generic_executor_ref.hpp
index 57609c91f0..de270bcfed 100644
--- a/boost/thread/executors/generic_executor_ref.hpp
+++ b/boost/thread/executors/generic_executor_ref.hpp
@@ -121,11 +121,6 @@ namespace boost
*/
bool closed() { return ex->closed(); }
- void submit(BOOST_THREAD_RV_REF(work) closure)
- {
- ex->submit(boost::forward<work>(closure));
- }
-
/**
* \par Requires
* \c Closure is a model of Callable(void()) and a model of CopyConstructible/MoveConstructible.
@@ -142,24 +137,31 @@ namespace boost
* Whatever exception that can be throw while storing the closure.
*/
+ void submit(BOOST_THREAD_RV_REF(work) closure)
+ {
+ ex->submit(boost::move(closure));
+ }
+
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Closure>
void submit(Closure & closure)
{
- work w ((closure));
- submit(boost::move(w));
+ //work w ((closure));
+ //submit(boost::move(w));
+ submit(work(closure));
}
#endif
void submit(void (*closure)())
{
work w ((closure));
submit(boost::move(w));
+ //submit(work(closure));
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
- work w = boost::move(closure);
+ work w((boost::forward<Closure>(closure)));
submit(boost::move(w));
}
diff --git a/boost/thread/executors/loop_executor.hpp b/boost/thread/executors/loop_executor.hpp
index e9eadadf9e..b08ff76f57 100644
--- a/boost/thread/executors/loop_executor.hpp
+++ b/boost/thread/executors/loop_executor.hpp
@@ -54,7 +54,7 @@ namespace executors
catch (...)
{
std::terminate();
- return false;
+ //return false;
}
}
private:
@@ -138,23 +138,29 @@ namespace executors
* \b Throws: \c sync_queue_is_closed if the thread pool is closed.
* Whatever exception that can be throw while storing the closure.
*/
+ void submit(BOOST_THREAD_RV_REF(work) closure) {
+ work_queue.push(boost::move(closure));
+ }
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Closure>
void submit(Closure & closure)
{
- work_queue.push(work(closure));
- }
+ submit(work(closure));
+ }
#endif
+
void submit(void (*closure)())
{
- work_queue.push(work(closure));
+ submit(work(closure));
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
- work_queue.push(work(boost::forward<Closure>(closure)));
+ //work_queue.push(work(boost::forward<Closure>(closure)));
+ work w((boost::forward<Closure>(closure)));
+ submit(boost::move(w));
}
/**
diff --git a/boost/thread/executors/serial_executor.hpp b/boost/thread/executors/serial_executor.hpp
index 6f4266668f..6d7ed9be97 100644
--- a/boost/thread/executors/serial_executor.hpp
+++ b/boost/thread/executors/serial_executor.hpp
@@ -82,7 +82,7 @@ namespace executors
catch (...)
{
std::terminate();
- return false;
+ //return false;
}
}
private:
@@ -165,23 +165,28 @@ namespace executors
* \b Throws: \c sync_queue_is_closed if the thread pool is closed.
* Whatever exception that can be throw while storing the closure.
*/
+ void submit(BOOST_THREAD_RV_REF(work) closure)
+ {
+ work_queue.push(boost::move(closure));
+ }
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
template <typename Closure>
void submit(Closure & closure)
{
- work_queue.push(work(closure));
+ submit(work(closure));
}
#endif
void submit(void (*closure)())
{
- work_queue.push(work(closure));
+ submit(work(closure));
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
- work_queue.push(work(boost::forward<Closure>(closure)));
+ work w((boost::forward<Closure>(closure)));
+ submit(boost::move(w));
}
/**
diff --git a/boost/thread/executors/serial_executor_cont.hpp b/boost/thread/executors/serial_executor_cont.hpp
index 1c4cc14aad..91087890be 100644
--- a/boost/thread/executors/serial_executor_cont.hpp
+++ b/boost/thread/executors/serial_executor_cont.hpp
@@ -153,7 +153,7 @@ namespace executors
}
template <typename Closure>
- void submit(BOOST_THREAD_RV_REF(Closure) closure)
+ void submit(BOOST_THREAD_FWD_REF(Closure) closure)
{
lock_guard<mutex> lk(mtx_);
if (closed(lk)) BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
diff --git a/boost/thread/executors/thread_executor.hpp b/boost/thread/executors/thread_executor.hpp
index a8cd5c212f..c9f49a7b62 100644
--- a/boost/thread/executors/thread_executor.hpp
+++ b/boost/thread/executors/thread_executor.hpp
@@ -17,6 +17,7 @@
#include <boost/thread/thread_only.hpp>
#include <boost/thread/scoped_thread.hpp>
#include <boost/thread/csbl/vector.hpp>
+#include <boost/thread/concurrent_queues/queue_op_status.hpp>
#include <boost/config/abi_prefix.hpp>
diff --git a/boost/thread/experimental/parallel/v2/task_region.hpp b/boost/thread/experimental/parallel/v2/task_region.hpp
index 3a278c500f..e4a5833115 100755
--- a/boost/thread/experimental/parallel/v2/task_region.hpp
+++ b/boost/thread/experimental/parallel/v2/task_region.hpp
@@ -53,7 +53,7 @@ BOOST_THREAD_INLINE_NAMESPACE(v2)
throw;
}
#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
- catch (task_canceled_exception& ex)
+ catch (task_canceled_exception&)
{
}
#endif
diff --git a/boost/thread/future.hpp b/boost/thread/future.hpp
index 28239c4aa3..0ec484c2bf 100644
--- a/boost/thread/future.hpp
+++ b/boost/thread/future.hpp
@@ -13,6 +13,9 @@
// boost::thread::future requires exception handling
// due to boost::exception::exception_ptr dependency
+//#define BOOST_THREAD_CONTINUATION_SYNC
+#define BOOST_THREAD_FUTURE_BLOCKING
+
#ifndef BOOST_NO_EXCEPTIONS
#include <boost/thread/condition_variable.hpp>
@@ -33,6 +36,8 @@
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread_only.hpp>
#include <boost/thread/thread_time.hpp>
+#include <boost/thread/executor.hpp>
+#include <boost/thread/executors/generic_executor_ref.hpp>
#if defined BOOST_THREAD_FUTURE_USES_OPTIONAL
#include <boost/optional.hpp>
@@ -53,6 +58,7 @@
#include <boost/next_prior.hpp>
#include <boost/scoped_array.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
#include <boost/throw_exception.hpp>
#include <boost/type_traits/conditional.hpp>
#include <boost/type_traits/decay.hpp>
@@ -88,8 +94,28 @@
namespace boost
{
+ template <class T>
+ shared_ptr<T> static_shared_from_this(T* that)
+ {
+ return static_pointer_cast<T>(that->shared_from_this());
+ }
+ template <class T>
+ shared_ptr<T const> static_shared_from_this(T const* that)
+ {
+ return static_pointer_cast<T const>(that->shared_from_this());
+ }
+
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+#else
+ namespace executors {
+ class executor;
+ }
+#endif
+ typedef shared_ptr<executor> executor_ptr_type;
+
namespace detail
{
+
struct relocker
{
boost::unique_lock<boost::mutex>& lock_;
@@ -127,7 +153,6 @@ namespace boost
bool is_valid_;
bool is_deferred_;
bool is_constructed;
- std::size_t cnt_;
launch policy_;
mutable boost::mutex mutex;
boost::condition_variable waiters;
@@ -135,9 +160,10 @@ namespace boost
boost::function<void()> callback;
// This declaration should be only included conditionally, but is included to maintain the same layout.
continuations_type continuations;
+ executor_ptr_type ex;
// This declaration should be only included conditionally, but is included to maintain the same layout.
- virtual void launch_continuation(boost::unique_lock<boost::mutex>&, shared_ptr<shared_state_base>)
+ virtual void launch_continuation()
{
}
@@ -146,16 +172,46 @@ namespace boost
is_valid_(true),
is_deferred_(false),
is_constructed(false),
- cnt_(0),
policy_(launch::none),
- continuations()
+ continuations(),
+ ex()
+ {}
+
+ shared_state_base(exceptional_ptr const& ex):
+ exception(ex.ptr_),
+ done(true),
+ is_valid_(true),
+ is_deferred_(false),
+ is_constructed(false),
+ policy_(launch::none),
+ continuations(),
+ ex()
{}
+
+
virtual ~shared_state_base()
{
- BOOST_ASSERT(cnt_==0);
}
- virtual void block_if_needed(boost::unique_lock<boost::mutex>&)
- {}
+ executor_ptr_type get_executor()
+ {
+ return ex;
+ }
+
+ void set_executor_policy(executor_ptr_type aex)
+ {
+ set_executor();
+ ex = aex;
+ }
+ void set_executor_policy(executor_ptr_type aex, boost::lock_guard<boost::mutex>&)
+ {
+ set_executor();
+ ex = aex;
+ }
+ void set_executor_policy(executor_ptr_type aex, boost::unique_lock<boost::mutex>&)
+ {
+ set_executor();
+ ex = aex;
+ }
bool valid(boost::unique_lock<boost::mutex>&) { return is_valid_; }
bool valid() {
@@ -173,16 +229,6 @@ namespace boost
validate(lk);
}
- void inc(boost::unique_lock<boost::mutex>&) { ++cnt_; }
- void inc() { boost::unique_lock<boost::mutex> lk(this->mutex); inc(lk); }
-
- void dec(boost::unique_lock<boost::mutex>& lk) {
- if (--cnt_ == 0) {
- block_if_needed(lk);
- }
- }
- void dec() { boost::unique_lock<boost::mutex> lk(this->mutex); dec(lk); }
-
void set_deferred()
{
is_deferred_ = true;
@@ -199,6 +245,10 @@ namespace boost
is_deferred_ = false;
policy_ = launch::executor;
}
+#else
+ void set_executor()
+ {
+ }
#endif
notify_when_ready_handle notify_when_ready(boost::condition_variable_any& cv)
{
@@ -221,8 +271,7 @@ namespace boost
continuations.clear();
relocker rlk(lock);
for (continuations_type::iterator it = the_continuations.begin(); it != the_continuations.end(); ++it) {
- boost::unique_lock<boost::mutex> cont_lock((*it)->mutex);
- (*it)->launch_continuation(cont_lock, *it);
+ (*it)->launch_continuation();
}
}
}
@@ -407,7 +456,7 @@ namespace boost
return policy_;
}
- future_state::state get_state(boost::unique_lock<boost::mutex>& lk) const
+ future_state::state get_state(boost::unique_lock<boost::mutex>&) const
{
if(!done)
{
@@ -483,9 +532,14 @@ namespace boost
shared_state():
result()
{}
+ shared_state(exceptional_ptr const& ex):
+ detail::shared_state_base(ex), result()
+ {}
+
~shared_state()
- {}
+ {
+ }
void mark_finished_with_result_internal(source_reference_type result_, boost::unique_lock<boost::mutex>& lock)
{
@@ -624,6 +678,10 @@ namespace boost
result(0)
{}
+ shared_state(exceptional_ptr const& ex):
+ detail::shared_state_base(ex), result(0)
+ {}
+
~shared_state()
{
}
@@ -687,6 +745,10 @@ namespace boost
shared_state()
{}
+ shared_state(exceptional_ptr const& ex):
+ detail::shared_state_base(ex)
+ {}
+
void mark_finished_with_result_internal(boost::unique_lock<boost::mutex>& lock)
{
mark_finished_internal(lock);
@@ -741,33 +803,39 @@ namespace boost
{
typedef shared_state<Rp> base_type;
protected:
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
boost::thread thr_;
void join()
{
+ if (this_thread::get_id() == thr_.get_id())
+ {
+ thr_.detach();
+ return;
+ }
if (thr_.joinable()) thr_.join();
}
+#endif
public:
future_async_shared_state_base()
{
this->set_async();
}
- virtual void block_if_needed(boost::unique_lock<boost::mutex>& lk)
- {
- this->wait(lk, false);
- }
-
~future_async_shared_state_base()
{
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
join();
+#endif
}
virtual void wait(boost::unique_lock<boost::mutex>& lk, bool rethrow)
{
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
{
relocker rlk(lk);
join();
}
+#endif
this->base_type::wait(lk, rethrow);
}
};
@@ -784,13 +852,15 @@ namespace boost
void init(BOOST_THREAD_FWD_REF(Fp) f)
{
- shared_ptr<boost::detail::shared_state_base> that = this->shared_from_this();
- this->thr_ = thread(&future_async_shared_state::run, that, boost::forward<Fp>(f));
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
+ this->thr_ = thread(&future_async_shared_state::run, static_shared_from_this(this), boost::forward<Fp>(f));
+#else
+ thread(&future_async_shared_state::run, static_shared_from_this(this), boost::forward<Fp>(f)).detach();
+#endif
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_, BOOST_THREAD_FWD_REF(Fp) f)
+ static void run(shared_ptr<future_async_shared_state> that, BOOST_THREAD_FWD_REF(Fp) f)
{
- future_async_shared_state* that = dynamic_cast<future_async_shared_state*>(that_.get());
try
{
that->mark_finished_with_result(f());
@@ -807,12 +877,15 @@ namespace boost
{
void init(BOOST_THREAD_FWD_REF(Fp) f)
{
- this->thr_ = thread(&future_async_shared_state::run, this->shared_from_this(), boost::move(f));
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
+ this->thr_ = thread(&future_async_shared_state::run, static_shared_from_this(this), boost::move(f));
+#else
+ thread(&future_async_shared_state::run, static_shared_from_this(this), boost::move(f)).detach();
+#endif
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_, BOOST_THREAD_FWD_REF(Fp) f)
+ static void run(shared_ptr<future_async_shared_state> that, BOOST_THREAD_FWD_REF(Fp) f)
{
- future_async_shared_state* that = dynamic_cast<future_async_shared_state*>(that_.get());
try
{
f();
@@ -830,12 +903,15 @@ namespace boost
{
void init(BOOST_THREAD_FWD_REF(Fp) f)
{
- this->thr_ = thread(&future_async_shared_state::run, this->shared_from_this(), boost::move(f));
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
+ this->thr_ = thread(&future_async_shared_state::run, static_shared_from_this(this), boost::move(f));
+#else
+ thread(&future_async_shared_state::run, static_shared_from_this(this), boost::move(f)).detach();
+#endif
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_, BOOST_THREAD_FWD_REF(Fp) f)
+ static void run(shared_ptr<future_async_shared_state> that, BOOST_THREAD_FWD_REF(Fp) f)
{
- future_async_shared_state* that = dynamic_cast<future_async_shared_state*>(that_.get());
try
{
that->mark_finished_with_result(f());
@@ -934,9 +1010,10 @@ namespace boost
class future_waiter
{
- struct registered_waiter;
+ public:
typedef std::vector<int>::size_type count_type;
-
+ private:
+ struct registered_waiter;
struct registered_waiter
{
boost::shared_ptr<detail::shared_state_base> future_;
@@ -1075,7 +1152,7 @@ namespace boost
#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES
template<typename F1,typename F2>
- typename boost::enable_if<is_future_type<F1>,unsigned>::type wait_for_any(F1& f1,F2& f2)
+ typename boost::enable_if<is_future_type<F1>,typename detail::future_waiter::count_type>::type wait_for_any(F1& f1,F2& f2)
{
detail::future_waiter waiter;
waiter.add(f1);
@@ -1084,7 +1161,7 @@ namespace boost
}
template<typename F1,typename F2,typename F3>
- unsigned wait_for_any(F1& f1,F2& f2,F3& f3)
+ typename detail::future_waiter::count_type wait_for_any(F1& f1,F2& f2,F3& f3)
{
detail::future_waiter waiter;
waiter.add(f1);
@@ -1094,7 +1171,7 @@ namespace boost
}
template<typename F1,typename F2,typename F3,typename F4>
- unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4)
+ typename detail::future_waiter::count_type wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4)
{
detail::future_waiter waiter;
waiter.add(f1);
@@ -1105,7 +1182,7 @@ namespace boost
}
template<typename F1,typename F2,typename F3,typename F4,typename F5>
- unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
+ typename detail::future_waiter::count_type wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
{
detail::future_waiter waiter;
waiter.add(f1);
@@ -1117,7 +1194,8 @@ namespace boost
}
#else
template<typename F1, typename... Fs>
- typename boost::enable_if<is_future_type<F1>, unsigned>::type wait_for_any(F1& f1, Fs&... fs)
+ typename boost::enable_if<is_future_type<F1>, typename detail::future_waiter::count_type>::type
+ wait_for_any(F1& f1, Fs&... fs)
{
detail::future_waiter waiter;
waiter.add(f1, fs...);
@@ -1150,16 +1228,7 @@ namespace boost
static //BOOST_CONSTEXPR
future_ptr make_exceptional_future_ptr(exceptional_ptr const& ex) {
- promise<R> p;
- p.set_exception(ex.ptr_);
- return p.get_future().future_;
- }
-
- void set_exceptional_if_invalid() {
- if (valid()) return;
- promise<R> p;
- p.set_exception(future_uninitialized());
- future_ = p.get_future().future_;
+ return future_ptr(new detail::shared_state<R>(ex));
}
future_ptr future_;
@@ -1167,7 +1236,6 @@ namespace boost
basic_future(future_ptr a_future):
future_(a_future)
{
- if (a_future) a_future->inc();
}
public:
@@ -1181,11 +1249,9 @@ namespace boost
basic_future(exceptional_ptr const& ex)
: future_(make_exceptional_future_ptr(ex))
{
- future_->inc();
}
~basic_future() {
- if (future_) future_->dec();
}
basic_future(BOOST_THREAD_RV_REF(basic_future) other) BOOST_NOEXCEPT:
@@ -1195,9 +1261,6 @@ namespace boost
}
basic_future& operator=(BOOST_THREAD_RV_REF(basic_future) other) BOOST_NOEXCEPT
{
- if (this->future_) {
- this->future_->dec();
- }
future_=BOOST_THREAD_RV(other).future_;
BOOST_THREAD_RV(other).future_.reset();
return *this;
@@ -1249,6 +1312,15 @@ namespace boost
else return launch(launch::none);
}
+ launch launch_policy() const
+ {
+ if ( future_ ) {
+ boost::unique_lock<boost::mutex> lk(this->future_->mutex);
+ return future_->launch_policy(lk);
+ }
+ else return launch(launch::none);
+ }
+
exception_ptr get_exception_ptr()
{
return future_
@@ -1538,7 +1610,8 @@ namespace boost
BOOST_THREAD_FUTURE(exceptional_ptr const& ex):
base_type(ex) {}
- ~BOOST_THREAD_FUTURE() {}
+ ~BOOST_THREAD_FUTURE() {
+ }
BOOST_THREAD_FUTURE(BOOST_THREAD_RV_REF(BOOST_THREAD_FUTURE) other) BOOST_NOEXCEPT:
base_type(boost::move(static_cast<base_type&>(BOOST_THREAD_RV(other))))
@@ -1795,7 +1868,8 @@ namespace boost
BOOST_THREAD_FUTURE(exceptional_ptr const& ex):
base_type(ex) {}
- ~BOOST_THREAD_FUTURE() {}
+ ~BOOST_THREAD_FUTURE() {
+ }
BOOST_THREAD_FUTURE(BOOST_THREAD_RV_REF(BOOST_THREAD_FUTURE) other) BOOST_NOEXCEPT:
base_type(boost::move(static_cast<base_type&>(BOOST_THREAD_RV(other))))
@@ -1964,12 +2038,6 @@ namespace boost
shared_future& operator=(BOOST_THREAD_COPY_ASSIGN_REF(shared_future) other)
{
- if (other.future_) {
- other.future_->inc();
- }
- if (this->future_) {
- this->future_->dec();
- }
this->future_ = other.future_;
return *this;
}
@@ -2129,6 +2197,18 @@ namespace boost
std::swap(future_obtained,other.future_obtained);
}
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ void set_executor(executor_ptr_type aex)
+ {
+ lazy_init();
+ if (future_.get()==0)
+ {
+ boost::throw_exception(promise_moved());
+ }
+ boost::lock_guard<boost::mutex> lk(future_->mutex);
+ future_->set_executor_policy(aex, lk);
+ }
+#endif
// Result retrieval
BOOST_THREAD_FUTURE<R> get_future()
{
@@ -2867,7 +2947,7 @@ namespace boost
private:
task_shared_state(task_shared_state&);
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
- typedef R (*CallableType)(BOOST_THREAD_RV_REF(ArgTypes) ... );
+ typedef R (*CallableType)(ArgTypes ... );
#else
typedef R (*CallableType)();
#endif
@@ -3098,7 +3178,7 @@ namespace boost
private:
task_shared_state(task_shared_state&);
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
- typedef void (*CallableType)(BOOST_THREAD_RV_REF(ArgTypes)...);
+ typedef void (*CallableType)(ArgTypes...);
#else
typedef void (*CallableType)();
#endif
@@ -3389,9 +3469,18 @@ namespace boost
return *this;
}
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ void set_executor(executor_ptr_type aex)
+ {
+ if (!valid())
+ boost::throw_exception(task_moved());
+ boost::lock_guard<boost::mutex> lk(task->mutex);
+ task->set_executor_policy(aex, lk);
+ }
+#endif
void reset() {
if (!valid())
- throw future_error(system::make_error_code(future_errc::no_state));
+ boost::throw_exception(future_error(system::make_error_code(future_errc::no_state)));
// As if *this = packaged_task(task->callable());
@@ -3421,7 +3510,7 @@ namespace boost
// execution
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
- void operator()(BOOST_THREAD_RV_REF(ArgTypes)... args) {
+ void operator()(ArgTypes... args) {
if(!task) {
boost::throw_exception(task_moved());
}
@@ -3533,8 +3622,8 @@ namespace detail
));
} else {
std::terminate();
- BOOST_THREAD_FUTURE<R> ret;
- return ::boost::move(ret);
+ //BOOST_THREAD_FUTURE<R> ret;
+ //return ::boost::move(ret);
}
}
@@ -3557,12 +3646,12 @@ namespace detail
return ::boost::move(ret);
} else if (underlying_cast<int>(policy) & int(launch::deferred)) {
std::terminate();
- BOOST_THREAD_FUTURE<R> ret;
- return ::boost::move(ret);
+ //BOOST_THREAD_FUTURE<R> ret;
+ //return ::boost::move(ret);
} else {
std::terminate();
- BOOST_THREAD_FUTURE<R> ret;
- return ::boost::move(ret);
+ //BOOST_THREAD_FUTURE<R> ret;
+ //return ::boost::move(ret);
}
}
#endif
@@ -3575,9 +3664,6 @@ namespace detail
typename decay<ArgTypes>::type...
)>::type>
async(launch policy, BOOST_THREAD_FWD_REF(F) f, BOOST_THREAD_FWD_REF(ArgTypes)... args) {
- typedef typename boost::result_of<typename decay<F>::type(
- typename decay<ArgTypes>::type...
- )>::type R;
typedef detail::invoker<typename decay<F>::type, typename decay<ArgTypes>::type...> BF;
typedef typename BF::result_type Rp;
@@ -3597,8 +3683,8 @@ namespace detail
));
} else {
std::terminate();
- BOOST_THREAD_FUTURE<R> ret;
- return ::boost::move(ret);
+ //BOOST_THREAD_FUTURE<R> ret;
+ //return ::boost::move(ret);
}
}
@@ -3622,8 +3708,8 @@ namespace detail
return ::boost::move(ret);
} else if (underlying_cast<int>(policy) & int(launch::deferred)) {
std::terminate();
- BOOST_THREAD_FUTURE<R> ret;
- return ::boost::move(ret);
+ //BOOST_THREAD_FUTURE<R> ret;
+ //return ::boost::move(ret);
// return boost::detail::make_future_deferred_shared_state<Rp>(
// BF(
// thread_detail::decay_copy(boost::forward<F>(f))
@@ -3631,27 +3717,31 @@ namespace detail
// );
} else {
std::terminate();
- BOOST_THREAD_FUTURE<R> ret;
- return ::boost::move(ret);
+ //BOOST_THREAD_FUTURE<R> ret;
+ //return ::boost::move(ret);
}
}
#endif // defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
namespace detail {
+
/////////////////////////
/// shared_state_nullary_task
/////////////////////////
template<typename Rp, typename Fp>
struct shared_state_nullary_task
{
- shared_state<Rp>* that;
+
+ typedef shared_ptr<shared_state_base > storage_type;
+ storage_type that;
Fp f_;
public:
- shared_state_nullary_task(shared_state<Rp>* st, BOOST_THREAD_FWD_REF(Fp) f)
+ shared_state_nullary_task(storage_type st, BOOST_THREAD_FWD_REF(Fp) f)
: that(st), f_(boost::move(f))
{};
+
#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
BOOST_THREAD_COPYABLE_AND_MOVABLE(shared_state_nullary_task)
shared_state_nullary_task(shared_state_nullary_task const& x) //BOOST_NOEXCEPT
@@ -3669,36 +3759,42 @@ namespace detail {
shared_state_nullary_task(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) //BOOST_NOEXCEPT
: that(x.that), f_(boost::move(x.f_))
{
- x.that=0;
+ x.that.reset();
}
shared_state_nullary_task& operator=(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) //BOOST_NOEXCEPT
{
if (this != &x) {
that=x.that;
f_=boost::move(x.f_);
- x.that=0;
+ x.that.reset();
}
return *this;
}
#endif
void operator()() {
+ shared_ptr<shared_state<Rp> > that_ = static_pointer_cast<shared_state<Rp> >(that);
try {
- that->mark_finished_with_result(f_());
+ that_->mark_finished_with_result(f_());
} catch(...) {
- that->mark_exceptional_finish();
+ that_->mark_exceptional_finish();
}
}
+ ~shared_state_nullary_task()
+ {
+ }
};
template<typename Fp>
struct shared_state_nullary_task<void, Fp>
{
- shared_state<void>* that;
+ typedef shared_ptr<shared_state_base > storage_type;
+ storage_type that;
Fp f_;
public:
- shared_state_nullary_task(shared_state<void>* st, BOOST_THREAD_FWD_REF(Fp) f)
+ shared_state_nullary_task(storage_type st, BOOST_THREAD_FWD_REF(Fp) f)
: that(st), f_(boost::move(f))
{};
+
#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
BOOST_THREAD_COPYABLE_AND_MOVABLE(shared_state_nullary_task)
shared_state_nullary_task(shared_state_nullary_task const& x) //BOOST_NOEXCEPT
@@ -3716,91 +3812,51 @@ namespace detail {
shared_state_nullary_task(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT
: that(x.that), f_(boost::move(x.f_))
{
- x.that=0;
+ x.that.reset();
}
shared_state_nullary_task& operator=(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT {
if (this != &x) {
that=x.that;
f_=boost::move(x.f_);
- x.that=0;
+ x.that.reset();
}
return *this;
}
#endif
void operator()() {
+ shared_ptr<shared_state<void> > that_ = static_pointer_cast<shared_state<void> >(that);
try {
f_();
- that->mark_finished_with_result();
+ that_->mark_finished_with_result();
} catch(...) {
- that->mark_exceptional_finish();
+ that_->mark_exceptional_finish();
}
}
};
- template<typename Rp, typename Fp>
- struct shared_state_nullary_task<Rp&, Fp>
- {
- shared_state<Rp&>* that;
- Fp f_;
- public:
- shared_state_nullary_task(shared_state<Rp&>* st, BOOST_THREAD_FWD_REF(Fp) f)
- : that(st), f_(boost::move(f))
- {}
-#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
- BOOST_THREAD_COPYABLE_AND_MOVABLE(shared_state_nullary_task)
- shared_state_nullary_task(shared_state_nullary_task const& x) BOOST_NOEXCEPT
- : that(x.that), f_(x.f_) {}
-
- shared_state_nullary_task& operator=(BOOST_THREAD_COPY_ASSIGN_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT {
- if (this != &x){
- that=x.that;
- f_=x.f_;
- }
- return *this;
- }
- // move
- shared_state_nullary_task(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT
- : that(x.that), f_(boost::move(x.f_))
- {
- x.that=0;
- }
- shared_state_nullary_task& operator=(BOOST_THREAD_RV_REF(shared_state_nullary_task) x) BOOST_NOEXCEPT {
- if (this != &x) {
- that=x.that;
- f_=boost::move(x.f_);
- x.that=0;
- }
- return *this;
- }
-#endif
- void operator()() {
- try {
- that->mark_finished_with_result(f_());
- } catch(...) {
- that->mark_exceptional_finish();
- }
- }
- };
+}
+ BOOST_THREAD_DCL_MOVABLE_BEG2(R,F) detail::shared_state_nullary_task<R,F> BOOST_THREAD_DCL_MOVABLE_END
+namespace detail {
/////////////////////////
/// future_executor_shared_state_base
/////////////////////////
- template<typename Rp, typename Executor>
+ template<typename Rp>
struct future_executor_shared_state: shared_state<Rp>
{
typedef shared_state<Rp> base_type;
protected:
public:
- template<typename Fp>
- future_executor_shared_state(Executor& ex, BOOST_THREAD_FWD_REF(Fp) f) {
- this->set_executor();
- shared_state_nullary_task<Rp,Fp> t(this, boost::forward<Fp>(f));
- ex.submit(boost::move(t));
+ future_executor_shared_state() {
}
- virtual void block_if_needed(boost::unique_lock<boost::mutex>&lk)
+ template <class Fp, class Executor>
+ void init(Executor& ex, BOOST_THREAD_FWD_REF(Fp) f)
{
- this->wait(lk, false);
+ typedef typename decay<Fp>::type Cont;
+ this->set_executor_policy(executor_ptr_type(new executor_ref<Executor>(ex)));
+ shared_state_nullary_task<Rp,Cont> t(this->shared_from_this(), boost::forward<Fp>(f));
+ ex.submit(boost::move(t));
}
~future_executor_shared_state() {}
@@ -3812,8 +3868,9 @@ namespace detail {
template <class Rp, class Fp, class Executor>
BOOST_THREAD_FUTURE<Rp>
make_future_executor_shared_state(Executor& ex, BOOST_THREAD_FWD_REF(Fp) f) {
- shared_ptr<future_executor_shared_state<Rp, Executor> >
- h(new future_executor_shared_state<Rp, Executor>(ex, boost::forward<Fp>(f)));
+ shared_ptr<future_executor_shared_state<Rp> >
+ h(new future_executor_shared_state<Rp>());
+ h->init(ex, boost::forward<Fp>(f));
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4092,12 +4149,6 @@ namespace detail {
}
#endif
- template <typename T>
- BOOST_THREAD_FUTURE<T> make_ready_future(exception_ptr ex) {
- promise<T> p;
- p.set_exception(ex);
- return BOOST_THREAD_MAKE_RV_REF(p.get_future());
- }
template <typename T>
BOOST_THREAD_FUTURE<T> make_exceptional_future(exception_ptr ex) {
@@ -4119,16 +4170,9 @@ namespace detail {
p.set_exception(boost::current_exception());
return BOOST_THREAD_MAKE_RV_REF(p.get_future());
}
-
- template <typename T>
- BOOST_THREAD_FUTURE<T> make_exceptional_future_if_invalid(BOOST_THREAD_FWD_REF(BOOST_THREAD_FUTURE<T>) fut) {
- fut.set_exceptional_if_invalid();
- return boost::move(fut);
- }
template <typename T>
- shared_future<T> make_exceptional_future_if_invalid(shared_future<T> fut) {
- fut.set_exceptional_if_invalid();
- return fut;
+ BOOST_THREAD_FUTURE<T> make_ready_future(exception_ptr ex) {
+ return make_exceptional_future<T>(ex);
}
#if 0
@@ -4165,234 +4209,261 @@ namespace detail {
// detail::future_async_continuation_shared_state
////////////////////////////////
#if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
-namespace detail
-{
- /////////////////////////
- /// future_async_continuation_shared_state
- /////////////////////////
+#if defined BOOST_THREAD_CONTINUATION_SYNC
+#define continuation_shared_state_base shared_state
+#else
+#define continuation_shared_state_base future_async_shared_state_base
+#endif
- template<typename F, typename Rp, typename Fp>
- struct future_async_continuation_shared_state: future_async_shared_state_base<Rp>
+namespace detail
+{
+ //////////////////////
+ // detail::continuation_shared_state
+ //////////////////////
+ template<typename F, typename Rp, typename Fp, class ShSt=shared_state<Rp> >
+ struct continuation_shared_state: ShSt
{
F parent;
Fp continuation;
- shared_ptr<shared_state_base> centinel;
public:
- future_async_continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
+ continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
: parent(boost::move(f)),
- continuation(boost::move(c)),
- centinel(parent.future_) {
+ continuation(boost::move(c))
+ {
}
-
- void launch_continuation(boost::unique_lock<boost::mutex>&, shared_ptr<shared_state_base> that) {
- this->thr_ = thread(&future_async_continuation_shared_state::run, that);
+ void init(boost::unique_lock<boost::mutex> &lock)
+ {
+ parent.future_->set_continuation_ptr(this->shared_from_this(), lock);
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- future_async_continuation_shared_state* that = dynamic_cast<future_async_continuation_shared_state*>(that_.get());
+ void call() {
try {
- that->mark_finished_with_result(that->continuation(boost::move(that->parent)));
+ this->mark_finished_with_result(this->continuation(boost::move(this->parent)));
} catch(...) {
- that->mark_exceptional_finish();
+ this->mark_exceptional_finish();
}
+ // make sure parent is really cleared to prevent memory "leaks"
+ this->parent = F();
}
- ~future_async_continuation_shared_state() {
- }
- };
+ void call(boost::unique_lock<boost::mutex>& lck) {
+ try {
+ relocker relock(lck);
- template<typename F, typename Fp>
- struct future_async_continuation_shared_state<F, void, Fp>: public future_async_shared_state_base<void>
- {
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
+ // neither continuation nor parent are protected by the lock - call() must only
+ // be called once, and no one else must modify it.
+ Rp res = this->continuation(boost::move(this->parent));
- public:
- future_async_continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(boost::move(f)),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- }
+ // make sure parent is really cleared to prevent memory "leaks"
+ this->parent = F();
- void launch_continuation(boost::unique_lock<boost::mutex>&, shared_ptr<shared_state_base> that) {
- this->thr_ = thread(&future_async_continuation_shared_state::run, that);
- }
+ relock.lock();
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- future_async_continuation_shared_state* that = dynamic_cast<future_async_continuation_shared_state*>(that_.get());
- try {
- that->continuation(boost::move(that->parent));
- that->mark_finished_with_result();
- } catch(...) {
- that->mark_exceptional_finish();
+ this->mark_finished_with_result_internal(boost::move(res), lck);
+ } catch (...) {
+ this->mark_exceptional_finish_internal(current_exception(), lck);
+
+ // make sure parent is really cleared to prevent memory "leaks"
+ relocker relock(lck);
+ this->parent = F();
}
}
- ~future_async_continuation_shared_state() {}
-
- };
-
- /////////////////////////
- /// future_executor_continuation_shared_state
- /////////////////////////
-#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
-
- template <typename FutureExecutorContinuationSharedState>
- struct run_it {
- shared_ptr<boost::detail::shared_state_base> that_;
-
- run_it(shared_ptr<boost::detail::shared_state_base> that) : that_ (that) {}
- void operator()()
+ static void run(shared_ptr<boost::detail::shared_state_base> that_)
{
- FutureExecutorContinuationSharedState* that = dynamic_cast<FutureExecutorContinuationSharedState*>(that_.get());
- that->run(that_);
+ continuation_shared_state* that = static_cast<continuation_shared_state*>(that_.get());
+ that->call();
}
+
+ ~continuation_shared_state() {}
};
- template<typename Ex, typename F, typename Rp, typename Fp>
- struct future_executor_continuation_shared_state: shared_state<Rp>
+ template<typename F, typename Fp, class ShSt>
+ struct continuation_shared_state<F, void, Fp, ShSt>: ShSt
{
- Ex* ex;
F parent;
Fp continuation;
- shared_ptr<shared_state_base> centinel;
public:
- future_executor_continuation_shared_state(Ex& ex, BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
- : ex(&ex), parent(boost::move(f)),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- this->set_executor();
+ continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
+ : parent(boost::move(f)),
+ continuation(boost::move(c))
+ {
}
- void launch_continuation(boost::unique_lock<boost::mutex>& lck, shared_ptr<shared_state_base> that ) {
- relocker relock(lck);
- run_it<future_executor_continuation_shared_state> fct(that);
- ex->submit(fct);
+ void init(boost::unique_lock<boost::mutex> &lock)
+ {
+ parent.future_->set_continuation_ptr(this->shared_from_this(), lock);
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- future_executor_continuation_shared_state* that = dynamic_cast<future_executor_continuation_shared_state*>(that_.get());
+ void call()
+ {
try {
- that->mark_finished_with_result(that->continuation(boost::move(that->parent)));
+ this->continuation(boost::move(this->parent));
+ this->mark_finished_with_result();
} catch(...) {
- that->mark_exceptional_finish();
+ this->mark_exceptional_finish();
+ }
+ // make sure parent is really cleared to prevent memory "leaks"
+ this->parent = F();
+ }
+
+ void call(boost::unique_lock<boost::mutex>& lck) {
+ try {
+ {
+ relocker relock(lck);
+ // neither continuation nor parent are protected by the lock - call() must only
+ // be called once, and no one else must modify it.
+ this->continuation(boost::move(this->parent));
+
+ // make sure parent is really cleared to prevent memory "leaks"
+ this->parent = F();
+ }
+ this->mark_finished_with_result_internal(lck);
+ } catch (...) {
+ this->mark_exceptional_finish_internal(current_exception(), lck);
+
+ // make sure parent is really cleared to prevent memory "leaks"
+ relocker relock(lck);
+ this->parent = F();
}
}
- virtual void block_if_needed(boost::unique_lock<boost::mutex>&lk)
+ static void run(shared_ptr<boost::detail::shared_state_base> that_)
{
- this->wait(lk, false);
+ continuation_shared_state* that = static_cast<continuation_shared_state*>(that_.get());
+ that->call();
}
- ~future_executor_continuation_shared_state() {}
+ ~continuation_shared_state() {}
};
+ /////////////////////////
+ /// future_async_continuation_shared_state
+ /////////////////////////
- template<typename Ex, typename F, typename Fp>
- struct future_executor_continuation_shared_state<Ex, F, void, Fp>: public shared_state<void>
+ template<typename F, typename Rp, typename Fp>
+ struct future_async_continuation_shared_state: continuation_shared_state<F,Rp,Fp,continuation_shared_state_base<Rp> >
{
- Ex* ex;
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
-
+ typedef continuation_shared_state<F,Rp,Fp,continuation_shared_state_base<Rp> > base_type;
public:
- future_executor_continuation_shared_state(Ex& ex, BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
- : ex(&ex), parent(boost::move(f)),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- this->set_executor();
+ future_async_continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
+ : base_type(boost::move(f), boost::forward<Fp>(c))
+ { }
+
+ void launch_continuation() {
+#if defined BOOST_THREAD_CONTINUATION_SYNC
+ this->call();
+#elif defined BOOST_THREAD_FUTURE_BLOCKING
+ boost::lock_guard<boost::mutex> lk(this->mutex);
+ this->thr_ = thread(&future_async_continuation_shared_state::run, static_shared_from_this(this));
+#else
+ thread(&future_async_continuation_shared_state::run, static_shared_from_this(this)).detach();
+#endif
}
+ };
- void launch_continuation(boost::unique_lock<boost::mutex>& lck, shared_ptr<shared_state_base> that ) {
- relocker relock(lck);
- run_it<future_executor_continuation_shared_state> fct(that);
- ex->submit(fct);
- }
+ /////////////////////////
+ /// future_executor_continuation_shared_state
+ /////////////////////////
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- future_executor_continuation_shared_state* that = dynamic_cast<future_executor_continuation_shared_state*>(that_.get());
- try {
- that->continuation(boost::move(that->parent));
- that->mark_finished_with_result();
- } catch(...) {
- that->mark_exceptional_finish();
+ template <typename FutureExecutorContinuationSharedState>
+ struct run_it {
+ shared_ptr<FutureExecutorContinuationSharedState> that_;
+
+#if ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ BOOST_THREAD_COPYABLE_AND_MOVABLE(run_it)
+ run_it(run_it const& x) //BOOST_NOEXCEPT
+ : that_(x.that_)
+ {}
+ run_it& operator=(BOOST_THREAD_COPY_ASSIGN_REF(run_it) x) //BOOST_NOEXCEPT
+ {
+ if (this != &x) {
+ that_=x.that_;
+ }
+ return *this;
}
- }
+ // move
+ run_it(BOOST_THREAD_RV_REF(run_it) x) BOOST_NOEXCEPT
+ : that_(x.that_)
+ {
+ x.that_.reset();
+ }
+ run_it& operator=(BOOST_THREAD_RV_REF(run_it) x) BOOST_NOEXCEPT {
+ if (this != &x) {
+ that_=x.that;
+ x.that_.reset();
+ }
+ return *this;
+ }
+#endif
+ run_it(shared_ptr<FutureExecutorContinuationSharedState> that) : that_ (that) {}
- virtual void block_if_needed(boost::unique_lock<boost::mutex>&lk)
+ void operator()()
{
- this->wait(lk, false);
+ that_->run(that_);
}
-
- ~future_executor_continuation_shared_state() {}
};
-#endif
- /////////////////////////
- /// shared_future_async_continuation_shared_state
- /////////////////////////
+}
+ BOOST_THREAD_DCL_MOVABLE_BEG(F) detail::run_it<F> BOOST_THREAD_DCL_MOVABLE_END
+
+namespace detail {
template<typename F, typename Rp, typename Fp>
- struct shared_future_async_continuation_shared_state: future_async_shared_state_base<Rp>
+ struct future_executor_continuation_shared_state: continuation_shared_state<F,Rp,Fp>
{
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
+ typedef continuation_shared_state<F,Rp,Fp> base_type;
public:
- shared_future_async_continuation_shared_state(F f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(f),
- continuation(boost::move(c)),
- centinel(parent.future_) {
+ future_executor_continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
+ : base_type(boost::move(f), boost::forward<Fp>(c))
+ {
}
- void launch_continuation(boost::unique_lock<boost::mutex>&, shared_ptr<shared_state_base> that) {
- this->thr_ = thread(&shared_future_async_continuation_shared_state::run, that);
+ template <class Ex>
+ void init(boost::unique_lock<boost::mutex> &lk, Ex& ex)
+ {
+ this->set_executor_policy(executor_ptr_type(new executor_ref<Ex>(ex)), lk);
+ this->base_type::init(lk);
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- shared_future_async_continuation_shared_state* that = dynamic_cast<shared_future_async_continuation_shared_state*>(that_.get());
- try {
- that->mark_finished_with_result(that->continuation(that->parent));
- } catch(...) {
- that->mark_exceptional_finish();
- }
+ void launch_continuation() {
+ run_it<base_type> fct(static_shared_from_this(this));
+ this->get_executor()->submit(boost::move(fct));
}
- ~shared_future_async_continuation_shared_state() {}
+ ~future_executor_continuation_shared_state() {}
};
+#endif
+
+ /////////////////////////
+ /// shared_future_async_continuation_shared_state
+ /////////////////////////
- template<typename F, typename Fp>
- struct shared_future_async_continuation_shared_state<F, void, Fp>: public future_async_shared_state_base<void>
+ template<typename F, typename Rp, typename Fp>
+ struct shared_future_async_continuation_shared_state: continuation_shared_state<F,Rp,Fp,continuation_shared_state_base<Rp> >
{
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
+ typedef continuation_shared_state<F,Rp,Fp,continuation_shared_state_base<Rp> > base_type;
public:
shared_future_async_continuation_shared_state(F f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(f),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- }
-
- void launch_continuation(boost::unique_lock<boost::mutex>&, shared_ptr<shared_state_base> that) {
- this->thr_ = thread(&shared_future_async_continuation_shared_state::run, that);
+ : base_type(boost::move(f), boost::forward<Fp>(c))
+ {
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- shared_future_async_continuation_shared_state* that = dynamic_cast<shared_future_async_continuation_shared_state*>(that_.get());
- try {
- that->continuation(that->parent);
- that->mark_finished_with_result();
- } catch(...) {
- that->mark_exceptional_finish();
- }
+ void launch_continuation() {
+#if defined BOOST_THREAD_CONTINUATION_SYNC
+ this->call();
+#elif defined BOOST_THREAD_FUTURE_BLOCKING
+ boost::lock_guard<boost::mutex> lk(this->mutex);
+ this->thr_ = thread(&shared_future_async_continuation_shared_state::run, static_shared_from_this(this));
+#else
+ thread(&shared_future_async_continuation_shared_state::run, static_shared_from_this(this)).detach();
+#endif
}
~shared_future_async_continuation_shared_state() {}
@@ -4403,234 +4474,77 @@ namespace detail
/////////////////////////
#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
- template<typename Ex, typename F, typename Rp, typename Fp>
- struct shared_future_executor_continuation_shared_state: shared_state<Rp>
+ template<typename F, typename Rp, typename Fp>
+ struct shared_future_executor_continuation_shared_state: continuation_shared_state<F,Rp,Fp>
{
- Ex* ex;
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
+ typedef continuation_shared_state<F,Rp,Fp> base_type;
public:
- shared_future_executor_continuation_shared_state(Ex& ex, F f, BOOST_THREAD_FWD_REF(Fp) c)
- : ex(&ex), parent(f),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- this->set_executor();
- }
-
- void launch_continuation(boost::unique_lock<boost::mutex>& lck, shared_ptr<shared_state_base> that) {
- relocker relock(lck);
- run_it<shared_future_executor_continuation_shared_state> fct(that);
- ex->submit(fct);
- }
-
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- shared_future_executor_continuation_shared_state* that = dynamic_cast<shared_future_executor_continuation_shared_state*>(that_.get());
- try {
- that->mark_finished_with_result(that->continuation(that->parent));
- } catch(...) {
- that->mark_exceptional_finish();
- }
- }
- virtual void block_if_needed(boost::unique_lock<boost::mutex>&lk)
+ shared_future_executor_continuation_shared_state(F f, BOOST_THREAD_FWD_REF(Fp) c)
+ : base_type(boost::move(f), boost::forward<Fp>(c))
{
- this->wait(lk, false);
- }
-
- ~shared_future_executor_continuation_shared_state() {}
- };
-
- template<typename Ex, typename F, typename Fp>
- struct shared_future_executor_continuation_shared_state<Ex, F, void, Fp>: public shared_state<void>
- {
- Ex* ex;
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
-
- public:
- shared_future_executor_continuation_shared_state(Ex& ex, F f, BOOST_THREAD_FWD_REF(Fp) c)
- : ex(&ex), parent(f),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- }
-
- void launch_continuation(boost::unique_lock<boost::mutex>& lck, shared_ptr<shared_state_base> that) {
- relocker relock(lck);
- run_it<shared_future_executor_continuation_shared_state> fct(that);
- ex->submit(fct);
}
- static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- shared_future_executor_continuation_shared_state* that = dynamic_cast<shared_future_executor_continuation_shared_state*>(that_.get());
- try {
- that->continuation(that->parent);
- that->mark_finished_with_result();
- } catch(...) {
- that->mark_exceptional_finish();
- }
+ template <class Ex>
+ void init(boost::unique_lock<boost::mutex> &lk, Ex& ex)
+ {
+ this->set_executor_policy(executor_ptr_type(new executor_ref<Ex>(ex)), lk);
+ this->base_type::init(lk);
}
- virtual void block_if_needed(boost::unique_lock<boost::mutex>&lk)
- {
- this->wait(lk, false);
+ void launch_continuation() {
+ run_it<base_type> fct(static_shared_from_this(this));
+ this->get_executor()->submit(boost::move(fct));
}
~shared_future_executor_continuation_shared_state() {}
};
+
#endif
//////////////////////////
/// future_deferred_continuation_shared_state
//////////////////////////
template<typename F, typename Rp, typename Fp>
- struct future_deferred_continuation_shared_state: shared_state<Rp>
- {
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
-
- public:
- future_deferred_continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(boost::move(f)),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- this->set_deferred();
- }
-
- virtual void launch_continuation(boost::unique_lock<boost::mutex>&lk, shared_ptr<shared_state_base> ) {
- if (this->is_deferred_) {
- this->is_deferred_=false;
- this->execute(lk);
- }
- }
-
- virtual void execute(boost::unique_lock<boost::mutex>& lck) {
- try {
- Fp local_fuct=boost::move(continuation);
- F ftmp = boost::move(parent);
- relocker relock(lck);
- Rp res = local_fuct(boost::move(ftmp));
- relock.lock();
- this->mark_finished_with_result_internal(boost::move(res), lck);
- } catch (...) {
- this->mark_exceptional_finish_internal(current_exception(), lck);
- }
- }
- };
-
- template<typename F, typename Fp>
- struct future_deferred_continuation_shared_state<F,void,Fp>: shared_state<void>
+ struct future_deferred_continuation_shared_state: continuation_shared_state<F,Rp,Fp>
{
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
-
+ typedef continuation_shared_state<F,Rp,Fp> base_type;
public:
future_deferred_continuation_shared_state(BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(boost::move(f)),
- continuation(boost::move(c)),
- centinel(parent.future_) {
+ : base_type(boost::move(f), boost::forward<Fp>(c))
+ {
this->set_deferred();
}
- ~future_deferred_continuation_shared_state() {
- }
- virtual void launch_continuation(boost::unique_lock<boost::mutex>& lk, shared_ptr<shared_state_base> ) {
- if (this->is_deferred_) {
- this->is_deferred_=false;
- this->execute(lk);
- }
+ virtual void execute(boost::unique_lock<boost::mutex>& lk) {
+ this->parent.wait();
+ this->call(lk);
}
- virtual void execute(boost::unique_lock<boost::mutex>& lck) {
- try {
- Fp local_fuct=boost::move(continuation);
- F ftmp = boost::move(parent);
- relocker relock(lck);
- local_fuct(boost::move(ftmp));
- relock.lock();
- this->mark_finished_with_result_internal(lck);
- } catch (...) {
- this->mark_exceptional_finish_internal(current_exception(), lck);
- }
- }
+ virtual void launch_continuation() { }
};
//////////////////////////
/// shared_future_deferred_continuation_shared_state
//////////////////////////
template<typename F, typename Rp, typename Fp>
- struct shared_future_deferred_continuation_shared_state: shared_state<Rp>
+ struct shared_future_deferred_continuation_shared_state: continuation_shared_state<F,Rp,Fp>
{
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
+ typedef continuation_shared_state<F,Rp,Fp> base_type;
public:
shared_future_deferred_continuation_shared_state(F f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(f),
- continuation(boost::move(c)),
- centinel(parent.future_) {
- this->set_deferred();
- }
-
- virtual void launch_continuation(boost::unique_lock<boost::mutex>& lk, shared_ptr<shared_state_base> ) {
- if (this->is_deferred_) {
- this->is_deferred_=false;
- this->execute(lk);
- }
- }
-
- virtual void execute(boost::unique_lock<boost::mutex>& lck) {
- try {
- Fp local_fuct=boost::move(continuation);
- F ftmp = parent;
- relocker relock(lck);
- Rp res = local_fuct(ftmp);
- relock.lock();
- this->mark_finished_with_result_internal(boost::move(res), lck);
- } catch (...) {
- this->mark_exceptional_finish_internal(current_exception(), lck);
- }
- }
- };
-
- template<typename F, typename Fp>
- struct shared_future_deferred_continuation_shared_state<F,void,Fp>: shared_state<void>
- {
- F parent;
- Fp continuation;
- shared_ptr<shared_state_base> centinel;
-
- public:
- shared_future_deferred_continuation_shared_state(F f, BOOST_THREAD_FWD_REF(Fp) c)
- : parent(f),
- continuation(boost::move(c)),
- centinel(parent.future_) {
+ : base_type(boost::move(f), boost::forward<Fp>(c))
+ {
this->set_deferred();
}
- virtual void launch_continuation(boost::unique_lock<boost::mutex>& lk, shared_ptr<shared_state_base> ) {
- if (this->is_deferred_) {
- this->is_deferred_=false;
- this->execute(lk);
- }
+ virtual void execute(boost::unique_lock<boost::mutex>& lk) {
+ this->parent.wait();
+ this->call(lk);
}
- virtual void execute(boost::unique_lock<boost::mutex>& lck) {
- try {
- Fp local_fuct=boost::move(continuation);
- F ftmp = parent;
- relocker relock(lck);
- local_fuct(ftmp);
- relock.lock();
- this->mark_finished_with_result_internal(lck);
- } catch (...) {
- this->mark_exceptional_finish_internal(current_exception(), lck);
- }
- }
+ virtual void launch_continuation() { }
};
////////////////////////////////
@@ -4641,11 +4555,10 @@ namespace detail
make_future_deferred_continuation_shared_state(
boost::unique_lock<boost::mutex> &lock,
BOOST_THREAD_RV_REF(F) f, BOOST_THREAD_FWD_REF(Fp) c) {
- shared_ptr<future_deferred_continuation_shared_state<F, Rp, Fp> >
- h(new future_deferred_continuation_shared_state<F, Rp, Fp>(boost::move(f), boost::forward<Fp>(c)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ typedef typename decay<Fp>::type Cont;
+ shared_ptr<future_deferred_continuation_shared_state<F, Rp, Cont> >
+ h(new future_deferred_continuation_shared_state<F, Rp, Cont>(boost::move(f), boost::forward<Fp>(c)));
+ h->init(lock);
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4657,11 +4570,10 @@ namespace detail
make_future_async_continuation_shared_state(
boost::unique_lock<boost::mutex> &lock, BOOST_THREAD_RV_REF(F) f,
BOOST_THREAD_FWD_REF(Fp) c) {
- shared_ptr<future_async_continuation_shared_state<F,Rp, Fp> >
- h(new future_async_continuation_shared_state<F,Rp, Fp>(boost::move(f), boost::forward<Fp>(c)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ typedef typename decay<Fp>::type Cont;
+ shared_ptr<future_async_continuation_shared_state<F,Rp, Cont> >
+ h(new future_async_continuation_shared_state<F,Rp, Cont>(boost::move(f), boost::forward<Fp>(c)));
+ h->init(lock);
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4676,11 +4588,10 @@ namespace detail
make_future_executor_continuation_shared_state(Ex& ex,
boost::unique_lock<boost::mutex> &lock, BOOST_THREAD_RV_REF(F) f,
BOOST_THREAD_FWD_REF(Fp) c) {
- shared_ptr<future_executor_continuation_shared_state<Ex,F,Rp, Fp> >
- h(new future_executor_continuation_shared_state<Ex, F,Rp, Fp>(ex, boost::move(f), boost::forward<Fp>(c)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ typedef typename decay<Fp>::type Cont;
+ shared_ptr<future_executor_continuation_shared_state<F,Rp, Cont> >
+ h(new future_executor_continuation_shared_state<F,Rp, Cont>(boost::move(f), boost::forward<Fp>(c)));
+ h->init(lock, ex);
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4694,11 +4605,10 @@ namespace detail
make_shared_future_deferred_continuation_shared_state(
boost::unique_lock<boost::mutex> &lock,
F f, BOOST_THREAD_FWD_REF(Fp) c) {
- shared_ptr<shared_future_deferred_continuation_shared_state<F, Rp, Fp> >
- h(new shared_future_deferred_continuation_shared_state<F, Rp, Fp>(f, boost::forward<Fp>(c)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ typedef typename decay<Fp>::type Cont;
+ shared_ptr<shared_future_deferred_continuation_shared_state<F, Rp, Cont> >
+ h(new shared_future_deferred_continuation_shared_state<F, Rp, Cont>(f, boost::forward<Fp>(c)));
+ h->init(lock);
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4710,11 +4620,10 @@ namespace detail
make_shared_future_async_continuation_shared_state(
boost::unique_lock<boost::mutex> &lock, F f,
BOOST_THREAD_FWD_REF(Fp) c) {
- shared_ptr<shared_future_async_continuation_shared_state<F,Rp, Fp> >
- h(new shared_future_async_continuation_shared_state<F,Rp, Fp>(f, boost::forward<Fp>(c)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ typedef typename decay<Fp>::type Cont;
+ shared_ptr<shared_future_async_continuation_shared_state<F,Rp, Cont> >
+ h(new shared_future_async_continuation_shared_state<F,Rp, Cont>(f, boost::forward<Fp>(c)));
+ h->init(lock);
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4727,11 +4636,10 @@ namespace detail
make_shared_future_executor_continuation_shared_state(Ex& ex,
boost::unique_lock<boost::mutex> &lock, F f,
BOOST_THREAD_FWD_REF(Fp) c) {
- shared_ptr<shared_future_executor_continuation_shared_state<Ex, F, Rp, Fp> >
- h(new shared_future_executor_continuation_shared_state<Ex, F, Rp, Fp>(ex, f, boost::forward<Fp>(c)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ typedef typename decay<Fp>::type Cont;
+ shared_ptr<shared_future_executor_continuation_shared_state<F, Rp, Cont> >
+ h(new shared_future_executor_continuation_shared_state<F, Rp, Cont>(f, boost::forward<Fp>(c)));
+ h->init(lock, ex);
return BOOST_THREAD_FUTURE<Rp>(h);
}
@@ -4740,9 +4648,8 @@ namespace detail
////////////////////////////////
// template<typename F>
- // auto future<R>::then(F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ // auto future<R>::then(launch policy, F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
////////////////////////////////
-
template <typename R>
template <typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type>
@@ -4750,26 +4657,63 @@ namespace detail
typedef typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type future_type;
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
if (underlying_cast<int>(policy) & int(launch::async)) {
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
lock, boost::move(*this), boost::forward<F>(func)
)));
} else if (underlying_cast<int>(policy) & int(launch::deferred)) {
- this->future_->wait_internal(lock);
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
lock, boost::move(*this), boost::forward<F>(func)
)));
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ } else if (underlying_cast<int>(policy) & int(launch::executor)) {
+ assert(this->future_->get_executor());
+ typedef executor Ex;
+ Ex& ex = *(this->future_->get_executor());
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type>(ex,
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+#endif
+ } else if (underlying_cast<int>(policy) & int(launch::inherit)) {
+
+ launch policy = this->launch_policy(lock);
+ if (underlying_cast<int>(policy) & int(launch::async)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+ } else if (underlying_cast<int>(policy) & int(launch::deferred)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ } else if (underlying_cast<int>(policy) & int(launch::executor)) {
+ assert(this->future_->get_executor());
+ typedef executor Ex;
+ Ex& ex = *(this->future_->get_executor());
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type>(ex,
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+#endif
+ } else {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+ }
} else {
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
lock, boost::move(*this), boost::forward<F>(func)
)));
}
}
#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ ////////////////////////////////
+ // template<typename Ex, typename F>
+ // auto future<future<R2> >::then(Ex&, F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ ////////////////////////////////
template <typename R>
template <typename Ex, typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type>
@@ -4777,45 +4721,52 @@ namespace detail
typedef typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type future_type;
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type, F>(ex,
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type>(ex,
lock, boost::move(*this), boost::forward<F>(func)
)));
}
#endif
+ ////////////////////////////////
+ // template<typename F>
+ // auto future<future<R2> >::then(F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ ////////////////////////////////
template <typename R>
template <typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type>
BOOST_THREAD_FUTURE<R>::then(BOOST_THREAD_FWD_REF(F) func) {
+
+#ifndef BOOST_THREAD_CONTINUATION_SYNC
+ return this->then(this->launch_policy(), boost::forward<F>(func));
+#else
typedef typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type future_type;
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- if (underlying_cast<int>(this->launch_policy(lock)) & int(launch::async)) {
- lock.unlock();
- return boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
- lock, boost::move(*this), boost::forward<F>(func)
- );
- } else if (underlying_cast<int>(this->launch_policy(lock)) & int(launch::deferred)) {
- this->future_->wait_internal(lock);
- lock.unlock();
- return boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
- lock, boost::move(*this), boost::forward<F>(func)
- );
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
+ launch policy = this->launch_policy(lock);
+ if (underlying_cast<int>(policy) & int(launch::deferred)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
} else {
- lock.unlock();
- return boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
- lock, boost::move(*this), boost::forward<F>(func)
- );
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
}
+#endif
+
}
////////////////////////////////
// template<typename F>
- // auto future<future<R2>>::then(F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ // auto future<future<R2> >::then(launch, F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
////////////////////////////////
-
template <typename R2>
template <typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R2> >)>::type>
@@ -4824,22 +4775,64 @@ namespace detail
typedef typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type future_type;
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
if (underlying_cast<int>(policy) & int(launch::async)) {
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
lock, boost::move(*this), boost::forward<F>(func)
)));
} else if (underlying_cast<int>(policy) & int(launch::deferred)) {
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
lock, boost::move(*this), boost::forward<F>(func)
)));
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ } else if (underlying_cast<int>(policy) & int(launch::executor)) {
+ assert(this->future_->get_executor());
+ typedef executor Ex;
+ Ex& ex = *(this->future_->get_executor());
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type>(ex,
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+#endif
+ } else if (underlying_cast<int>(policy) & int(launch::inherit)) {
+ launch policy = this->launch_policy(lock);
+
+ if (underlying_cast<int>(policy) & int(launch::async)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+ } else if (underlying_cast<int>(policy) & int(launch::deferred)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ } else if (underlying_cast<int>(policy) & int(launch::executor)) {
+ assert(this->future_->get_executor());
+ typedef executor Ex;
+ Ex& ex = *(this->future_->get_executor());
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type>(ex,
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+#endif
+ } else {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
+ }
} else {
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
lock, boost::move(*this), boost::forward<F>(func)
)));
}
}
+
#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ ////////////////////////////////
+ // template<typename Ex, typename F>
+ // auto future<future<R2> >::then(Ex&, F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ ////////////////////////////////
template <typename R2>
template <typename Ex, typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R2> >)>::type>
@@ -4848,42 +4841,54 @@ namespace detail
typedef typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type future_type;
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type, F>(ex,
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_executor_continuation_shared_state<Ex, BOOST_THREAD_FUTURE<R>, future_type>(ex,
lock, boost::move(*this), boost::forward<F>(func)
)));
}
#endif
+
+ ////////////////////////////////
+ // template<typename F>
+ // auto future<future<R2> >::then(F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ ////////////////////////////////
template <typename R2>
template <typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R2> >)>::type>
BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R2> >::then(BOOST_THREAD_FWD_REF(F) func) {
+
+#ifndef BOOST_THREAD_CONTINUATION_SYNC
+ return this->then(this->launch_policy(), boost::forward<F>(func));
+#else
typedef BOOST_THREAD_FUTURE<R2> R;
typedef typename boost::result_of<F(BOOST_THREAD_FUTURE<R>)>::type future_type;
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- if (underlying_cast<int>(this->launch_policy(lock)) & int(launch::async)) {
- return boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
- lock, boost::move(*this), boost::forward<F>(func)
- );
- } else if (underlying_cast<int>(this->launch_policy(lock)) & int(launch::deferred)) {
- this->future_->wait_internal(lock);
- return boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
- lock, boost::move(*this), boost::forward<F>(func)
- );
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
+ launch policy = this->launch_policy(lock);
+
+ if (underlying_cast<int>(policy) & int(launch::deferred)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_deferred_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
} else {
- return boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type, F>(
- lock, boost::move(*this), boost::forward<F>(func)
- );
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_future_async_continuation_shared_state<BOOST_THREAD_FUTURE<R>, future_type>(
+ lock, boost::move(*this), boost::forward<F>(func)
+ )));
}
+#endif
}
////////////////////////////////
// template<typename F>
- // auto shared_future<R>::then(F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ // auto shared_future<R>::then(launch policy, F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
////////////////////////////////
-
template <typename R>
template <typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(shared_future<R>)>::type>
@@ -4894,24 +4899,57 @@ namespace detail
boost::unique_lock<boost::mutex> lock(this->future_->mutex);
if (underlying_cast<int>(policy) & int(launch::async)) {
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type>(
lock, *this, boost::forward<F>(func)
)));
} else if (underlying_cast<int>(policy) & int(launch::deferred)) {
- this->future_->wait_internal(lock);
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_deferred_continuation_shared_state<shared_future<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_deferred_continuation_shared_state<shared_future<R>, future_type>(
lock, *this, boost::forward<F>(func)
)));
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ } else if (underlying_cast<int>(policy) & int(launch::executor)) {
+ typedef executor Ex;
+ Ex& ex = *(this->future_->get_executor());
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_executor_continuation_shared_state<Ex, shared_future<R>, future_type>(ex,
+ lock, *this, boost::forward<F>(func)
+ )));
+#endif
+ } else if (underlying_cast<int>(policy) & int(launch::inherit)) {
+
+ launch policy = this->launch_policy(lock);
+ if (underlying_cast<int>(policy) & int(launch::async)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type>(
+ lock, *this, boost::forward<F>(func)
+ )));
+ } else if (underlying_cast<int>(policy) & int(launch::deferred)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_deferred_continuation_shared_state<shared_future<R>, future_type>(
+ lock, *this, boost::forward<F>(func)
+ )));
+#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ } else if (underlying_cast<int>(policy) & int(launch::executor)) {
+ typedef executor Ex;
+ Ex& ex = *(this->future_->get_executor());
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_executor_continuation_shared_state<Ex, shared_future<R>, future_type>(ex,
+ lock, *this, boost::forward<F>(func)
+ )));
+#endif
+ } else {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type>(
+ lock, *this, boost::forward<F>(func)
+ )));
+ }
+
} else {
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type, F>(
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type>(
lock, *this, boost::forward<F>(func)
)));
}
}
#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
+ ////////////////////////////////
+ // template<typename Ex, typename F>
+ // auto shared_future<R>::then(Ex&, F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ ////////////////////////////////
template <typename R>
template <typename Ex, typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(shared_future<R>)>::type>
@@ -4921,36 +4959,38 @@ namespace detail
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- lock.unlock();
- return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_executor_continuation_shared_state<Ex, shared_future<R>, future_type, F>(ex,
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_executor_continuation_shared_state<Ex, shared_future<R>, future_type>(ex,
lock, *this, boost::forward<F>(func)
)));
}
#endif
+ ////////////////////////////////
+ // template<typename F>
+ // auto shared_future<R>::then(F&& func) -> BOOST_THREAD_FUTURE<decltype(func(*this))>;
+ ////////////////////////////////
template <typename R>
template <typename F>
inline BOOST_THREAD_FUTURE<typename boost::result_of<F(shared_future<R>)>::type>
shared_future<R>::then(BOOST_THREAD_FWD_REF(F) func) const {
+#ifndef BOOST_THREAD_CONTINUATION_SYNC
+ return this->then(this->launch_policy(), boost::forward<F>(func));
+#else
typedef typename boost::result_of<F(shared_future<R>)>::type future_type;
-
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- if (underlying_cast<int>(this->launch_policy(lock)) & int(launch::async)) {
- lock.unlock();
- return boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type, F>(
- lock, *this, boost::forward<F>(func));
- } else if (underlying_cast<int>(this->launch_policy(lock)) & int(launch::deferred)) {
- this->future_->wait_internal(lock);
- lock.unlock();
- return boost::detail::make_shared_future_deferred_continuation_shared_state<shared_future<R>, future_type, F>(
- lock, *this, boost::forward<F>(func));
+ launch policy = this->launch_policy(lock);
+ if (underlying_cast<int>(policy) & int(launch::deferred)) {
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_deferred_continuation_shared_state<shared_future<R>, future_type>(
+ lock, *this, boost::forward<F>(func)
+ )));
} else {
- lock.unlock();
- return boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type, F>(
- lock, *this, boost::forward<F>(func));
+ return BOOST_THREAD_MAKE_RV_REF((boost::detail::make_shared_future_async_continuation_shared_state<shared_future<R>, future_type>(
+ lock, *this, boost::forward<F>(func)
+ )));
}
+#endif
}
namespace detail
@@ -5013,32 +5053,81 @@ namespace detail
template<typename F, typename Rp>
struct future_unwrap_shared_state: shared_state<Rp>
{
- F parent;
+ F wrapped;
+ typename F::value_type unwrapped;
public:
explicit future_unwrap_shared_state(BOOST_THREAD_RV_REF(F) f)
- : parent(boost::move(f)) {}
-
- typename F::value_type parent_value(boost::unique_lock<boost::mutex>& ) {
- typename F::value_type r = parent.get();
- r.set_exceptional_if_invalid();
- return boost::move(r);
+ : wrapped(boost::move(f)) {
}
- virtual void wait(boost::unique_lock<boost::mutex>& lk, bool ) { // todo see if rethrow must be used
- parent_value(lk).wait();
+ void launch_continuation()
+ {
+ boost::unique_lock<boost::mutex> lk(this->mutex);
+ // assert(wrapped.is_ready());
+ if (! unwrapped.valid() )
+ {
+ if (wrapped.has_exception()) {
+ this->mark_exceptional_finish_internal(wrapped.get_exception_ptr(), lk);
+ } else {
+ unwrapped = wrapped.get();
+ if (unwrapped.valid())
+ {
+ lk.unlock();
+ boost::unique_lock<boost::mutex> lk2(unwrapped.future_->mutex);
+ unwrapped.future_->set_continuation_ptr(this->shared_from_this(), lk2);
+ } else {
+ this->mark_exceptional_finish_internal(boost::copy_exception(future_uninitialized()), lk);
+ }
+ }
+ } else {
+ // assert(unwrapped.is_ready());
+ if (unwrapped.has_exception()) {
+ this->mark_exceptional_finish_internal(unwrapped.get_exception_ptr(), lk);
+ } else {
+ this->mark_finished_with_result_internal(unwrapped.get(), lk);
+ }
+ }
}
- virtual Rp get(boost::unique_lock<boost::mutex>& lk) {
- return parent_value(lk).get();
+ };
+
+ template<typename F>
+ struct future_unwrap_shared_state<F,void>: shared_state<void>
+ {
+ F wrapped;
+ typename F::value_type unwrapped;
+ public:
+ explicit future_unwrap_shared_state(BOOST_THREAD_RV_REF(F) f)
+ : wrapped(boost::move(f)) {
}
-#if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
- typedef shared_ptr<shared_state_base> continuation_ptr_type;
- virtual void set_continuation_ptr(continuation_ptr_type continuation, boost::unique_lock<boost::mutex>& lock)
+ void launch_continuation()
{
- boost::unique_lock<boost::mutex> lk(parent.future_->mutex);
- parent.future_->set_continuation_ptr(continuation, lk);
+ boost::unique_lock<boost::mutex> lk(this->mutex);
+ // assert(wrapped.is_ready());
+ if (! unwrapped.valid() )
+ {
+ if (wrapped.has_exception()) {
+ this->mark_exceptional_finish_internal(wrapped.get_exception_ptr(), lk);
+ } else {
+ unwrapped = wrapped.get();
+ if (unwrapped.valid())
+ {
+ lk.unlock();
+ boost::unique_lock<boost::mutex> lk2(unwrapped.future_->mutex);
+ unwrapped.future_->set_continuation_ptr(this->shared_from_this(), lk2);
+ } else {
+ this->mark_exceptional_finish_internal(boost::copy_exception(future_uninitialized()), lk);
+ }
+ }
+ } else {
+ // assert(unwrapped.is_ready());
+ if (unwrapped.has_exception()) {
+ this->mark_exceptional_finish_internal(unwrapped.get_exception_ptr(), lk);
+ } else {
+ this->mark_finished_with_result_internal(lk);
+ }
+ }
}
-#endif
};
template <class F, class Rp>
@@ -5046,9 +5135,8 @@ namespace detail
make_future_unwrap_shared_state(boost::unique_lock<boost::mutex> &lock, BOOST_THREAD_RV_REF(F) f) {
shared_ptr<future_unwrap_shared_state<F, Rp> >
h(new future_unwrap_shared_state<F, Rp>(boost::move(f)));
- lock.lock();
- h->parent.future_->set_continuation_ptr(h, lock);
- lock.unlock();
+ h->wrapped.future_->set_continuation_ptr(h, lock);
+
return BOOST_THREAD_FUTURE<Rp>(h);
}
}
@@ -5062,8 +5150,11 @@ namespace detail
BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R2> >::unwrap()
{
BOOST_THREAD_ASSERT_PRECONDITION(this->future_!=0, future_uninitialized());
- boost::unique_lock<boost::mutex> lock(this->future_->mutex);
- lock.unlock();
+
+ // keep state alive as we move ourself but hold the lock
+ shared_ptr<detail::shared_state_base> sentinel(this->future_);
+ boost::unique_lock<boost::mutex> lock(sentinel->mutex);
+
return boost::detail::make_future_unwrap_shared_state<BOOST_THREAD_FUTURE<BOOST_THREAD_FUTURE<R2> >, R2>(lock, boost::move(*this));
}
#endif
@@ -5091,7 +5182,7 @@ namespace detail
vector_type vec_;
static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- future_when_all_vector_shared_state* that = dynamic_cast<future_when_all_vector_shared_state*>(that_.get());
+ future_when_all_vector_shared_state* that = static_cast<future_when_all_vector_shared_state*>(that_.get());
try {
boost::wait_for_all(that->vec_.begin(), that->vec_.end());
that->mark_finished_with_result(boost::move(that->vec_));
@@ -5116,7 +5207,11 @@ namespace detail
future_when_all_vector_shared_state::run(this->shared_from_this());
return;
}
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
this->thr_ = thread(&future_when_all_vector_shared_state::run, this->shared_from_this());
+#else
+ thread(&future_when_all_vector_shared_state::run, this->shared_from_this()).detach();
+#endif
}
public:
@@ -5158,7 +5253,7 @@ namespace detail
static void run(shared_ptr<boost::detail::shared_state_base> that_)
{
- future_when_any_vector_shared_state* that = dynamic_cast<future_when_any_vector_shared_state*>(that_.get());
+ future_when_any_vector_shared_state* that = static_cast<future_when_any_vector_shared_state*>(that_.get());
try {
boost::wait_for_any(that->vec_.begin(), that->vec_.end());
that->mark_finished_with_result(boost::move(that->vec_));
@@ -5183,7 +5278,11 @@ namespace detail
return;
}
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
this->thr_ = thread(&future_when_any_vector_shared_state::run, this->shared_from_this());
+#else
+ thread(&future_when_any_vector_shared_state::run, this->shared_from_this()).detach();
+#endif
}
public:
@@ -5256,7 +5355,7 @@ namespace detail
typedef typename make_tuple_indices<1+sizeof...(T)>::type Index;
static void run(shared_ptr<boost::detail::shared_state_base> that_) {
- future_when_all_tuple_shared_state* that = dynamic_cast<future_when_all_tuple_shared_state*>(that_.get());
+ future_when_all_tuple_shared_state* that = static_cast<future_when_all_tuple_shared_state*>(that_.get());
try {
// TODO make use of apply(that->tup_, boost::detail::wait_for_all_fctor());
that->wait_for_all(Index());
@@ -5286,8 +5385,12 @@ namespace detail
future_when_all_tuple_shared_state::run(this->shared_from_this());
return;
}
-
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
this->thr_ = thread(&future_when_all_tuple_shared_state::run, this->shared_from_this());
+#else
+ thread(&future_when_all_tuple_shared_state::run, this->shared_from_this()).detach();
+#endif
+
}
public:
template< typename F, typename ...Fs>
@@ -5325,7 +5428,7 @@ namespace detail
static void run(shared_ptr<boost::detail::shared_state_base> that_)
{
- future_when_any_tuple_shared_state* that = dynamic_cast<future_when_any_tuple_shared_state*>(that_.get());
+ future_when_any_tuple_shared_state* that = static_cast<future_when_any_tuple_shared_state*>(that_.get());
try {
// TODO make use of apply(that->tup_, wait_for_any_fctr);
that->wait_for_any(Index());
@@ -5353,7 +5456,11 @@ namespace detail
return;
}
+#ifdef BOOST_THREAD_FUTURE_BLOCKING
this->thr_ = thread(&future_when_any_tuple_shared_state::run, this->shared_from_this());
+#else
+ thread(&future_when_any_tuple_shared_state::run, this->shared_from_this()).detach();
+#endif
}
public:
diff --git a/boost/thread/futures/launch.hpp b/boost/thread/futures/launch.hpp
index b457020aaa..8eed42cf4d 100644
--- a/boost/thread/futures/launch.hpp
+++ b/boost/thread/futures/launch.hpp
@@ -22,6 +22,7 @@ namespace boost
#ifdef BOOST_THREAD_PROVIDES_EXECUTORS
executor = 4,
#endif
+ inherit = 8,
any = async | deferred
}
BOOST_SCOPED_ENUM_DECLARE_END(launch)
diff --git a/boost/thread/latch.hpp b/boost/thread/latch.hpp
index 8fa9d963de..dc921e68fe 100644
--- a/boost/thread/latch.hpp
+++ b/boost/thread/latch.hpp
@@ -72,6 +72,7 @@ namespace boost
void wait()
{
boost::unique_lock<boost::mutex> lk(mutex_);
+ if (count_ == 0) return;
std::size_t generation(generation_);
cond_.wait(lk, detail::not_equal(generation, generation_));
}
@@ -89,6 +90,7 @@ namespace boost
cv_status wait_for(const chrono::duration<Rep, Period>& rel_time)
{
boost::unique_lock<boost::mutex> lk(mutex_);
+ if (count_ == 0) return cv_status::no_timeout;
std::size_t generation(generation_);
return cond_.wait_for(lk, rel_time, detail::not_equal(generation, generation_))
? cv_status::no_timeout
@@ -101,6 +103,7 @@ namespace boost
cv_status wait_until(const chrono::time_point<Clock, Duration>& abs_time)
{
boost::unique_lock<boost::mutex> lk(mutex_);
+ if (count_ == 0) return cv_status::no_timeout;
std::size_t generation(generation_);
return cond_.wait_until(lk, abs_time, detail::not_equal(generation, generation_))
? cv_status::no_timeout
diff --git a/boost/thread/poly_lockable.hpp b/boost/thread/poly_lockable.hpp
index 7346188116..fffcbce133 100644
--- a/boost/thread/poly_lockable.hpp
+++ b/boost/thread/poly_lockable.hpp
@@ -31,7 +31,7 @@ namespace boost
//]
//[poly_lockable
- class poly_lockable : public basic_poly_lockable<Lockable>
+ class poly_lockable : public basic_poly_lockable
{
public:
@@ -41,7 +41,7 @@ namespace boost
//]
//[timed_poly_lockable
- class timed_poly_lockable: public poly_lockable<TimedLock>
+ class timed_poly_lockable: public poly_lockable
{
public:
virtual ~timed_poly_lockable()=0;
diff --git a/boost/thread/pthread/condition_variable.hpp b/boost/thread/pthread/condition_variable.hpp
index b30d37f9b0..a603351591 100644
--- a/boost/thread/pthread/condition_variable.hpp
+++ b/boost/thread/pthread/condition_variable.hpp
@@ -68,17 +68,14 @@ namespace boost
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
+ pthread_mutex_t* the_mutex = &internal_mutex;
guard.activate(m);
- do {
- res = pthread_cond_wait(&cond,&internal_mutex);
- } while (res == EINTR);
#else
- //boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
pthread_mutex_t* the_mutex = m.mutex()->native_handle();
+#endif
do {
res = pthread_cond_wait(&cond,the_mutex);
} while (res == EINTR);
-#endif
}
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
this_thread::interruption_point();
@@ -99,18 +96,17 @@ namespace boost
boost::throw_exception(condition_error(EPERM, "boost::condition_variable::do_wait_until() failed precondition mutex not owned"));
}
#endif
- thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
int cond_res;
{
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
+ thread_cv_detail::lock_on_exit<unique_lock<mutex> > guard;
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
+ pthread_mutex_t* the_mutex = &internal_mutex;
guard.activate(m);
- cond_res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
#else
- //boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
pthread_mutex_t* the_mutex = m.mutex()->native_handle();
- cond_res=pthread_cond_timedwait(&cond,the_mutex,&timeout);
#endif
+ cond_res=pthread_cond_timedwait(&cond,the_mutex,&timeout);
}
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
this_thread::interruption_point();
@@ -156,11 +152,11 @@ namespace boost
{
boost::throw_exception(thread_resource_error(res, "boost::condition_variable_any::condition_variable_any() failed in pthread_mutex_init"));
}
- int const res2=pthread_cond_init(&cond,NULL);
+ int const res2 = detail::monotonic_pthread_cond_init(cond);
if(res2)
{
BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex));
- boost::throw_exception(thread_resource_error(res2, "boost::condition_variable_any::condition_variable_any() failed in pthread_cond_init"));
+ boost::throw_exception(thread_resource_error(res2, "boost::condition_variable_any::condition_variable_any() failed in detail::monotonic_pthread_cond_init"));
}
}
~condition_variable_any()
@@ -178,7 +174,7 @@ namespace boost
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
#else
- boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
+ boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
#endif
guard.activate(m);
res=pthread_cond_wait(&cond,&internal_mutex);
@@ -240,6 +236,8 @@ namespace boost
return timed_wait(m,get_system_time()+wait_duration,pred);
}
#endif
+#ifndef BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+
#ifdef BOOST_THREAD_USES_CHRONO
template <class lock_type,class Duration>
cv_status
@@ -268,22 +266,6 @@ namespace boost
return Clock::now() < t ? cv_status::no_timeout : cv_status::timeout;
}
- template <class lock_type, class Clock, class Duration, class Predicate>
- bool
- wait_until(
- lock_type& lock,
- const chrono::time_point<Clock, Duration>& t,
- Predicate pred)
- {
- while (!pred())
- {
- if (wait_until(lock, t) == cv_status::timeout)
- return pred();
- }
- return true;
- }
-
-
template <class lock_type, class Rep, class Period>
cv_status
wait_for(
@@ -299,28 +281,64 @@ namespace boost
}
+ template <class lock_type>
+ cv_status wait_until(
+ lock_type& lk,
+ chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
+ {
+ using namespace chrono;
+ nanoseconds d = tp.time_since_epoch();
+ timespec ts = boost::detail::to_timespec(d);
+ if (do_wait_until(lk, ts)) return cv_status::no_timeout;
+ else return cv_status::timeout;
+ }
+#endif
+#else // defined BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+#ifdef BOOST_THREAD_USES_CHRONO
- template <class lock_type, class Rep, class Period, class Predicate>
- bool
- wait_for(
- lock_type& lock,
- const chrono::duration<Rep, Period>& d,
- Predicate pred)
+ template <class lock_type, class Duration>
+ cv_status
+ wait_until(
+ lock_type& lock,
+ const chrono::time_point<chrono::steady_clock, Duration>& t)
{
- return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
+ using namespace chrono;
+ typedef time_point<steady_clock, nanoseconds> nano_sys_tmpt;
+ wait_until(lock,
+ nano_sys_tmpt(ceil<nanoseconds>(t.time_since_epoch())));
+ return steady_clock::now() < t ? cv_status::no_timeout :
+ cv_status::timeout;
+ }
-// while (!pred())
-// {
-// if (wait_for(lock, d) == cv_status::timeout)
-// return pred();
-// }
-// return true;
+ template <class lock_type, class Clock, class Duration>
+ cv_status
+ wait_until(
+ lock_type& lock,
+ const chrono::time_point<Clock, Duration>& t)
+ {
+ using namespace chrono;
+ steady_clock::time_point s_now = steady_clock::now();
+ typename Clock::time_point c_now = Clock::now();
+ wait_until(lock, s_now + ceil<nanoseconds>(t - c_now));
+ return Clock::now() < t ? cv_status::no_timeout : cv_status::timeout;
}
- template <class lock_type>
- cv_status wait_until(
- lock_type& lk,
- chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
+ template <class lock_type, class Rep, class Period>
+ cv_status
+ wait_for(
+ lock_type& lock,
+ const chrono::duration<Rep, Period>& d)
+ {
+ using namespace chrono;
+ steady_clock::time_point c_now = steady_clock::now();
+ wait_until(lock, c_now + ceil<nanoseconds>(d));
+ return steady_clock::now() - c_now < d ? cv_status::no_timeout :
+ cv_status::timeout;
+ }
+
+ inline cv_status wait_until(
+ unique_lock<mutex>& lk,
+ chrono::time_point<chrono::steady_clock, chrono::nanoseconds> tp)
{
using namespace chrono;
nanoseconds d = tp.time_since_epoch();
@@ -328,6 +346,35 @@ namespace boost
if (do_wait_until(lk, ts)) return cv_status::no_timeout;
else return cv_status::timeout;
}
+
+#endif
+#endif // defined BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+
+#ifdef BOOST_THREAD_USES_CHRONO
+ template <class lock_type, class Clock, class Duration, class Predicate>
+ bool
+ wait_until(
+ lock_type& lock,
+ const chrono::time_point<Clock, Duration>& t,
+ Predicate pred)
+ {
+ while (!pred())
+ {
+ if (wait_until(lock, t) == cv_status::timeout)
+ return pred();
+ }
+ return true;
+ }
+
+ template <class lock_type, class Rep, class Period, class Predicate>
+ bool
+ wait_for(
+ lock_type& lock,
+ const chrono::duration<Rep, Period>& d,
+ Predicate pred)
+ {
+ return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
+ }
#endif
void notify_one() BOOST_NOEXCEPT
@@ -354,7 +401,7 @@ namespace boost
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
detail::interruption_checker check_for_interruption(&internal_mutex,&cond);
#else
- boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
+ boost::pthread::pthread_mutex_scoped_lock check_for_interruption(&internal_mutex);
#endif
guard.activate(m);
res=pthread_cond_timedwait(&cond,&internal_mutex,&timeout);
@@ -372,8 +419,6 @@ namespace boost
}
return true;
}
-
-
};
}
diff --git a/boost/thread/pthread/condition_variable_fwd.hpp b/boost/thread/pthread/condition_variable_fwd.hpp
index e18030fd5f..1255eac59b 100644
--- a/boost/thread/pthread/condition_variable_fwd.hpp
+++ b/boost/thread/pthread/condition_variable_fwd.hpp
@@ -28,6 +28,26 @@
namespace boost
{
+ namespace detail {
+ inline int monotonic_pthread_cond_init(pthread_cond_t& cond) {
+
+#ifdef BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+ pthread_condattr_t attr;
+ int res = pthread_condattr_init(&attr);
+ if (res)
+ {
+ return res;
+ }
+ pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+ res=pthread_cond_init(&cond,&attr);
+ pthread_condattr_destroy(&attr);
+ return res;
+#else
+ return pthread_cond_init(&cond,NULL);
+#endif
+
+ }
+ }
class condition_variable
{
@@ -56,19 +76,19 @@ namespace boost
condition_variable()
{
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
- int const res=pthread_mutex_init(&internal_mutex,NULL);
+ int res=pthread_mutex_init(&internal_mutex,NULL);
if(res)
{
boost::throw_exception(thread_resource_error(res, "boost::condition_variable::condition_variable() constructor failed in pthread_mutex_init"));
}
#endif
- int const res2=pthread_cond_init(&cond,NULL);
- if(res2)
+ res = detail::monotonic_pthread_cond_init(cond);
+ if (res)
{
#if defined BOOST_THREAD_PROVIDES_INTERRUPTIONS
BOOST_VERIFY(!pthread_mutex_destroy(&internal_mutex));
#endif
- boost::throw_exception(thread_resource_error(res2, "boost::condition_variable::condition_variable() constructor failed in pthread_cond_init"));
+ boost::throw_exception(thread_resource_error(res, "boost::condition_variable::condition_variable() constructor failed in detail::monotonic_pthread_cond_init"));
}
}
~condition_variable()
@@ -94,7 +114,6 @@ namespace boost
while(!pred()) wait(m);
}
-
#if defined BOOST_THREAD_USES_DATETIME
inline bool timed_wait(
unique_lock<mutex>& m,
@@ -120,6 +139,15 @@ namespace boost
unique_lock<mutex>& m,
duration_type const& wait_duration)
{
+ if (wait_duration.is_pos_infinity())
+ {
+ wait(m); // or do_wait(m,detail::timeout::sentinel());
+ return true;
+ }
+ if (wait_duration.is_special())
+ {
+ return true;
+ }
return timed_wait(m,get_system_time()+wait_duration);
}
@@ -149,10 +177,24 @@ namespace boost
unique_lock<mutex>& m,
duration_type const& wait_duration,predicate_type pred)
{
+ if (wait_duration.is_pos_infinity())
+ {
+ while (!pred())
+ {
+ wait(m); // or do_wait(m,detail::timeout::sentinel());
+ }
+ return true;
+ }
+ if (wait_duration.is_special())
+ {
+ return pred();
+ }
return timed_wait(m,get_system_time()+wait_duration,pred);
}
#endif
+#ifndef BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+
#ifdef BOOST_THREAD_USES_CHRONO
template <class Duration>
@@ -182,20 +224,6 @@ namespace boost
return Clock::now() < t ? cv_status::no_timeout : cv_status::timeout;
}
- template <class Clock, class Duration, class Predicate>
- bool
- wait_until(
- unique_lock<mutex>& lock,
- const chrono::time_point<Clock, Duration>& t,
- Predicate pred)
- {
- while (!pred())
- {
- if (wait_until(lock, t) == cv_status::timeout)
- return pred();
- }
- return true;
- }
template <class Rep, class Period>
@@ -213,6 +241,90 @@ namespace boost
}
+ inline cv_status wait_until(
+ unique_lock<mutex>& lk,
+ chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
+ {
+ using namespace chrono;
+ nanoseconds d = tp.time_since_epoch();
+ timespec ts = boost::detail::to_timespec(d);
+ if (do_wait_until(lk, ts)) return cv_status::no_timeout;
+ else return cv_status::timeout;
+ }
+#endif
+
+#else // defined BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+#ifdef BOOST_THREAD_USES_CHRONO
+
+ template <class Duration>
+ cv_status
+ wait_until(
+ unique_lock<mutex>& lock,
+ const chrono::time_point<chrono::steady_clock, Duration>& t)
+ {
+ using namespace chrono;
+ typedef time_point<steady_clock, nanoseconds> nano_sys_tmpt;
+ wait_until(lock,
+ nano_sys_tmpt(ceil<nanoseconds>(t.time_since_epoch())));
+ return steady_clock::now() < t ? cv_status::no_timeout :
+ cv_status::timeout;
+ }
+
+ template <class Clock, class Duration>
+ cv_status
+ wait_until(
+ unique_lock<mutex>& lock,
+ const chrono::time_point<Clock, Duration>& t)
+ {
+ using namespace chrono;
+ steady_clock::time_point s_now = steady_clock::now();
+ typename Clock::time_point c_now = Clock::now();
+ wait_until(lock, s_now + ceil<nanoseconds>(t - c_now));
+ return Clock::now() < t ? cv_status::no_timeout : cv_status::timeout;
+ }
+
+ template <class Rep, class Period>
+ cv_status
+ wait_for(
+ unique_lock<mutex>& lock,
+ const chrono::duration<Rep, Period>& d)
+ {
+ using namespace chrono;
+ steady_clock::time_point c_now = steady_clock::now();
+ wait_until(lock, c_now + ceil<nanoseconds>(d));
+ return steady_clock::now() - c_now < d ? cv_status::no_timeout :
+ cv_status::timeout;
+ }
+
+ inline cv_status wait_until(
+ unique_lock<mutex>& lk,
+ chrono::time_point<chrono::steady_clock, chrono::nanoseconds> tp)
+ {
+ using namespace chrono;
+ nanoseconds d = tp.time_since_epoch();
+ timespec ts = boost::detail::to_timespec(d);
+ if (do_wait_until(lk, ts)) return cv_status::no_timeout;
+ else return cv_status::timeout;
+ }
+#endif
+
+#endif // defined BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
+
+#ifdef BOOST_THREAD_USES_CHRONO
+ template <class Clock, class Duration, class Predicate>
+ bool
+ wait_until(
+ unique_lock<mutex>& lock,
+ const chrono::time_point<Clock, Duration>& t,
+ Predicate pred)
+ {
+ while (!pred())
+ {
+ if (wait_until(lock, t) == cv_status::timeout)
+ return pred();
+ }
+ return true;
+ }
template <class Rep, class Period, class Predicate>
bool
@@ -222,13 +334,6 @@ namespace boost
Predicate pred)
{
return wait_until(lock, chrono::steady_clock::now() + d, boost::move(pred));
-
-// while (!pred())
-// {
-// if (wait_for(lock, d) == cv_status::timeout)
-// return pred();
-// }
-// return true;
}
#endif
@@ -242,18 +347,7 @@ namespace boost
void notify_one() BOOST_NOEXCEPT;
void notify_all() BOOST_NOEXCEPT;
-#ifdef BOOST_THREAD_USES_CHRONO
- inline cv_status wait_until(
- unique_lock<mutex>& lk,
- chrono::time_point<chrono::system_clock, chrono::nanoseconds> tp)
- {
- using namespace chrono;
- nanoseconds d = tp.time_since_epoch();
- timespec ts = boost::detail::to_timespec(d);
- if (do_wait_until(lk, ts)) return cv_status::no_timeout;
- else return cv_status::timeout;
- }
-#endif
+
};
BOOST_THREAD_DECL void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);
diff --git a/boost/thread/pthread/once_atomic.hpp b/boost/thread/pthread/once_atomic.hpp
index 923f07bd90..c54a35c541 100644
--- a/boost/thread/pthread/once_atomic.hpp
+++ b/boost/thread/pthread/once_atomic.hpp
@@ -214,7 +214,7 @@ namespace boost
thread_detail::commit_once_region(flag);
}
}
-
+#if !(defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5130))
template<typename Function>
inline void call_once(once_flag& flag, BOOST_THREAD_RV_REF(Function) f)
{
@@ -302,7 +302,7 @@ namespace boost
}
}
-
+#endif // __SUNPRO_CC
#endif
}
diff --git a/boost/thread/shared_mutex.hpp b/boost/thread/shared_mutex.hpp
index b968f2ac10..ce5d6d1bfb 100644
--- a/boost/thread/shared_mutex.hpp
+++ b/boost/thread/shared_mutex.hpp
@@ -28,6 +28,7 @@
namespace boost
{
+ typedef shared_mutex shared_timed_mutex;
namespace sync
{
#ifdef BOOST_THREAD_NO_AUTO_DETECT_MUTEX_TYPES
diff --git a/boost/thread/v2/thread.hpp b/boost/thread/v2/thread.hpp
index 181661a34e..53560610e2 100644
--- a/boost/thread/v2/thread.hpp
+++ b/boost/thread/v2/thread.hpp
@@ -91,7 +91,19 @@ namespace boost
cv.wait_until(lk, t);
}
-#ifdef BOOST_THREAD_SLEEP_FOR_IS_STEADY
+#if defined BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC && defined BOOST_CHRONO_HAS_CLOCK_STEADY
+ template <class Rep, class Period>
+ void sleep_for(const chrono::duration<Rep, Period>& d)
+ {
+ using namespace chrono;
+ if (d > duration<Rep, Period>::zero())
+ {
+ steady_clock::time_point c_timeout = steady_clock::now() + ceil<nanoseconds>(d);
+ sleep_until(c_timeout);
+ }
+ }
+
+#elif defined BOOST_THREAD_SLEEP_FOR_IS_STEADY
template <class Rep, class Period>
void sleep_for(const chrono::duration<Rep, Period>& d)
@@ -127,7 +139,8 @@ namespace boost
using namespace chrono;
if (d > duration<Rep, Period>::zero())
{
- steady_clock::time_point c_timeout = steady_clock::now() + ceil<nanoseconds>(d);
+ //system_clock::time_point c_timeout = time_point_cast<system_clock::duration>(system_clock::now() + ceil<nanoseconds>(d));
+ system_clock::time_point c_timeout = system_clock::now() + ceil<system_clock::duration>(d);
sleep_until(c_timeout);
}
}
diff --git a/boost/thread/win32/condition_variable.hpp b/boost/thread/win32/condition_variable.hpp
index 14c23ce0e2..23e9e44484 100644
--- a/boost/thread/win32/condition_variable.hpp
+++ b/boost/thread/win32/condition_variable.hpp
@@ -339,8 +339,8 @@ namespace boost
{
if (wait_duration.is_pos_infinity())
{
- wait(m); // or do_wait(m,detail::timeout::sentinel());
- return true;
+ wait(m); // or do_wait(m,detail::timeout::sentinel());
+ return true;
}
if (wait_duration.is_special())
{
@@ -362,6 +362,18 @@ namespace boost
template<typename duration_type,typename predicate_type>
bool timed_wait(unique_lock<mutex>& m,duration_type const& wait_duration,predicate_type pred)
{
+ if (wait_duration.is_pos_infinity())
+ {
+ while (!pred())
+ {
+ wait(m); // or do_wait(m,detail::timeout::sentinel());
+ }
+ return true;
+ }
+ if (wait_duration.is_special())
+ {
+ return pred();
+ }
return do_wait(m,wait_duration.total_milliseconds(),pred);
}
#endif
diff --git a/boost/thread/win32/shared_mutex.hpp b/boost/thread/win32/shared_mutex.hpp
index fff97b7355..b7822d1142 100644
--- a/boost/thread/win32/shared_mutex.hpp
+++ b/boost/thread/win32/shared_mutex.hpp
@@ -139,6 +139,7 @@ namespace boost
void lock_shared()
{
+
#if defined BOOST_THREAD_USES_DATETIME
BOOST_VERIFY(timed_lock_shared(::boost::detail::get_system_time_sentinel()));
#else
@@ -389,6 +390,7 @@ namespace boost
void lock()
{
+
#if defined BOOST_THREAD_USES_DATETIME
BOOST_VERIFY(timed_lock(::boost::detail::get_system_time_sentinel()));
#else
@@ -739,6 +741,7 @@ namespace boost
new_state.upgrade=false;
bool const last_reader=!--new_state.shared_count;
+ new_state.shared_waiting=0;
if(last_reader)
{
if(new_state.exclusive_waiting)
@@ -746,7 +749,6 @@ namespace boost
--new_state.exclusive_waiting;
new_state.exclusive_waiting_blocked=false;
}
- new_state.shared_waiting=0;
}
state_data const current_state=interlocked_compare_exchange(&state,new_state,old_state);
diff --git a/boost/thread/win32/thread_data.hpp b/boost/thread/win32/thread_data.hpp
index 51f6273f43..005f3ba503 100644
--- a/boost/thread/win32/thread_data.hpp
+++ b/boost/thread/win32/thread_data.hpp
@@ -280,12 +280,13 @@ namespace boost
{
interruptible_wait(abs_time);
}
-#ifdef BOOST_THREAD_USES_CHRONO
- inline void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
- {
- interruptible_wait(chrono::duration_cast<chrono::milliseconds>(ns).count());
- }
-#endif
+// #11322 sleep_for() nanoseconds overload will always return too early on windows
+//#ifdef BOOST_THREAD_USES_CHRONO
+// inline void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
+// {
+// interruptible_wait(chrono::duration_cast<chrono::milliseconds>(ns).count());
+// }
+//#endif
namespace no_interruption_point
{
bool BOOST_THREAD_DECL non_interruptible_wait(detail::win32::handle handle_to_wait_for,detail::timeout target_time);
@@ -306,12 +307,13 @@ namespace boost
{
non_interruptible_wait(abs_time);
}
-#ifdef BOOST_THREAD_USES_CHRONO
- inline void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
- {
- non_interruptible_wait(chrono::duration_cast<chrono::milliseconds>(ns).count());
- }
-#endif
+// #11322 sleep_for() nanoseconds overload will always return too early on windows
+//#ifdef BOOST_THREAD_USES_CHRONO
+// inline void BOOST_SYMBOL_VISIBLE sleep_for(const chrono::nanoseconds& ns)
+// {
+// non_interruptible_wait(chrono::duration_cast<chrono::milliseconds>(ns).count());
+// }
+//#endif
}
}
diff --git a/boost/thread/win32/thread_primitives.hpp b/boost/thread/win32/thread_primitives.hpp
index d0d4f0aec3..b63503ad52 100644
--- a/boost/thread/win32/thread_primitives.hpp
+++ b/boost/thread/win32/thread_primitives.hpp
@@ -46,7 +46,7 @@ namespace boost
unsigned const create_event_manual_reset = 0x00000001;
unsigned const event_all_access = EVENT_ALL_ACCESS;
unsigned const semaphore_all_access = SEMAPHORE_ALL_ACCESS;
-
+
# ifdef BOOST_NO_ANSI_APIS
# if BOOST_USE_WINAPI_VERSION < BOOST_WINAPI_VERSION_VISTA
@@ -59,7 +59,7 @@ namespace boost
using ::CreateSemaphoreExW;
# endif
using ::OpenEventW;
- using ::GetModuleGandleW;
+ using ::GetModuleHandleW;
# else
using ::CreateMutexA;
using ::CreateEventA;
@@ -79,8 +79,8 @@ namespace boost
using ::ReleaseSemaphore;
using ::SetEvent;
using ::ResetEvent;
- using ::WaitForMultipleObjectsEx;
- using ::WaitForSingleObjectEx;
+ using ::WaitForMultipleObjectsEx;
+ using ::WaitForSingleObjectEx;
using ::GetCurrentProcessId;
using ::GetCurrentThreadId;
using ::GetCurrentThread;
@@ -91,7 +91,7 @@ namespace boost
using ::Sleep;
using ::QueueUserAPC;
using ::GetProcAddress;
-#endif
+#endif
}
}
}
@@ -286,7 +286,7 @@ namespace boost
}
// Oops, we weren't called often enough, we're stuck
- return 0xFFFFFFFF;
+ return 0xFFFFFFFF;
}
#else
#endif
@@ -295,12 +295,12 @@ namespace boost
static detail::gettickcount64_t gettickcount64impl;
if(gettickcount64impl)
return gettickcount64impl;
-
+
// GetTickCount and GetModuleHandle are not allowed in the Windows Runtime,
// and kernel32 isn't used in Windows Phone.
#if BOOST_PLAT_WINDOWS_RUNTIME
gettickcount64impl = &GetTickCount64;
-#else
+#else
farproc_t addr=GetProcAddress(
#if !defined(BOOST_NO_ANSI_APIS)
GetModuleHandleA("KERNEL32.DLL"),
@@ -312,7 +312,7 @@ namespace boost
gettickcount64impl=(detail::gettickcount64_t) addr;
else
gettickcount64impl=&GetTickCount64emulation;
-#endif
+#endif
return gettickcount64impl;
}
@@ -343,14 +343,14 @@ namespace boost
handle const res = win32::CreateEventW(0, type, state, mutex_name);
#else
handle const res = win32::CreateEventExW(
- 0,
- mutex_name,
+ 0,
+ mutex_name,
type ? create_event_manual_reset : 0 | state ? create_event_initial_set : 0,
event_all_access);
#endif
return res;
}
-
+
inline handle create_anonymous_event(event_type type,initial_event_state state)
{
handle const res = create_event(0, type, state);
@@ -374,7 +374,7 @@ namespace boost
#endif
return res;
}
-
+
inline handle create_anonymous_semaphore(long initial_count,long max_count)
{
handle const res=create_anonymous_semaphore_nothrow(initial_count,max_count);
@@ -402,20 +402,20 @@ namespace boost
{
BOOST_VERIFY(ReleaseSemaphore(semaphore,count,0)!=0);
}
-
+
inline void get_system_info(system_info *info)
{
#if BOOST_PLAT_WINDOWS_RUNTIME
- win32::GetNativeSystemInfo(info);
+ win32::GetNativeSystemInfo(info);
#else
win32::GetSystemInfo(info);
#endif
}
-
+
inline void sleep(unsigned long milliseconds)
{
if(milliseconds == 0)
- {
+ {
#if BOOST_PLAT_WINDOWS_RUNTIME
std::this_thread::yield();
#else
@@ -425,13 +425,13 @@ namespace boost
else
{
#if BOOST_PLAT_WINDOWS_RUNTIME
- ::boost::detail::win32::WaitForSingleObjectEx(::boost::detail::win32::GetCurrentThread(), milliseconds, 0);
+ ::boost::detail::win32::WaitForSingleObjectEx(::boost::detail::win32::GetCurrentThread(), milliseconds, 0);
#else
::boost::detail::win32::Sleep(milliseconds);
#endif
}
}
-
+
#if BOOST_PLAT_WINDOWS_RUNTIME
class BOOST_THREAD_DECL scoped_winrt_thread
{
@@ -639,7 +639,7 @@ namespace boost
}
old=current;
}
- while(true);
+ while(true) ;
return (old&value)!=0;
}
@@ -656,7 +656,7 @@ namespace boost
}
old=current;
}
- while(true);
+ while(true) ;
return (old&value)!=0;
}
}
diff --git a/boost/timer/timer.hpp b/boost/timer/timer.hpp
index 792a8abd32..7801cb11ac 100644
--- a/boost/timer/timer.hpp
+++ b/boost/timer/timer.hpp
@@ -11,7 +11,7 @@
#include <boost/config/warning_disable.hpp>
#include <boost/timer/config.hpp>
-#include <boost/chrono/chrono.hpp>
+//#include <boost/chrono/chrono.hpp>
#include <boost/cstdint.hpp>
#include <string>
#include <cstring>
diff --git a/boost/type_erasure/binding.hpp b/boost/type_erasure/binding.hpp
index a5023a59eb..c360baad9a 100644
--- a/boost/type_erasure/binding.hpp
+++ b/boost/type_erasure/binding.hpp
@@ -36,6 +36,9 @@
namespace boost {
namespace type_erasure {
+template<class P>
+class dynamic_binding;
+
namespace detail {
template<class Source, class Dest, class Map>
@@ -167,6 +170,24 @@ public:
{}
/**
+ * Converts from another set of bindings.
+ *
+ * \pre Map must be an MPL map with an entry for each placeholder
+ * referred to by @c Concept. The mapped type should be the
+ * corresponding placeholder in Concept2.
+ *
+ * \throws std::bad_alloc
+ * \throws std::bad_any_cast
+ */
+ template<class Placeholders, class Map>
+ binding(const dynamic_binding<Placeholders>& other, const static_binding<Map>&)
+ : impl(
+ other,
+ static_binding<Map>()
+ )
+ {}
+
+ /**
* \return true iff the sets of types that the placeholders
* bind to are the same for both arguments.
*
@@ -190,6 +211,8 @@ public:
private:
template<class C2>
friend class binding;
+ template<class P>
+ friend class dynamic_binding;
/** INTERNAL ONLY */
struct impl_type
{
@@ -234,6 +257,19 @@ private:
>(*other.impl.table);
table = manager.get();
}
+ template<class PlaceholderList, class Map>
+ impl_type(const dynamic_binding<PlaceholderList>& other, const static_binding<Map>&)
+ : manager(new table_type)
+ {
+ manager->template convert_from<
+ // FIXME: What do we need to do with deduced placeholder in other
+ typename ::boost::type_erasure::detail::add_deductions<
+ Map,
+ placeholder_subs
+ >::type
+ >(other.impl);
+ table = manager.get();
+ }
template<class Concept2, class Map>
impl_type(const binding<Concept2>& other, const static_binding<Map>&, boost::mpl::true_)
: table(other.impl.table),
diff --git a/boost/type_erasure/detail/adapt_to_vtable.hpp b/boost/type_erasure/detail/adapt_to_vtable.hpp
index 8f90395c74..e58ddc8599 100644
--- a/boost/type_erasure/detail/adapt_to_vtable.hpp
+++ b/boost/type_erasure/detail/adapt_to_vtable.hpp
@@ -35,6 +35,9 @@ namespace boost {
namespace type_erasure {
namespace detail {
+
+template<class T, class Out>
+struct get_placeholders;
template<class T, class Bindings>
struct rebind_placeholders;
@@ -54,6 +57,12 @@ struct rebind_placeholders<vtable_adapter<PrimitiveConcept, Sig>, Bindings>
> type;
};
+template<class PrimitiveConcept, class Sig, class Out>
+struct get_placeholders<vtable_adapter<PrimitiveConcept, Sig>, Out>
+{
+ typedef typename get_placeholders<PrimitiveConcept, Out>::type type;
+};
+
template<class T>
struct replace_param_for_vtable
{
@@ -194,6 +203,17 @@ struct vtable_adapter_impl<PrimitiveConcept, R(T...), R2(U...)>
};
template<class PrimitiveConcept, class... T, class R2, class... U>
+struct vtable_adapter_impl<PrimitiveConcept, ::boost::type_erasure::detail::storage(T...), R2(U...)>
+{
+ typedef ::boost::type_erasure::detail::storage (*type)(T...);
+ static ::boost::type_erasure::detail::storage value(T... arg)
+ {
+ return ::boost::type_erasure::detail::storage(
+ PrimitiveConcept::apply(::boost::type_erasure::detail::extract<U>(std::forward<T>(arg))...));
+ }
+};
+
+template<class PrimitiveConcept, class... T, class R2, class... U>
struct vtable_adapter_impl<PrimitiveConcept, ::boost::type_erasure::detail::storage&(T...), R2(U...)>
{
typedef ::boost::type_erasure::detail::storage (*type)(T...);
@@ -300,6 +320,24 @@ struct vtable_adapter<PrimitiveConcept, R(BOOST_PP_ENUM_PARAMS(N, T))>
template<class PrimitiveConcept
BOOST_PP_ENUM_TRAILING_PARAMS(N, class T)>
+struct vtable_adapter<PrimitiveConcept, ::boost::type_erasure::detail::storage(BOOST_PP_ENUM_PARAMS(N, T))>
+{
+ typedef ::boost::type_erasure::detail::storage (*type)(BOOST_PP_ENUM_PARAMS(N, T));
+ static ::boost::type_erasure::detail::storage value(BOOST_PP_ENUM_BINARY_PARAMS(N, T, arg))
+ {
+ typedef typename ::boost::function_traits<
+ typename ::boost::type_erasure::detail::get_signature<
+ PrimitiveConcept
+ >::type
+ > traits;
+ return ::boost::type_erasure::detail::storage(
+ PrimitiveConcept::apply(
+ BOOST_PP_ENUM(N, BOOST_TYPE_ERASURE_EXTRACT, ~)));
+ }
+};
+
+template<class PrimitiveConcept
+ BOOST_PP_ENUM_TRAILING_PARAMS(N, class T)>
struct vtable_adapter<PrimitiveConcept, ::boost::type_erasure::detail::storage&(BOOST_PP_ENUM_PARAMS(N, T))>
{
typedef ::boost::type_erasure::detail::storage (*type)(BOOST_PP_ENUM_PARAMS(N, T));
diff --git a/boost/type_erasure/detail/auto_link.hpp b/boost/type_erasure/detail/auto_link.hpp
new file mode 100644
index 0000000000..4f4392044b
--- /dev/null
+++ b/boost/type_erasure/detail/auto_link.hpp
@@ -0,0 +1,38 @@
+// Boost.TypeErasure library
+//
+// Copyright 2015 Steven Watanabe
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_DETAIL_AUTO_LINK_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_DETAIL_AUTO_LINK_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_TYPE_ERASURE_DYN_LINK)
+ #ifdef BOOST_TYPE_ERASURE_SOURCE
+ #define BOOST_TYPE_ERASURE_DECL BOOST_SYMBOL_EXPORT
+ #else
+ #define BOOST_TYPE_ERASURE_DECL BOOST_SYMBOL_IMPORT
+ #endif
+#else
+ #define BOOST_TYPE_ERASURE_DECL
+#endif
+
+#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_TYPE_ERASURE_NO_LIB) && !defined(BOOST_TYPE_ERASURE_SOURCE)
+
+ #define BOOST_LIB_NAME boost_type_erasure
+
+ #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_TYPE_ERASURE_DYN_LINK)
+ #define BOOST_DYN_LINK
+ #endif
+
+ #include <boost/config/auto_link.hpp>
+
+#endif
+
+#endif
diff --git a/boost/type_erasure/detail/check_map.hpp b/boost/type_erasure/detail/check_map.hpp
index 83435b6479..a51c95deb0 100644
--- a/boost/type_erasure/detail/check_map.hpp
+++ b/boost/type_erasure/detail/check_map.hpp
@@ -17,9 +17,11 @@
#include <boost/mpl/set.hpp>
#include <boost/mpl/has_key.hpp>
#include <boost/mpl/find_if.hpp>
+#include <boost/mpl/fold.hpp>
#include <boost/mpl/end.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_erasure/detail/get_placeholders.hpp>
+#include <boost/type_erasure/detail/normalize.hpp>
#include <boost/type_erasure/deduced.hpp>
#include <boost/type_erasure/static_binding.hpp>
diff --git a/boost/type_erasure/detail/dynamic_vtable.hpp b/boost/type_erasure/detail/dynamic_vtable.hpp
new file mode 100644
index 0000000000..9e014ed61b
--- /dev/null
+++ b/boost/type_erasure/detail/dynamic_vtable.hpp
@@ -0,0 +1,172 @@
+// Boost.TypeErasure library
+//
+// Copyright 2015 Steven Watanabe
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_DETAIL_DYNAMIC_VTABLE_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_DETAIL_DYNAMIC_VTABLE_HPP_INCLUDED
+
+#include <boost/type_erasure/detail/get_placeholders.hpp>
+#include <boost/type_erasure/detail/rebind_placeholders.hpp>
+#include <boost/type_erasure/detail/normalize.hpp>
+#include <boost/type_erasure/detail/adapt_to_vtable.hpp>
+#include <boost/type_erasure/detail/vtable.hpp>
+#include <boost/type_erasure/static_binding.hpp>
+#include <boost/type_erasure/register_binding.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <boost/mpl/index_of.hpp>
+#include <typeinfo>
+
+namespace boost {
+namespace type_erasure {
+namespace detail {
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)
+
+template<class P>
+struct dynamic_binding_impl
+{
+ const std::type_info * type;
+};
+
+template<class Table>
+struct append_to_key {
+ template<class P>
+ void operator()(P) {
+ key->push_back(static_cast<const dynamic_binding_impl<P>*>(table)->type);
+ }
+ const Table * table;
+ key_type * key;
+};
+
+template<class... P>
+struct dynamic_vtable : dynamic_binding_impl<P>... {
+ dynamic_vtable() = default;
+ template<class... T>
+ constexpr dynamic_vtable(T* ...t) : dynamic_binding_impl<P>{t}... {}
+ template<class F>
+ typename F::type lookup(F*) const {
+ key_type key;
+ typedef typename ::boost::type_erasure::detail::get_placeholders<F, ::boost::mpl::set0<> >::type placeholders;
+ typedef typename ::boost::mpl::fold<
+ placeholders,
+ ::boost::mpl::map0<>,
+ ::boost::type_erasure::detail::counting_map_appender
+ >::type placeholder_map;
+ key.push_back(&typeid(typename ::boost::type_erasure::detail::rebind_placeholders<F, placeholder_map>::type));
+ ::boost::mpl::for_each<placeholders>(append_to_key<dynamic_vtable>{this, &key});
+ return reinterpret_cast<typename F::type>(lookup_function_impl(key));
+ }
+ template<class Bindings>
+ void init() {
+ *this = dynamic_vtable(&typeid(typename boost::mpl::at<Bindings, P>::type)...);
+ }
+ template<class Bindings, class Src>
+ void convert_from(const Src& src) {
+ *this = dynamic_vtable(
+ (&src.lookup((::boost::type_erasure::typeid_<typename ::boost::mpl::at<Bindings, P>::type>*)0)())...);
+ }
+};
+
+template<class L>
+struct make_dynamic_vtable_impl;
+
+template<class... P>
+struct make_dynamic_vtable_impl<stored_arg_pack<P...> >
+{
+ typedef dynamic_vtable<P...> type;
+};
+
+template<class PlaceholderList>
+struct make_dynamic_vtable
+ : make_dynamic_vtable_impl<typename make_arg_pack<PlaceholderList>::type>
+{};
+
+#else
+
+template<class Bindings>
+struct dynamic_vtable_initializer
+{
+ dynamic_vtable_initializer(const std::type_info**& ptr) : types(&ptr) {}
+ template<class P>
+ void operator()(P)
+ {
+ *(*types)++ = &typeid(typename ::boost::mpl::at<Bindings, P>::type);
+ }
+ const ::std::type_info*** types;
+};
+
+template<class Placeholders>
+struct dynamic_vtable
+{
+ const ::std::type_info * types[(::boost::mpl::size<Placeholders>::value)];
+ struct append_to_key
+ {
+ append_to_key(const std::type_info * const * t, key_type* k) : types(t), key(k) {}
+ template<class P>
+ void operator()(P)
+ {
+ key->push_back(types[(::boost::mpl::index_of<Placeholders, P>::type::value)]);
+ }
+ const std::type_info * const * types;
+ key_type * key;
+ };
+ template<class F>
+ typename F::type lookup(F*) const {
+ key_type key;
+ typedef typename ::boost::type_erasure::detail::get_placeholders<F, ::boost::mpl::set0<> >::type placeholders;
+ typedef typename ::boost::mpl::fold<
+ placeholders,
+ ::boost::mpl::map0<>,
+ ::boost::type_erasure::detail::counting_map_appender
+ >::type placeholder_map;
+ key.push_back(&typeid(typename ::boost::type_erasure::detail::rebind_placeholders<F, placeholder_map>::type));
+ ::boost::mpl::for_each<placeholders>(append_to_key(types, &key));
+ return reinterpret_cast<typename F::type>(lookup_function_impl(key));
+ }
+ template<class Bindings>
+ void init()
+ {
+ const std::type_info* ptr = types;
+ ::boost::mpl::for_each<Placeholders>(dynamic_vtable_initializer<Bindings>(ptr));
+ }
+ template<class Bindings, class Src>
+ struct converter
+ {
+ converter(const std::type_info**& t, const Src& s) : types(&t), src(&s) {}
+ template<class P>
+ void operator()(P)
+ {
+ *(*types)++ = &src->lookup((::boost::type_erasure::typeid_<typename ::boost::mpl::at<Bindings, P>::type>*)0)();
+ }
+ const std::type_info*** types;
+ const Src * src;
+ };
+ template<class Bindings, class Src>
+ void convert_from(const Src& src) {
+ const ::std::type_info** ptr = types;
+ ::boost::mpl::for_each<Placeholders>(converter<Bindings, Src>(ptr, src));
+ }
+};
+
+template<class Placeholders>
+struct make_dynamic_vtable
+{
+ typedef dynamic_vtable<Placeholders> type;
+};
+
+#endif
+
+}
+}
+}
+
+#endif
diff --git a/boost/type_erasure/detail/rebind_placeholders.hpp b/boost/type_erasure/detail/rebind_placeholders.hpp
index a9cd546737..d93d429c5d 100644
--- a/boost/type_erasure/detail/rebind_placeholders.hpp
+++ b/boost/type_erasure/detail/rebind_placeholders.hpp
@@ -18,6 +18,7 @@
#include <boost/mpl/at.hpp>
#include <boost/mpl/has_key.hpp>
#include <boost/mpl/not.hpp>
+#include <boost/mpl/or.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/iteration/iterate.hpp>
diff --git a/boost/type_erasure/detail/storage.hpp b/boost/type_erasure/detail/storage.hpp
index 658a9fedca..8f8bf865ea 100644
--- a/boost/type_erasure/detail/storage.hpp
+++ b/boost/type_erasure/detail/storage.hpp
@@ -37,11 +37,11 @@ struct storage
storage(storage&& other) : data(other.data) {}
storage& operator=(const storage& other) { data = other.data; return *this; }
template<class T>
- storage(T&& arg) : data(new typename remove_cv<
+ explicit storage(T&& arg) : data(new typename remove_cv<
typename remove_reference<T>::type>::type(std::forward<T>(arg))) {}
#else
template<class T>
- storage(const T& arg) : data(new T(arg)) {}
+ explicit storage(const T& arg) : data(new T(arg)) {}
#endif
void* data;
};
diff --git a/boost/type_erasure/dynamic_any_cast.hpp b/boost/type_erasure/dynamic_any_cast.hpp
new file mode 100644
index 0000000000..01aa2b6ef9
--- /dev/null
+++ b/boost/type_erasure/dynamic_any_cast.hpp
@@ -0,0 +1,234 @@
+// Boost.TypeErasure library
+//
+// Copyright 2015 Steven Watanabe
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_DYNAMIC_ANY_CAST_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_DYNAMIC_ANY_CAST_HPP_INCLUDED
+
+#include <boost/type_erasure/detail/normalize.hpp>
+#include <boost/type_erasure/binding_of.hpp>
+#include <boost/type_erasure/static_binding.hpp>
+#include <boost/type_erasure/dynamic_binding.hpp>
+#include <boost/type_erasure/concept_of.hpp>
+#include <boost/type_erasure/placeholder_of.hpp>
+#include <boost/type_erasure/any.hpp>
+#include <boost/type_erasure/binding.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost {
+namespace type_erasure {
+
+namespace detail {
+
+template<class P, class P2, class Any>
+struct make_ref_placeholder;
+
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2, const Any&> { typedef const P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2, Any&> { typedef P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2&, const Any&> { typedef P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2&, Any&> { typedef P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, const P2&, const Any&> { typedef const P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, const P2&, Any&> { typedef const P& type; };
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template<class P, class P2, class Any>
+struct make_ref_placeholder { typedef P&& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2&, Any> { typedef P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, const P2&, Any> { typedef const P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2&&, Any> { typedef P&& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2&&, const Any&> { typedef const P& type; };
+template<class P, class P2, class Any>
+struct make_ref_placeholder<P, P2&&, Any&> { typedef P& type; };
+#endif
+
+template<class R, class Tag>
+struct make_result_placeholder_map
+{
+ typedef ::boost::mpl::map<
+ ::boost::mpl::pair<
+ typename ::boost::remove_const<
+ typename ::boost::remove_reference<
+ typename ::boost::type_erasure::placeholder_of<R>::type
+ >::type
+ >::type,
+ typename ::boost::remove_const<
+ typename ::boost::remove_reference<
+ Tag
+ >::type
+ >::type
+ >
+ > type;
+};
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template<class R, class Any, class Map>
+R dynamic_any_cast_impl(Any&& arg, const static_binding<Map>& map)
+#else
+template<class R, class Any, class Map>
+R dynamic_any_cast_impl(Any& arg, const static_binding<Map>& map)
+#endif
+{
+ typedef typename ::boost::remove_const<typename ::boost::remove_reference<Any>::type>::type src_type;
+ typedef typename ::boost::type_erasure::detail::normalize_concept<
+ typename ::boost::type_erasure::concept_of<src_type>::type
+ >::type normalized;
+ typedef typename ::boost::mpl::fold<
+ normalized,
+ ::boost::mpl::set0<>,
+ ::boost::type_erasure::detail::get_placeholders<
+ ::boost::mpl::_2,
+ ::boost::mpl::_1
+ >
+ >::type placeholders;
+ typedef ::boost::type_erasure::detail::substitution_map< ::boost::mpl::map0<> > identity_map;
+ ::boost::type_erasure::dynamic_binding<placeholders> my_binding(
+ ::boost::type_erasure::binding_of(arg),
+ ::boost::type_erasure::make_binding<identity_map>());
+ typedef typename ::boost::remove_const<
+ typename ::boost::remove_reference<
+ typename ::boost::type_erasure::placeholder_of<R>::type
+ >::type
+ >::type result_placeholder;
+ ::boost::type_erasure::binding< typename ::boost::type_erasure::concept_of<R>::type> new_binding(
+ my_binding,
+ map);
+ typedef ::boost::type_erasure::any<
+ typename ::boost::type_erasure::concept_of<R>::type,
+ typename ::boost::type_erasure::detail::make_ref_placeholder<
+ result_placeholder,
+ typename ::boost::type_erasure::placeholder_of<src_type>::type,
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ Any
+#else
+ Any&
+#endif
+ >::type
+ > result_ref_type;
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ return result_ref_type(std::forward<Any>(arg), new_binding);
+#else
+ return result_ref_type(arg, new_binding);
+#endif
+}
+
+}
+
+#ifdef BOOST_TYPE_ERASURE_DOXYGEN
+
+/**
+ * Downcasts or crosscasts an @ref any.
+ *
+ * \pre @c R and @c Any must both be specializations of @ref any.
+ * \pre PlaceholderMap must be an MPL map with a key
+ * for every non-deduced placeholder used by R.
+ * The value associated with each key should
+ * be the corresponding placeholder in Any.
+ * \pre The concept of Any must include @ref typeid_, for every
+ * @ref placeholder which is used by R.
+ *
+ * The single argument form can only be used when @c R uses
+ * a single non-deduced placeholder.
+ *
+ * \throws bad_any_cast if the concepts used by R were
+ * not previously registered via a call to
+ * @ref register_binding.
+ *
+ * Example:
+ * \code
+ * // Assume that typeid_<>, copy_constructible<>, and incrementable<>
+ * // have all been registered for int.
+ * any<mpl::vector<typeid_<>, copy_constructible<> > > x(1);
+ * typedef any<
+ * mpl::vector<
+ * typeid_<>,
+ * copy_constructible<>,
+ * incrementable<>
+ * >
+ * > incrementable_any;
+ * auto y = dynamic_any_cast<incrementable_any>(x);
+ * ++y;
+ * assert(any_cast<int>(y) == 2);
+ * \endcode
+ */
+template<class R, class Any>
+R dynamic_any_cast(Any&& arg);
+
+/**
+ * \overload
+ */
+template<class R, class Any, class Map>
+R dynamic_any_cast(Any&& arg, const static_binding<Map>&);
+
+#else
+
+template<class R, class Concept, class Tag>
+R dynamic_any_cast(const any<Concept, Tag>& arg)
+{
+ return ::boost::type_erasure::detail::dynamic_any_cast_impl<R>(arg,
+ ::boost::type_erasure::make_binding<typename ::boost::type_erasure::detail::make_result_placeholder_map<R, Tag>::type>());
+}
+
+template<class R, class Concept, class Tag>
+R dynamic_any_cast(any<Concept, Tag>& arg)
+{
+ return ::boost::type_erasure::detail::dynamic_any_cast_impl<R>(arg,
+ ::boost::type_erasure::make_binding<typename ::boost::type_erasure::detail::make_result_placeholder_map<R, Tag>::type>());
+}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template<class R, class Concept, class Tag>
+R dynamic_any_cast(any<Concept, Tag>&& arg)
+{
+ return ::boost::type_erasure::detail::dynamic_any_cast_impl<R>(::std::move(arg),
+ ::boost::type_erasure::make_binding<typename ::boost::type_erasure::detail::make_result_placeholder_map<R, Tag>::type>());
+}
+#endif
+
+template<class R, class Concept, class Tag, class Map>
+R dynamic_any_cast(const any<Concept, Tag>& arg, const static_binding<Map>& map)
+{
+ return ::boost::type_erasure::detail::dynamic_any_cast_impl<R>(arg, map);
+}
+
+template<class R, class Concept, class Tag, class Map>
+R dynamic_any_cast(any<Concept, Tag>& arg, const static_binding<Map>& map)
+{
+ return ::boost::type_erasure::detail::dynamic_any_cast_impl<R>(arg, map);
+}
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template<class R, class Concept, class Tag, class Map>
+R dynamic_any_cast(any<Concept, Tag>&& arg, const static_binding<Map>& map)
+{
+ return ::boost::type_erasure::detail::dynamic_any_cast_impl<R>(::std::move(arg), map);
+}
+#endif
+
+#endif
+
+}
+}
+
+#endif
diff --git a/boost/type_erasure/dynamic_binding.hpp b/boost/type_erasure/dynamic_binding.hpp
new file mode 100644
index 0000000000..de097bc2b2
--- /dev/null
+++ b/boost/type_erasure/dynamic_binding.hpp
@@ -0,0 +1,46 @@
+// Boost.TypeErasure library
+//
+// Copyright 2015 Steven Watanabe
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_DYNAMIC_BINDING_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_DYNAMIC_BINDING_HPP_INCLUDED
+
+#include <boost/type_erasure/detail/dynamic_vtable.hpp>
+#include <boost/type_erasure/static_binding.hpp>
+
+namespace boost {
+namespace type_erasure {
+
+/**
+ * Maps a set of placeholders to actual types.
+ */
+template<class PlaceholderList>
+class dynamic_binding
+{
+public:
+ template<class Map>
+ dynamic_binding(const static_binding<Map>&)
+ {
+ impl.template init<Map>();
+ }
+ template<class Concept, class Map>
+ dynamic_binding(const binding<Concept>& other, const static_binding<Map>&)
+ {
+ impl.template convert_from<Map>(*other.impl.table);
+ }
+private:
+ template<class Concept>
+ friend class binding;
+ typename ::boost::type_erasure::detail::make_dynamic_vtable<PlaceholderList>::type impl;
+};
+
+}
+}
+
+#endif
diff --git a/boost/type_erasure/is_placeholder.hpp b/boost/type_erasure/is_placeholder.hpp
index 9a191f7fd9..055ee621ad 100644
--- a/boost/type_erasure/is_placeholder.hpp
+++ b/boost/type_erasure/is_placeholder.hpp
@@ -17,19 +17,12 @@
namespace boost {
-/** INTERNAL ONLY */
-struct use_default;
-
namespace type_erasure {
/** A metafunction that indicates whether a type is a @ref placeholder. */
template<class T>
struct is_placeholder : ::boost::is_base_and_derived<placeholder, T> {};
-/** INTERNAL ONLY */
-template<>
-struct is_placeholder< ::boost::use_default> : ::boost::mpl::false_ {};
-
}
}
diff --git a/boost/type_erasure/iterator.hpp b/boost/type_erasure/iterator.hpp
index be6beb5307..eea471506d 100644
--- a/boost/type_erasure/iterator.hpp
+++ b/boost/type_erasure/iterator.hpp
@@ -14,6 +14,7 @@
#include <iterator>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/if.hpp>
+#include <boost/iterator/iterator_adaptor.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/type_traits/remove_reference.hpp>
@@ -24,10 +25,12 @@
namespace boost {
-struct use_default;
-
namespace type_erasure {
+/** INTERNAL ONLY */
+template<>
+struct is_placeholder< ::boost::use_default> : ::boost::mpl::false_ {};
+
namespace detail {
template<class T>
diff --git a/boost/type_erasure/register_binding.hpp b/boost/type_erasure/register_binding.hpp
new file mode 100644
index 0000000000..46364c9775
--- /dev/null
+++ b/boost/type_erasure/register_binding.hpp
@@ -0,0 +1,169 @@
+// Boost.TypeErasure library
+//
+// Copyright 2015 Steven Watanabe
+//
+// Distributed under the Boost Software License Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// $Id$
+
+#ifndef BOOST_TYPE_ERASURE_REGISTER_BINDING_HPP_INCLUDED
+#define BOOST_TYPE_ERASURE_REGISTER_BINDING_HPP_INCLUDED
+
+#include <boost/type_erasure/detail/check_map.hpp>
+#include <boost/type_erasure/detail/get_placeholders.hpp>
+#include <boost/type_erasure/detail/rebind_placeholders.hpp>
+#include <boost/type_erasure/detail/normalize.hpp>
+#include <boost/type_erasure/detail/adapt_to_vtable.hpp>
+#include <boost/type_erasure/detail/auto_link.hpp>
+#include <boost/type_erasure/static_binding.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/remove_if.hpp>
+#include <boost/mpl/fold.hpp>
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/has_key.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/set.hpp>
+#include <boost/mpl/map.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/pair.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <vector>
+#include <typeinfo>
+
+namespace boost {
+namespace type_erasure {
+namespace detail {
+
+typedef std::vector<const std::type_info*> key_type;
+typedef void (*value_type)();
+BOOST_TYPE_ERASURE_DECL void register_function_impl(const key_type& key, value_type fn);
+BOOST_TYPE_ERASURE_DECL value_type lookup_function_impl(const key_type& key);
+
+template<class Map>
+struct append_to_key_static {
+ append_to_key_static(key_type* k) : key(k) {}
+ template<class P>
+ void operator()(P) {
+ key->push_back(&typeid(typename ::boost::mpl::at<Map, P>::type));
+ }
+ key_type* key;
+};
+
+// This placeholder exists solely to create a normalized
+// representation of a primitive concept. For the moment
+// I'm going to be conservative and require a bijection
+// between the original placeholders and the normalized
+// placeholders. It should be safe to map everything
+// to a single placeholder, though, as long as the
+// key includes every instance of each placeholder
+// as a separate element. i.e. we should be able to
+// turn addable<_a, _b> into addable<_, _> and
+// addable<_a, _a> into addable<_, _> as well if we always
+// add typeids for both arguments to the search key.
+template<int N>
+struct _ : ::boost::type_erasure::placeholder {};
+
+struct counting_map_appender
+{
+ template<class State, class Key>
+ struct apply
+ {
+ typedef typename ::boost::mpl::insert<
+ State,
+ ::boost::mpl::pair<
+ Key,
+ ::boost::type_erasure::detail::_<
+ ::boost::mpl::size<State>::value
+ >
+ >
+ >::type type;
+ };
+};
+
+template<class Map>
+struct register_function {
+ template<class F>
+ void operator()(F) {
+ key_type key;
+ typedef typename ::boost::type_erasure::detail::get_placeholders<F, ::boost::mpl::set0<> >::type placeholders;
+ typedef typename ::boost::mpl::fold<
+ placeholders,
+ ::boost::mpl::map0<>,
+ ::boost::type_erasure::detail::counting_map_appender
+ >::type placeholder_map;
+ key.push_back(&typeid(typename ::boost::type_erasure::detail::rebind_placeholders<F, placeholder_map>::type));
+ ::boost::mpl::for_each<placeholders>(append_to_key_static<Map>(&key));
+ value_type fn = reinterpret_cast<value_type>(&::boost::type_erasure::detail::rebind_placeholders<F, Map>::type::value);
+ ::boost::type_erasure::detail::register_function_impl(key, fn);
+ }
+};
+
+}
+
+/**
+ * Registers a model of a concept to allow downcasting @ref any
+ * via @ref dynamic_any_cast.
+ */
+template<class Concept, class Map>
+void register_binding(const static_binding<Map>&)
+{
+ typedef typename ::boost::type_erasure::detail::normalize_concept<
+ Concept
+ >::type normalized;
+ typedef typename ::boost::mpl::transform<normalized,
+ ::boost::type_erasure::detail::maybe_adapt_to_vtable< ::boost::mpl::_1>
+ >::type actual_concept;
+ typedef typename ::boost::type_erasure::detail::get_placeholder_normalization_map<
+ Concept
+ >::type placeholder_subs;
+ typedef typename ::boost::type_erasure::detail::add_deductions<Map, placeholder_subs>::type actual_map;
+ ::boost::mpl::for_each<actual_concept>(::boost::type_erasure::detail::register_function<actual_map>());
+}
+
+/**
+ * \overload
+ */
+template<class Concept, class T>
+void register_binding()
+{
+ // Find all placeholders
+ typedef typename ::boost::type_erasure::detail::normalize_concept_impl<Concept>::type normalized;
+ typedef typename normalized::first basic;
+ typedef typename ::boost::mpl::fold<
+ basic,
+ ::boost::mpl::set0<>,
+ ::boost::type_erasure::detail::get_placeholders< ::boost::mpl::_2, ::boost::mpl::_1>
+ >::type all_placeholders;
+ // remove deduced placeholders
+ typedef typename ::boost::mpl::fold<
+ typename normalized::second,
+ ::boost::mpl::set0<>,
+ ::boost::mpl::insert< ::boost::mpl::_1, ::boost::mpl::second< ::boost::mpl::_2> >
+ >::type xtra_deduced;
+ typedef typename ::boost::mpl::remove_if<
+ all_placeholders,
+ ::boost::mpl::or_<
+ ::boost::type_erasure::detail::is_deduced< ::boost::mpl::_1>,
+ ::boost::mpl::has_key<xtra_deduced, ::boost::mpl::_1>
+ >,
+ ::boost::mpl::back_inserter< ::boost::mpl::vector0<> >
+ >::type unknown_placeholders;
+ // Bind the single remaining placeholder to T
+ BOOST_MPL_ASSERT((boost::mpl::equal_to<boost::mpl::size<unknown_placeholders>, boost::mpl::int_<1> >));
+ register_binding<Concept>(::boost::type_erasure::make_binding<
+ ::boost::mpl::map< ::boost::mpl::pair<typename ::boost::mpl::front<unknown_placeholders>::type, T> > >());
+}
+
+}
+}
+
+#endif
diff --git a/boost/type_traits.hpp b/boost/type_traits.hpp
index 398c6875f2..57680f89f6 100644
--- a/boost/type_traits.hpp
+++ b/boost/type_traits.hpp
@@ -21,39 +21,87 @@
#include "boost/type_traits/alignment_of.hpp"
#include "boost/type_traits/common_type.hpp"
#include "boost/type_traits/conditional.hpp"
+#include "boost/type_traits/copy_cv.hpp"
#include "boost/type_traits/decay.hpp"
+#include "boost/type_traits/declval.hpp"
#include "boost/type_traits/extent.hpp"
#include "boost/type_traits/floating_point_promotion.hpp"
#include "boost/type_traits/function_traits.hpp"
+
+#include "boost/type_traits/has_bit_and.hpp"
+#include "boost/type_traits/has_bit_and_assign.hpp"
+#include "boost/type_traits/has_bit_or.hpp"
+#include "boost/type_traits/has_bit_or_assign.hpp"
+#include "boost/type_traits/has_bit_xor.hpp"
+#include "boost/type_traits/has_bit_xor_assign.hpp"
+#include "boost/type_traits/has_complement.hpp"
+#include "boost/type_traits/has_dereference.hpp"
+#include "boost/type_traits/has_divides.hpp"
+#include "boost/type_traits/has_divides_assign.hpp"
+#include "boost/type_traits/has_equal_to.hpp"
+#include "boost/type_traits/has_greater.hpp"
+#include "boost/type_traits/has_greater_equal.hpp"
+#include "boost/type_traits/has_left_shift.hpp"
+#include "boost/type_traits/has_left_shift_assign.hpp"
+#include "boost/type_traits/has_less.hpp"
+#include "boost/type_traits/has_less_equal.hpp"
+#include "boost/type_traits/has_logical_and.hpp"
+#include "boost/type_traits/has_logical_not.hpp"
+#include "boost/type_traits/has_logical_or.hpp"
+#include "boost/type_traits/has_minus.hpp"
+#include "boost/type_traits/has_minus_assign.hpp"
+#include "boost/type_traits/has_modulus.hpp"
+#include "boost/type_traits/has_modulus_assign.hpp"
+#include "boost/type_traits/has_multiplies.hpp"
+#include "boost/type_traits/has_multiplies_assign.hpp"
+#include "boost/type_traits/has_negate.hpp"
#if !defined(__BORLANDC__) && !defined(__CUDACC__)
#include "boost/type_traits/has_new_operator.hpp"
#endif
+#include "boost/type_traits/has_not_equal_to.hpp"
#include "boost/type_traits/has_nothrow_assign.hpp"
#include "boost/type_traits/has_nothrow_constructor.hpp"
#include "boost/type_traits/has_nothrow_copy.hpp"
#include "boost/type_traits/has_nothrow_destructor.hpp"
-#include <boost/type_traits/has_operator.hpp>
+#include "boost/type_traits/has_plus.hpp"
+#include "boost/type_traits/has_plus_assign.hpp"
+#include "boost/type_traits/has_post_decrement.hpp"
+#include "boost/type_traits/has_post_increment.hpp"
+#include "boost/type_traits/has_pre_decrement.hpp"
+#include "boost/type_traits/has_pre_increment.hpp"
+#include "boost/type_traits/has_right_shift.hpp"
+#include "boost/type_traits/has_right_shift_assign.hpp"
#include "boost/type_traits/has_trivial_assign.hpp"
#include "boost/type_traits/has_trivial_constructor.hpp"
#include "boost/type_traits/has_trivial_copy.hpp"
#include "boost/type_traits/has_trivial_destructor.hpp"
#include "boost/type_traits/has_trivial_move_assign.hpp"
#include "boost/type_traits/has_trivial_move_constructor.hpp"
+#include "boost/type_traits/has_unary_minus.hpp"
+#include "boost/type_traits/has_unary_plus.hpp"
#include "boost/type_traits/has_virtual_destructor.hpp"
+
+#include "boost/type_traits/integral_constant.hpp"
+
#include "boost/type_traits/is_abstract.hpp"
#include "boost/type_traits/is_arithmetic.hpp"
#include "boost/type_traits/is_array.hpp"
+#include "boost/type_traits/is_assignable.hpp"
#include "boost/type_traits/is_base_and_derived.hpp"
#include "boost/type_traits/is_base_of.hpp"
#include "boost/type_traits/is_class.hpp"
-#include <boost/type_traits/is_complex.hpp>
+#include "boost/type_traits/is_complex.hpp"
#include "boost/type_traits/is_compound.hpp"
#include "boost/type_traits/is_const.hpp"
+#include "boost/type_traits/is_constructible.hpp"
#include "boost/type_traits/is_convertible.hpp"
-#include "boost/type_traits/is_copy_constructible.hpp"
#include "boost/type_traits/is_copy_assignable.hpp"
+#include "boost/type_traits/is_copy_constructible.hpp"
+#include "boost/type_traits/is_default_constructible.hpp"
+#include "boost/type_traits/is_destructible.hpp"
#include "boost/type_traits/is_empty.hpp"
#include "boost/type_traits/is_enum.hpp"
+#include "boost/type_traits/is_final.hpp"
#include "boost/type_traits/is_float.hpp"
#include "boost/type_traits/is_floating_point.hpp"
#include "boost/type_traits/is_function.hpp"
@@ -67,36 +115,36 @@
#include "boost/type_traits/is_nothrow_move_constructible.hpp"
#include "boost/type_traits/is_object.hpp"
#include "boost/type_traits/is_pod.hpp"
-#include "boost/type_traits/is_polymorphic.hpp"
#include "boost/type_traits/is_pointer.hpp"
+#include "boost/type_traits/is_polymorphic.hpp"
#include "boost/type_traits/is_reference.hpp"
#include "boost/type_traits/is_rvalue_reference.hpp"
-#include "boost/type_traits/is_signed.hpp"
#include "boost/type_traits/is_same.hpp"
#include "boost/type_traits/is_scalar.hpp"
+#include "boost/type_traits/is_signed.hpp"
#include "boost/type_traits/is_stateless.hpp"
#include "boost/type_traits/is_union.hpp"
#include "boost/type_traits/is_unsigned.hpp"
-#include "boost/type_traits/is_void.hpp"
#include "boost/type_traits/is_virtual_base_of.hpp"
+#include "boost/type_traits/is_void.hpp"
#include "boost/type_traits/is_volatile.hpp"
-#include <boost/type_traits/make_unsigned.hpp>
-#include <boost/type_traits/make_signed.hpp>
+#include "boost/type_traits/make_signed.hpp"
+#include "boost/type_traits/make_unsigned.hpp"
#include "boost/type_traits/rank.hpp"
-#include "boost/type_traits/remove_bounds.hpp"
-#include "boost/type_traits/remove_extent.hpp"
#include "boost/type_traits/remove_all_extents.hpp"
+#include "boost/type_traits/remove_bounds.hpp"
#include "boost/type_traits/remove_const.hpp"
#include "boost/type_traits/remove_cv.hpp"
+#include "boost/type_traits/remove_extent.hpp"
#include "boost/type_traits/remove_pointer.hpp"
#include "boost/type_traits/remove_reference.hpp"
#include "boost/type_traits/remove_volatile.hpp"
+#include "boost/type_traits/type_identity.hpp"
#include "boost/type_traits/type_with_alignment.hpp"
+
#if !(defined(__sgi) && defined(__EDG_VERSION__) && (__EDG_VERSION__ == 238))
#include "boost/type_traits/integral_promotion.hpp"
#include "boost/type_traits/promote.hpp"
#endif
-#include "boost/type_traits/ice.hpp"
-
#endif // BOOST_TYPE_TRAITS_HPP
diff --git a/boost/type_traits/add_const.hpp b/boost/type_traits/add_const.hpp
index 0a27f8a971..a9fb781c78 100644
--- a/boost/type_traits/add_const.hpp
+++ b/boost/type_traits/add_const.hpp
@@ -10,10 +10,7 @@
#ifndef BOOST_TT_ADD_CONST_HPP_INCLUDED
#define BOOST_TT_ADD_CONST_HPP_INCLUDED
-#include <boost/config.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
+#include <boost/type_traits/detail/config.hpp>
namespace boost {
@@ -30,16 +27,20 @@ namespace boost {
# pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored
#endif
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_const,T,T const)
+ template <class T> struct add_const
+ {
+ typedef T const type;
+ };
#if defined(BOOST_MSVC)
# pragma warning(pop)
#endif
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_const,T&,T&)
+ template <class T> struct add_const<T&>
+ {
+ typedef T& type;
+ };
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_CONST_HPP_INCLUDED
diff --git a/boost/type_traits/add_cv.hpp b/boost/type_traits/add_cv.hpp
index 66625c66c2..e62ddee0c4 100644
--- a/boost/type_traits/add_cv.hpp
+++ b/boost/type_traits/add_cv.hpp
@@ -13,9 +13,6 @@
#include <boost/config.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
// * convert a type T to a const volatile type - add_cv<T>
@@ -31,16 +28,14 @@ namespace boost {
# pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored
#endif
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_cv,T,T const volatile)
+template <class T> struct add_cv{ typedef T const volatile type; };
#if defined(BOOST_MSVC)
# pragma warning(pop)
#endif
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_cv,T&,T&)
+template <class T> struct add_cv<T&>{ typedef T& type; };
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_CV_HPP_INCLUDED
diff --git a/boost/type_traits/add_lvalue_reference.hpp b/boost/type_traits/add_lvalue_reference.hpp
index 1d7579476a..41851a1f34 100644
--- a/boost/type_traits/add_lvalue_reference.hpp
+++ b/boost/type_traits/add_lvalue_reference.hpp
@@ -8,19 +8,20 @@
#include <boost/type_traits/add_reference.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost{
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_lvalue_reference,T,typename boost::add_reference<T>::type)
+template <class T> struct add_lvalue_reference
+{
+ typedef typename boost::add_reference<T>::type type;
+};
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_lvalue_reference,T&&,T&)
+template <class T> struct add_lvalue_reference<T&&>
+{
+ typedef T& type;
+};
#endif
}
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP
diff --git a/boost/type_traits/add_pointer.hpp b/boost/type_traits/add_pointer.hpp
index 3e0e481894..745f63a084 100644
--- a/boost/type_traits/add_pointer.hpp
+++ b/boost/type_traits/add_pointer.hpp
@@ -11,13 +11,8 @@
#include <boost/type_traits/remove_reference.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x5A0)
//
// For some reason this implementation stops Borlands compiler
@@ -25,27 +20,27 @@ namespace detail {
// to arrays for some reason though (shrug...) (JM 20021104)
//
template <typename T>
-struct add_pointer_impl
+struct add_pointer
{
typedef T* type;
};
template <typename T>
-struct add_pointer_impl<T&>
+struct add_pointer<T&>
{
typedef T* type;
};
template <typename T>
-struct add_pointer_impl<T&const>
+struct add_pointer<T&const>
{
typedef T* type;
};
template <typename T>
-struct add_pointer_impl<T&volatile>
+struct add_pointer<T&volatile>
{
typedef T* type;
};
template <typename T>
-struct add_pointer_impl<T&const volatile>
+struct add_pointer<T&const volatile>
{
typedef T* type;
};
@@ -53,7 +48,7 @@ struct add_pointer_impl<T&const volatile>
#else
template <typename T>
-struct add_pointer_impl
+struct add_pointer
{
typedef typename remove_reference<T>::type no_ref_type;
typedef no_ref_type* type;
@@ -61,12 +56,6 @@ struct add_pointer_impl
#endif
-} // namespace detail
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_pointer,T,typename boost::detail::add_pointer_impl<T>::type)
-
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/add_reference.hpp b/boost/type_traits/add_reference.hpp
index 5e3efca692..526f259c87 100644
--- a/boost/type_traits/add_reference.hpp
+++ b/boost/type_traits/add_reference.hpp
@@ -9,13 +9,9 @@
#ifndef BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
#define BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
-#include <boost/type_traits/is_reference.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/config.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
namespace detail {
@@ -26,47 +22,38 @@ namespace detail {
//
template <typename T>
-struct add_reference_rvalue_layer
+struct add_reference_impl
{
typedef T& type;
};
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
template <typename T>
-struct add_reference_rvalue_layer<T&&>
+struct add_reference_impl<T&&>
{
typedef T&& type;
};
#endif
-template <typename T>
-struct add_reference_impl
+} // namespace detail
+
+template <class T> struct add_reference
{
- typedef typename add_reference_rvalue_layer<T>::type type;
+ typedef typename boost::detail::add_reference_impl<T>::type type;
+};
+template <class T> struct add_reference<T&>
+{
+ typedef T& type;
};
-
-BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1(typename T,add_reference,T&,T&)
// these full specialisations are always required:
-BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void,void)
+template <> struct add_reference<void> { typedef void type; };
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void const,void const)
-BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void volatile,void volatile)
-BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(add_reference,void const volatile,void const volatile)
-#endif
-
-} // namespace detail
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_reference,T,typename boost::detail::add_reference_impl<T>::type)
-
-// agurt, 07/mar/03: workaround Borland's ill-formed sensitivity to an additional
-// level of indirection, here
-#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_reference,T&,T&)
+template <> struct add_reference<const void> { typedef void type; };
+template <> struct add_reference<const volatile void> { typedef void type; };
+template <> struct add_reference<volatile void> { typedef void type; };
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/add_rvalue_reference.hpp b/boost/type_traits/add_rvalue_reference.hpp
index 242716f09c..44ead34803 100644
--- a/boost/type_traits/add_rvalue_reference.hpp
+++ b/boost/type_traits/add_rvalue_reference.hpp
@@ -15,9 +15,6 @@
#include <boost/type_traits/is_void.hpp>
#include <boost/type_traits/is_reference.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
//----------------------------------------------------------------------------//
// //
// C++03 implementation of //
@@ -56,11 +53,12 @@ namespace type_traits_detail {
}
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_rvalue_reference,T,typename boost::type_traits_detail::add_rvalue_reference_imp<T>::type)
+template <class T> struct add_rvalue_reference
+{
+ typedef typename boost::type_traits_detail::add_rvalue_reference_imp<T>::type type;
+};
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP
diff --git a/boost/type_traits/add_volatile.hpp b/boost/type_traits/add_volatile.hpp
index 86b529798e..24f515c802 100644
--- a/boost/type_traits/add_volatile.hpp
+++ b/boost/type_traits/add_volatile.hpp
@@ -12,9 +12,6 @@
#include <boost/config.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
// * convert a type T to volatile type - add_volatile<T>
@@ -30,16 +27,14 @@ namespace boost {
# pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored
#endif
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(add_volatile,T,T volatile)
+template <class T> struct add_volatile{ typedef T volatile type; };
#if defined(BOOST_MSVC)
# pragma warning(pop)
#endif
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,add_volatile,T&,T&)
+template <class T> struct add_volatile<T&>{ typedef T& type; };
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_VOLATILE_HPP_INCLUDED
diff --git a/boost/type_traits/aligned_storage.hpp b/boost/type_traits/aligned_storage.hpp
index 5420f26738..09f0c6b885 100755..100644
--- a/boost/type_traits/aligned_storage.hpp
+++ b/boost/type_traits/aligned_storage.hpp
@@ -1,13 +1,138 @@
+//-----------------------------------------------------------------------------
+// boost aligned_storage.hpp header file
+// See http://www.boost.org for updates, documentation, and revision history.
+//-----------------------------------------------------------------------------
+//
+// Copyright (c) 2002-2003
+// Eric Friedman, Itay Maman
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TT_ALIGNED_STORAGE_HPP
+#define BOOST_TT_ALIGNED_STORAGE_HPP
+
+#include <cstddef> // for std::size_t
+
+#include "boost/config.hpp"
+#include "boost/detail/workaround.hpp"
+#include "boost/type_traits/alignment_of.hpp"
+#include "boost/type_traits/type_with_alignment.hpp"
+#include "boost/type_traits/is_pod.hpp"
+#include "boost/type_traits/conditional.hpp"
+
+namespace boost {
+
+namespace detail { namespace aligned_storage {
+
+BOOST_STATIC_CONSTANT(
+ std::size_t
+ , alignment_of_max_align = ::boost::alignment_of<boost::detail::max_align>::value
+ );
+
+//
+// To be TR1 conforming this must be a POD type:
+//
+template <
+ std::size_t size_
+ , std::size_t alignment_
+>
+struct aligned_storage_imp
+{
+ union data_t
+ {
+ char buf[size_];
+
+ typename ::boost::type_with_alignment<alignment_>::type align_;
+ } data_;
+ void* address() const { return const_cast<aligned_storage_imp*>(this); }
+};
+template <std::size_t size>
+struct aligned_storage_imp<size, std::size_t(-1)>
+{
+ union data_t
+ {
+ char buf[size];
+ ::boost::detail::max_align align_;
+ } data_;
+ void* address() const { return const_cast<aligned_storage_imp*>(this); }
+};
+
+template< std::size_t alignment_ >
+struct aligned_storage_imp<0u,alignment_>
+{
+ /* intentionally empty */
+ void* address() const { return 0; }
+};
-// Copyright (C) John Maddock 2005.
-// Use, modification and distribution are subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt).
+}} // namespace detail::aligned_storage
+
+template <
+ std::size_t size_
+ , std::size_t alignment_ = std::size_t(-1)
+>
+class aligned_storage :
+#ifndef __BORLANDC__
+ private
+#else
+ public
+#endif
+ ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_>
+{
+
+public: // constants
+
+ typedef ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> type;
+
+ BOOST_STATIC_CONSTANT(
+ std::size_t
+ , size = size_
+ );
+ BOOST_STATIC_CONSTANT(
+ std::size_t
+ , alignment = (
+ alignment_ == std::size_t(-1)
+ ? ::boost::detail::aligned_storage::alignment_of_max_align
+ : alignment_
+ )
+ );
+
+private: // noncopyable
+
+ aligned_storage(const aligned_storage&);
+ aligned_storage& operator=(const aligned_storage&);
+
+public: // structors
+
+ aligned_storage()
+ {
+ }
+
+ ~aligned_storage()
+ {
+ }
+
+public: // accessors
+
+ void* address()
+ {
+ return static_cast<type*>(this)->address();
+ }
+
+ const void* address() const
+ {
+ return static_cast<const type*>(this)->address();
+ }
+};
+
+//
+// Make sure that is_pod recognises aligned_storage<>::type
+// as a POD (Note that aligned_storage<> itself is not a POD):
//
-// See http://www.boost.org/libs/type_traits for most recent version including documentation.
+template <std::size_t size_, std::size_t alignment_>
+struct is_pod< ::boost::detail::aligned_storage::aligned_storage_imp<size_, alignment_> > : public true_type{};
-#ifndef BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED
-# define BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED
-# include <boost/aligned_storage.hpp>
-#endif // BOOST_TT_ALIGNED_STORAGE_HPP_INCLUDED
+} // namespace boost
+#endif // BOOST_ALIGNED_STORAGE_HPP
diff --git a/boost/type_traits/alignment_of.hpp b/boost/type_traits/alignment_of.hpp
index 31a5f3839f..7d960e3184 100644
--- a/boost/type_traits/alignment_of.hpp
+++ b/boost/type_traits/alignment_of.hpp
@@ -13,8 +13,7 @@
#include <cstddef>
#include <boost/type_traits/intrinsics.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/size_t_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifdef BOOST_MSVC
# pragma warning(push)
@@ -86,29 +85,25 @@ struct alignment_of_impl
} // namespace detail
-BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(alignment_of,T,::boost::detail::alignment_of_impl<T>::value)
+template <class T> struct alignment_of : public integral_constant<std::size_t, ::boost::detail::alignment_of_impl<T>::value>{};
// references have to be treated specially, assume
// that a reference is just a special pointer:
-template <typename T>
-struct alignment_of<T&>
- : public alignment_of<T*>
-{
-};
+template <typename T> struct alignment_of<T&> : public alignment_of<T*>{};
+
#ifdef __BORLANDC__
// long double gives an incorrect value of 10 (!)
// unless we do this...
struct long_double_wrapper{ long double ld; };
-template<> struct alignment_of<long double>
- : public alignment_of<long_double_wrapper>{};
+template<> struct alignment_of<long double> : public alignment_of<long_double_wrapper>{};
#endif
// void has to be treated specially:
-BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void,0)
+template<> struct alignment_of<void> : integral_constant<std::size_t, 0>{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const,0)
-BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void volatile,0)
-BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const volatile,0)
+template<> struct alignment_of<void const> : integral_constant<std::size_t, 0>{};
+template<> struct alignment_of<void const volatile> : integral_constant<std::size_t, 0>{};
+template<> struct alignment_of<void volatile> : integral_constant<std::size_t, 0>{};
#endif
} // namespace boost
@@ -120,7 +115,5 @@ BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(alignment_of,void const volatile,0)
# pragma warning(pop)
#endif
-#include <boost/type_traits/detail/size_t_trait_undef.hpp>
-
#endif // BOOST_TT_ALIGNMENT_OF_HPP_INCLUDED
diff --git a/boost/type_traits/broken_compiler_spec.hpp b/boost/type_traits/broken_compiler_spec.hpp
index 3a13273594..030840f1c4 100644
--- a/boost/type_traits/broken_compiler_spec.hpp
+++ b/boost/type_traits/broken_compiler_spec.hpp
@@ -1,14 +1,21 @@
-// Copyright 2001-2003 Aleksey Gurtovoy.
+// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
//
// See http://www.boost.org/libs/type_traits for most recent version including documentation.
-#ifndef BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED
-#define BOOST_TT_BROKEN_COMPILER_SPEC_HPP_INCLUDED
-
-#include <boost/type_traits/config.hpp>
+#ifndef BOOST_TT_BROKEN_SPEC_HPP_INCLUDED
+#define BOOST_TT_BROKEN_SPEC_HPP_INCLUDED
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (boost/type_traits/broken_compiler_spec.hpp) is deprecated")
#endif
+
+#endif // BOOST_TT_CONFIG_HPP_INCLUDED
+
+
diff --git a/boost/type_traits/common_type.hpp b/boost/type_traits/common_type.hpp
index b52ff167eb..5c4303b9ec 100644
--- a/boost/type_traits/common_type.hpp
+++ b/boost/type_traits/common_type.hpp
@@ -1,157 +1,144 @@
-// common_type.hpp ---------------------------------------------------------//
-
-// Copyright 2008 Howard Hinnant
-// Copyright 2008 Beman Dawes
+#ifndef BOOST_TYPE_TRAITS_COMMON_TYPE_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_COMMON_TYPE_HPP_INCLUDED
+//
+// Copyright 2015 Peter Dimov
+//
// Distributed under the Boost Software License, Version 1.0.
-// See http://www.boost.org/LICENSE_1_0.txt
-
-#ifndef BOOST_TYPE_TRAITS_COMMON_TYPE_HPP
-#define BOOST_TYPE_TRAITS_COMMON_TYPE_HPP
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
#include <boost/config.hpp>
+#include <boost/type_traits/decay.hpp>
+#include <boost/type_traits/declval.hpp>
-#if defined(__SUNPRO_CC) && !defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
-# define BOOST_COMMON_TYPE_DONT_USE_TYPEOF
-#endif
-#if defined(__IBMCPP__) && !defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
-# define BOOST_COMMON_TYPE_DONT_USE_TYPEOF
+#if defined(BOOST_NO_CXX11_DECLTYPE)
+#include <boost/type_traits/detail/common_type_impl.hpp>
#endif
-//----------------------------------------------------------------------------//
-#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_COMMON_TYPE_ARITY)
-#define BOOST_COMMON_TYPE_ARITY 3
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+#include <boost/type_traits/detail/mp_defer.hpp>
#endif
-//----------------------------------------------------------------------------//
-#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
-#include <boost/typeof/typeof.hpp> // boost wonders never cease!
-#endif
+namespace boost
+{
-//----------------------------------------------------------------------------//
-#ifndef BOOST_NO_CXX11_STATIC_ASSERT
-#define BOOST_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) static_assert(CND,MSG)
-#elif defined(BOOST_COMMON_TYPE_USES_MPL_ASSERT)
-#include <boost/mpl/assert.hpp>
-#include <boost/mpl/bool.hpp>
-#define BOOST_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) \
- BOOST_MPL_ASSERT_MSG(boost::mpl::bool_< (CND) >::type::value, MSG, TYPES)
-#else
-#include <boost/static_assert.hpp>
-#define BOOST_COMMON_TYPE_STATIC_ASSERT(CND, MSG, TYPES) BOOST_STATIC_ASSERT(CND)
-#endif
+// variadic common_type
-#if !defined(BOOST_NO_CXX11_STATIC_ASSERT) || !defined(BOOST_COMMON_TYPE_USES_MPL_ASSERT)
-#define BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE "must be complete type"
-#endif
-
-#if defined(BOOST_NO_CXX11_DECLTYPE) && defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
-#include <boost/type_traits/detail/common_type_imp.hpp>
-#include <boost/type_traits/remove_cv.hpp>
-#endif
-#include <boost/mpl/if.hpp>
-#include <boost/utility/declval.hpp>
-#include <boost/type_traits/add_rvalue_reference.hpp>
-
-//----------------------------------------------------------------------------//
-// //
-// C++03 implementation of //
-// 20.9.7.6 Other transformations [meta.trans.other] //
-// Written by Howard Hinnant //
-// Adapted for Boost by Beman Dawes, Vicente Botet and Jeffrey Hellrung //
-// //
-//----------------------------------------------------------------------------//
-
-namespace boost {
-
-// prototype
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- template<typename... T>
- struct common_type;
-#else // or no specialization
- template <class T, class U = void, class V = void>
- struct common_type
- {
- public:
- typedef typename common_type<typename common_type<T, U>::type, V>::type type;
- };
-#endif
+template<class... T> struct common_type
+{
+};
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+template<class... T> using common_type_t = typename common_type<T...>::type;
+
+namespace type_traits_detail
+{
+
+template<class T1, class T2, class... T> using common_type_fold = common_type_t<common_type_t<T1, T2>, T...>;
+
+} // namespace type_traits_detail
+
+template<class T1, class T2, class... T>
+struct common_type<T1, T2, T...>: type_traits_detail::mp_defer<type_traits_detail::common_type_fold, T1, T2, T...>
+{
+};
-// 1 arg
- template<typename T>
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- struct common_type<T>
#else
- struct common_type<T, void, void>
-#endif
- {
- BOOST_COMMON_TYPE_STATIC_ASSERT(sizeof(T) > 0, BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (T));
- public:
- typedef T type;
- };
-
-// 2 args
-namespace type_traits_detail {
-
- template <class T, class U>
- struct common_type_2
- {
- private:
- BOOST_COMMON_TYPE_STATIC_ASSERT(sizeof(T) > 0, BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (T));
- BOOST_COMMON_TYPE_STATIC_ASSERT(sizeof(U) > 0, BOOST_COMMON_TYPE_MUST_BE_A_COMPLE_TYPE, (U));
- static bool declval_bool(); // workaround gcc bug; not required by std
- static typename add_rvalue_reference<T>::type declval_T(); // workaround gcc bug; not required by std
- static typename add_rvalue_reference<U>::type declval_U(); // workaround gcc bug; not required by std
- static typename add_rvalue_reference<bool>::type declval_b();
+template<class T1, class T2, class... T>
+struct common_type<T1, T2, T...>: common_type<typename common_type<T1, T2>::type, T...>
+{
+};
+
+#endif // !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+
+#else
+
+template<
+ class T1 = void, class T2 = void, class T3 = void,
+ class T4 = void, class T5 = void, class T6 = void,
+ class T7 = void, class T8 = void, class T9 = void
+>
+struct common_type: common_type<typename common_type<T1, T2>::type, T3, T4, T5, T6, T7, T8, T9>
+{
+};
+
+#endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+// one argument
+
+template<class T> struct common_type<T>: boost::decay<T>
+{
+};
+
+// two arguments
+
+namespace type_traits_detail
+{
+
+// binary common_type
#if !defined(BOOST_NO_CXX11_DECLTYPE)
- public:
- typedef decltype(declval<bool>() ? declval<T>() : declval<U>()) type;
-#elif defined(BOOST_COMMON_TYPE_DONT_USE_TYPEOF)
- public:
- typedef typename detail_type_traits_common_type::common_type_impl<
- typename remove_cv<T>::type,
- typename remove_cv<U>::type
- >::type type;
+
+#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+#if !defined(BOOST_MSVC) || BOOST_MSVC > 1800
+
+// internal compiler error on msvc-12.0
+
+template<class T1, class T2> using builtin_common_type = typename boost::decay<decltype( boost::declval<bool>()? boost::declval<T1>(): boost::declval<T2>() )>::type;
+
+template<class T1, class T2> struct common_type_impl: mp_defer<builtin_common_type, T1, T2>
+{
+};
+
#else
- public:
- typedef BOOST_TYPEOF_TPL(declval_b() ? declval_T() : declval_U()) type;
-#endif
-#if defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ == 3
- public:
- void public_dummy_function_just_to_silence_warning();
-#endif
- };
+template<class T1, class T2> using builtin_common_type = decltype( boost::declval<bool>()? boost::declval<T1>(): boost::declval<T2>() );
- template <class T>
- struct common_type_2<T, T>
- {
- typedef T type;
- };
- }
+template<class T1, class T2> struct common_type_impl_2: mp_defer<builtin_common_type, T1, T2>
+{
+};
+
+template<class T1, class T2> using decay_common_type = typename boost::decay<typename common_type_impl_2<T1, T2>::type>::type;
+
+template<class T1, class T2> struct common_type_impl: mp_defer<decay_common_type, T1, T2>
+{
+};
+
+#endif // !defined(BOOST_MSVC) || BOOST_MSVC > 1800
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- template <class T, class U>
- struct common_type<T, U>
#else
- template <class T, class U>
- struct common_type<T, U, void>
-#endif
- : public type_traits_detail::common_type_2<T,U>
- { };
+template<class T1, class T2> struct common_type_impl: boost::decay<decltype( boost::declval<bool>()? boost::declval<T1>(): boost::declval<T2>() )>
+{
+};
-// 3 or more args
-#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- template<typename T, typename U, typename... V>
- struct common_type<T, U, V...> {
- public:
- typedef typename common_type<typename common_type<T, U>::type, V...>::type type;
- };
-#endif
-} // namespace boost
+#endif // #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
+
+#endif // #if !defined(BOOST_NO_CXX11_DECLTYPE)
+
+// decay helper
+
+template<class T1, class T2, class T1d = typename boost::decay<T1>::type, class T2d = typename boost::decay<T2>::type> struct common_type_decay_helper: boost::common_type<T1d, T2d>
+{
+};
+
+template<class T1, class T2> struct common_type_decay_helper<T1, T2, T1, T2>: common_type_impl<T1, T2>
+{
+};
+
+} // type_traits_detail
+
+template<class T1, class T2> struct common_type<T1, T2>: type_traits_detail::common_type_decay_helper<T1, T2>
+{
+};
+
+} // namespace boost
-#endif // BOOST_TYPE_TRAITS_COMMON_TYPE_HPP
+#endif // #ifndef BOOST_TYPE_TRAITS_COMMON_TYPE_HPP_INCLUDED
diff --git a/boost/type_traits/conditional.hpp b/boost/type_traits/conditional.hpp
index 8bbda85fc6..b7e82dbe82 100644
--- a/boost/type_traits/conditional.hpp
+++ b/boost/type_traits/conditional.hpp
@@ -1,4 +1,3 @@
-
// (C) Copyright John Maddock 2010.
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,14 +9,10 @@
#ifndef BOOST_TT_CONDITIONAL_HPP_INCLUDED
#define BOOST_TT_CONDITIONAL_HPP_INCLUDED
-#include <boost/mpl/if.hpp>
-
namespace boost {
-template <bool b, class T, class U>
-struct conditional : public mpl::if_c<b, T, U>
-{
-};
+template <bool b, class T, class U> struct conditional { typedef T type; };
+template <class T, class U> struct conditional<false, T, U> { typedef U type; };
} // namespace boost
diff --git a/boost/type_traits/config.hpp b/boost/type_traits/config.hpp
index 2e25ad01ff..47a06483ef 100644
--- a/boost/type_traits/config.hpp
+++ b/boost/type_traits/config.hpp
@@ -6,67 +6,16 @@
//
// See http://www.boost.org/libs/type_traits for most recent version including documentation.
-#ifndef BOOST_TT_CONFIG_HPP_INCLUDED
-#define BOOST_TT_CONFIG_HPP_INCLUDED
-
-#ifndef BOOST_CONFIG_HPP
-#include <boost/config.hpp>
-#endif
-
-#include <boost/detail/workaround.hpp>
+#ifndef BOOST_TT_OLD_CONFIG_HPP_INCLUDED
+#define BOOST_TT_OLD_CONFIG_HPP_INCLUDED
//
-// whenever we have a conversion function with ellipses
-// it needs to be declared __cdecl to suppress compiler
-// warnings from MS and Borland compilers (this *must*
-// appear before we include is_same.hpp below):
-#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32))
-# define BOOST_TT_DECL __cdecl
-#else
-# define BOOST_TT_DECL /**/
-#endif
-
-# if (BOOST_WORKAROUND(__MWERKS__, < 0x3000) \
- || BOOST_WORKAROUND(__IBMCPP__, < 600 ) \
- || BOOST_WORKAROUND(__BORLANDC__, < 0x5A0) \
- || defined(__ghs) \
- || BOOST_WORKAROUND(__HP_aCC, < 60700) \
- || BOOST_WORKAROUND(MPW_CPLUS, BOOST_TESTED_AT(0x890)) \
- || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))) \
- && defined(BOOST_NO_IS_ABSTRACT)
-
-# define BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION 1
-
-#endif
-
-#ifndef BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION
-# define BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION 1
-#endif
-
-//
-// define BOOST_TT_TEST_MS_FUNC_SIGS
-// when we want to test __stdcall etc function types with is_function etc
-// (Note, does not work with Borland, even though it does support __stdcall etc):
+// This header is deprecated and no longer used by type_traits:
//
-#if defined(_MSC_EXTENSIONS) && !defined(__BORLANDC__)
-# define BOOST_TT_TEST_MS_FUNC_SIGS
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (boost/type_traits/config.hpp) is deprecated")
#endif
-//
-// define BOOST_TT_NO_CV_FUNC_TEST
-// if tests for cv-qualified member functions don't
-// work in is_member_function_pointer
-//
-#if BOOST_WORKAROUND(__MWERKS__, < 0x3000) || BOOST_WORKAROUND(__IBMCPP__, <= 600)
-# define BOOST_TT_NO_CV_FUNC_TEST
-#endif
-
-//
-// Macros that have been deprecated, defined here for backwards compatibility:
-//
-#define BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(x)
-#define BOOST_TT_BROKEN_COMPILER_SPEC(x)
-
#endif // BOOST_TT_CONFIG_HPP_INCLUDED
diff --git a/boost/type_traits/copy_cv.hpp b/boost/type_traits/copy_cv.hpp
new file mode 100644
index 0000000000..1605ca3356
--- /dev/null
+++ b/boost/type_traits/copy_cv.hpp
@@ -0,0 +1,34 @@
+#ifndef BOOST_TYPE_TRAITS_COPY_CV_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_COPY_CV_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_volatile.hpp>
+#include <boost/type_traits/conditional.hpp>
+
+namespace boost
+{
+
+template<class T, class U> struct copy_cv
+{
+private:
+
+ typedef typename boost::conditional<boost::is_const<U>::value, typename boost::add_const<T>::type, T>::type CT;
+
+public:
+
+ typedef typename boost::conditional<boost::is_volatile<U>::value, typename boost::add_volatile<CT>::type, CT>::type type;
+};
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_COPY_CV_HPP_INCLUDED
diff --git a/boost/type_traits/decay.hpp b/boost/type_traits/decay.hpp
index c23a9b0f15..4e8118433e 100755..100644
--- a/boost/type_traits/decay.hpp
+++ b/boost/type_traits/decay.hpp
@@ -9,33 +9,32 @@
#ifndef BOOST_TT_DECAY_HPP_INCLUDED
#define BOOST_TT_DECAY_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/is_array.hpp>
#include <boost/type_traits/is_function.hpp>
#include <boost/type_traits/remove_bounds.hpp>
#include <boost/type_traits/add_pointer.hpp>
#include <boost/type_traits/remove_reference.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/remove_cv.hpp>
namespace boost
{
+ namespace detail
+ {
+
+ template <class T, bool Array, bool Function> struct decay_imp { typedef typename remove_cv<T>::type type; };
+ template <class T> struct decay_imp<T, true, false> { typedef typename remove_bounds<T>::type* type; };
+ template <class T> struct decay_imp<T, false, true> { typedef T* type; };
+
+ }
+
template< class T >
struct decay
{
private:
- typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type Ty;
+ typedef typename remove_reference<T>::type Ty;
public:
- typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
- is_array<Ty>,
- mpl::identity<BOOST_DEDUCED_TYPENAME remove_bounds<Ty>::type*>,
- BOOST_DEDUCED_TYPENAME mpl::eval_if<
- is_function<Ty>,
- add_pointer<Ty>,
- mpl::identity<Ty>
- >
- >::type type;
+ typedef typename boost::detail::decay_imp<Ty, boost::is_array<Ty>::value, boost::is_function<Ty>::value>::type type;
};
} // namespace boost
diff --git a/boost/type_traits/declval.hpp b/boost/type_traits/declval.hpp
new file mode 100644
index 0000000000..a050012eb5
--- /dev/null
+++ b/boost/type_traits/declval.hpp
@@ -0,0 +1,44 @@
+// declval.hpp -------------------------------------------------------------//
+
+// Copyright 2010 Vicente J. Botet Escriba
+
+// Distributed under the Boost Software License, Version 1.0.
+// See http://www.boost.org/LICENSE_1_0.txt
+
+#ifndef BOOST_TYPE_TRAITS_DECLVAL_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_DECLVAL_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+//----------------------------------------------------------------------------//
+
+#include <boost/type_traits/add_rvalue_reference.hpp>
+
+//----------------------------------------------------------------------------//
+// //
+// C++03 implementation of //
+// 20.2.4 Function template declval [declval] //
+// Written by Vicente J. Botet Escriba //
+// //
+// 1 The library provides the function template declval to simplify the
+// definition of expressions which occur as unevaluated operands.
+// 2 Remarks: If this function is used, the program is ill-formed.
+// 3 Remarks: The template parameter T of declval may be an incomplete type.
+// [ Example:
+//
+// template <class To, class From>
+// decltype(static_cast<To>(declval<From>())) convert(From&&);
+//
+// declares a function template convert which only participates in overloading
+// if the type From can be explicitly converted to type To. For another example
+// see class template common_type (20.9.7.6). -end example ]
+//----------------------------------------------------------------------------//
+
+namespace boost {
+
+ template <typename T>
+ typename add_rvalue_reference<T>::type declval() BOOST_NOEXCEPT; // as unevaluated operand
+
+} // namespace boost
+
+#endif // BOOST_TYPE_TRAITS_DECLVAL_HPP_INCLUDED
diff --git a/boost/type_traits/detail/bool_trait_def.hpp b/boost/type_traits/detail/bool_trait_def.hpp
index 69e4f1ca62..b6b0677d68 100644
--- a/boost/type_traits/detail/bool_trait_def.hpp
+++ b/boost/type_traits/detail/bool_trait_def.hpp
@@ -11,10 +11,15 @@
// $Date$
// $Revision$
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (bool_trait_def.hpp) is deprecated")
+#endif
+
#include <boost/type_traits/detail/template_arity_spec.hpp>
#include <boost/type_traits/integral_constant.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/aux_/lambda_support.hpp>
#include <boost/config.hpp>
//
@@ -39,14 +44,6 @@
#undef BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1
#endif
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x570)
-# define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- typedef ::boost::integral_constant<bool,C> type; \
- enum { value = type::value }; \
- /**/
-# define BOOST_TT_AUX_BOOL_C_BASE(C)
-#endif
-
#ifndef BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL
# define BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) /**/
#endif
@@ -62,7 +59,6 @@ template< typename T > struct trait \
{ \
public:\
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
}; \
\
BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \
@@ -75,7 +71,6 @@ template< typename T1, typename T2 > struct trait \
{ \
public:\
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT(2,trait,(T1,T2)) \
}; \
\
BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(2,trait) \
@@ -87,7 +82,6 @@ template< typename T1, typename T2, typename T3 > struct trait \
{ \
public:\
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT(3,trait,(T1,T2,T3)) \
}; \
\
BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(3,trait) \
@@ -99,7 +93,6 @@ template<> struct trait< sp > \
{ \
public:\
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(sp)) \
}; \
/**/
@@ -109,7 +102,6 @@ template<> struct trait< sp1,sp2 > \
{ \
public:\
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,trait,(sp1,sp2)) \
}; \
/**/
@@ -153,7 +145,6 @@ template< param > struct trait< sp1,sp2 > \
{ \
public:\
BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2,trait,(sp1,sp2)) \
}; \
/**/
diff --git a/boost/type_traits/detail/common_arithmetic_type.hpp b/boost/type_traits/detail/common_arithmetic_type.hpp
new file mode 100644
index 0000000000..7211002218
--- /dev/null
+++ b/boost/type_traits/detail/common_arithmetic_type.hpp
@@ -0,0 +1,212 @@
+#ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_ARITHMETIC_TYPE_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_DETAIL_COMMON_ARITHMETIC_TYPE_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/config.hpp>
+
+namespace boost
+{
+
+namespace type_traits_detail
+{
+
+template<int I> struct arithmetic_type;
+
+// Types bool, char, char16_t, char32_t, wchar_t,
+// and the signed and unsigned integer types are
+// collectively called integral types
+
+template<> struct arithmetic_type<1>
+{
+ typedef bool type;
+ typedef char (&result_type) [1];
+};
+
+template<> struct arithmetic_type<2>
+{
+ typedef char type;
+ typedef char (&result_type) [2];
+};
+
+template<> struct arithmetic_type<3>
+{
+ typedef wchar_t type;
+ typedef char (&result_type) [3];
+};
+
+// There are five standard signed integer types:
+// “signed charâ€, “short intâ€, “intâ€, “long intâ€, and “long long intâ€.
+
+template<> struct arithmetic_type<4>
+{
+ typedef signed char type;
+ typedef char (&result_type) [4];
+};
+
+template<> struct arithmetic_type<5>
+{
+ typedef short type;
+ typedef char (&result_type) [5];
+};
+
+template<> struct arithmetic_type<6>
+{
+ typedef int type;
+ typedef char (&result_type) [6];
+};
+
+template<> struct arithmetic_type<7>
+{
+ typedef long type;
+ typedef char (&result_type) [7];
+};
+
+template<> struct arithmetic_type<8>
+{
+ typedef boost::long_long_type type;
+ typedef char (&result_type) [8];
+};
+
+// For each of the standard signed integer types, there exists a corresponding
+// (but different) standard unsigned integer type: “unsigned charâ€, “unsigned short intâ€,
+// “unsigned intâ€, “unsigned long intâ€, and “unsigned long long intâ€
+
+template<> struct arithmetic_type<9>
+{
+ typedef unsigned char type;
+ typedef char (&result_type) [9];
+};
+
+template<> struct arithmetic_type<10>
+{
+ typedef unsigned short type;
+ typedef char (&result_type) [10];
+};
+
+template<> struct arithmetic_type<11>
+{
+ typedef unsigned int type;
+ typedef char (&result_type) [11];
+};
+
+template<> struct arithmetic_type<12>
+{
+ typedef unsigned long type;
+ typedef char (&result_type) [12];
+};
+
+template<> struct arithmetic_type<13>
+{
+ typedef boost::ulong_long_type type;
+ typedef char (&result_type) [13];
+};
+
+// There are three floating point types: float, double, and long double.
+
+template<> struct arithmetic_type<14>
+{
+ typedef float type;
+ typedef char (&result_type) [14];
+};
+
+template<> struct arithmetic_type<15>
+{
+ typedef double type;
+ typedef char (&result_type) [15];
+};
+
+template<> struct arithmetic_type<16>
+{
+ typedef long double type;
+ typedef char (&result_type) [16];
+};
+
+#if !defined( BOOST_NO_CXX11_CHAR16_T )
+
+template<> struct arithmetic_type<17>
+{
+ typedef char16_t type;
+ typedef char (&result_type) [17];
+};
+
+#endif
+
+#if !defined( BOOST_NO_CXX11_CHAR32_T )
+
+template<> struct arithmetic_type<18>
+{
+ typedef char32_t type;
+ typedef char (&result_type) [18];
+};
+
+#endif
+
+#if defined( BOOST_HAS_INT128 )
+
+template<> struct arithmetic_type<19>
+{
+ typedef boost::int128_type type;
+ typedef char (&result_type) [19];
+};
+
+template<> struct arithmetic_type<20>
+{
+ typedef boost::uint128_type type;
+ typedef char (&result_type) [20];
+};
+
+#endif
+
+template<class T, class U> class common_arithmetic_type
+{
+private:
+
+ static arithmetic_type<1>::result_type select( arithmetic_type<1>::type );
+ static arithmetic_type<2>::result_type select( arithmetic_type<2>::type );
+ static arithmetic_type<3>::result_type select( arithmetic_type<3>::type );
+ static arithmetic_type<4>::result_type select( arithmetic_type<4>::type );
+ static arithmetic_type<5>::result_type select( arithmetic_type<5>::type );
+ static arithmetic_type<6>::result_type select( arithmetic_type<6>::type );
+ static arithmetic_type<7>::result_type select( arithmetic_type<7>::type );
+ static arithmetic_type<8>::result_type select( arithmetic_type<8>::type );
+ static arithmetic_type<9>::result_type select( arithmetic_type<9>::type );
+ static arithmetic_type<10>::result_type select( arithmetic_type<10>::type );
+ static arithmetic_type<11>::result_type select( arithmetic_type<11>::type );
+ static arithmetic_type<12>::result_type select( arithmetic_type<12>::type );
+ static arithmetic_type<13>::result_type select( arithmetic_type<13>::type );
+ static arithmetic_type<14>::result_type select( arithmetic_type<14>::type );
+ static arithmetic_type<15>::result_type select( arithmetic_type<15>::type );
+ static arithmetic_type<16>::result_type select( arithmetic_type<16>::type );
+
+#if !defined( BOOST_NO_CXX11_CHAR16_T )
+ static arithmetic_type<17>::result_type select( arithmetic_type<17>::type );
+#endif
+
+#if !defined( BOOST_NO_CXX11_CHAR32_T )
+ static arithmetic_type<18>::result_type select( arithmetic_type<18>::type );
+#endif
+
+#if defined( BOOST_HAS_INT128 )
+ static arithmetic_type<19>::result_type select( arithmetic_type<19>::type );
+ static arithmetic_type<20>::result_type select( arithmetic_type<20>::type );
+#endif
+
+ static bool cond();
+
+public:
+
+ typedef typename arithmetic_type< sizeof(select( cond()? T(): U() )) >::type type;
+};
+
+} // namespace type_traits_detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_ARITHMETIC_TYPE_HPP_INCLUDED
diff --git a/boost/type_traits/detail/common_type_imp.hpp b/boost/type_traits/detail/common_type_imp.hpp
deleted file mode 100644
index 84de8b4125..0000000000
--- a/boost/type_traits/detail/common_type_imp.hpp
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * boost/type_traits/detail/common_type_imp.hpp
- *
- * Copyright 2010, Jeffrey Hellrung.
- * Distributed under the Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- *
- * struct boost::common_type<T,U>
- *
- * common_type<T,U>::type is the type of the expression
- * b() ? x() : y()
- * where b() returns a bool, x() has return type T, and y() has return type U.
- * See
- * http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm#common_type
- *
- * Note that this evaluates to void if one or both of T and U is void.
- ******************************************************************************/
-
-#ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMP_HPP
-#define BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMP_HPP
-
-#include <cstddef>
-
-#include <boost/mpl/assert.hpp>
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/begin_end.hpp>
-#include <boost/mpl/contains.hpp>
-#include <boost/mpl/copy.hpp>
-#include <boost/mpl/deref.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/inserter.hpp>
-#include <boost/mpl/next.hpp>
-#include <boost/mpl/or.hpp>
-#include <boost/mpl/placeholders.hpp>
-#include <boost/mpl/push_back.hpp>
-#include <boost/mpl/size.hpp>
-#include <boost/mpl/vector/vector0.hpp>
-#include <boost/mpl/vector/vector10.hpp>
-#include <boost/type_traits/integral_constant.hpp>
-#include <boost/type_traits/is_enum.hpp>
-#include <boost/type_traits/is_integral.hpp>
-#include <boost/type_traits/make_signed.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
-#include <boost/type_traits/remove_cv.hpp>
-#include <boost/type_traits/remove_reference.hpp>
-#include <boost/utility/declval.hpp>
-
-namespace boost
-{
-
-namespace detail_type_traits_common_type
-{
-
-/*******************************************************************************
- * struct propagate_cv< From, To >
- *
- * This metafunction propagates cv-qualifiers on type From to type To.
- ******************************************************************************/
-
-template< class From, class To >
-struct propagate_cv
-{ typedef To type; };
-template< class From, class To >
-struct propagate_cv< const From, To >
-{ typedef To const type; };
-template< class From, class To >
-struct propagate_cv< volatile From, To >
-{ typedef To volatile type; };
-template< class From, class To >
-struct propagate_cv< const volatile From, To >
-{ typedef To const volatile type; };
-
-/*******************************************************************************
- * struct is_integral_or_enum<T>
- *
- * This metafunction determines if T is an integral type which can be made
- * signed or unsigned.
- ******************************************************************************/
-
-template< class T >
-struct is_integral_or_enum
- : public mpl::or_< is_integral<T>, is_enum<T> >
-{ };
-template<>
-struct is_integral_or_enum< bool >
- : public false_type
-{ };
-
-/*******************************************************************************
- * struct make_unsigned_soft<T>
- * struct make_signed_soft<T>
- *
- * These metafunction are identical to make_unsigned and make_signed,
- * respectively, except for special-casing bool.
- ******************************************************************************/
-
-template< class T >
-struct make_unsigned_soft
- : public make_unsigned<T>
-{ };
-template<>
-struct make_unsigned_soft< bool >
-{ typedef bool type; };
-
-template< class T >
-struct make_signed_soft
- : public make_signed<T>
-{ };
-template<>
-struct make_signed_soft< bool >
-{ typedef bool type; };
-
-/*******************************************************************************
- * struct sizeof_t<N>
- * typedef ... yes_type
- * typedef ... no_type
- *
- * These types are integral players in the use of the "sizeof trick", i.e., we
- * can distinguish overload selection by inspecting the size of the return type
- * of the overload.
- ******************************************************************************/
-
-template< std::size_t N > struct sizeof_t { char _dummy[N]; };
-typedef sizeof_t<1> yes_type;
-typedef sizeof_t<2> no_type;
-BOOST_MPL_ASSERT_RELATION( sizeof( yes_type ), ==, 1 );
-BOOST_MPL_ASSERT_RELATION( sizeof( no_type ), ==, 2 );
-
-/*******************************************************************************
- * rvalue_test(T&) -> no_type
- * rvalue_test(...) -> yes_type
- *
- * These overloads are used to determine the rvalue-ness of an expression.
- ******************************************************************************/
-
-template< class T > no_type rvalue_test(T&);
-yes_type rvalue_test(...);
-
-/*******************************************************************************
- * struct conversion_test_overloads< Sequence >
- *
- * This struct has multiple overloads of the static member function apply, each
- * one taking a single parameter of a type within the Boost.MPL sequence
- * Sequence. Each such apply overload has a return type with sizeof equal to
- * one plus the index of the parameter type within Sequence. Thus, we can
- * deduce the type T of an expression as long as we can generate a finite set of
- * candidate types containing T via these apply overloads and the "sizeof
- * trick".
- ******************************************************************************/
-
-template< class First, class Last, std::size_t Index >
-struct conversion_test_overloads_iterate
- : public conversion_test_overloads_iterate<
- typename mpl::next< First >::type, Last, Index + 1
- >
-{
- using conversion_test_overloads_iterate<
- typename mpl::next< First >::type, Last, Index + 1
- >::apply;
- static sizeof_t< Index + 1 >
- apply(typename mpl::deref< First >::type);
-};
-
-template< class Last, std::size_t Index >
-struct conversion_test_overloads_iterate< Last, Last, Index >
-{ static sizeof_t< Index + 1 > apply(...); };
-
-template< class Sequence >
-struct conversion_test_overloads
- : public conversion_test_overloads_iterate<
- typename mpl::begin< Sequence >::type,
- typename mpl::end< Sequence >::type,
- 0
- >
-{ };
-
-/*******************************************************************************
- * struct select< Sequence, Index >
- *
- * select is synonymous with mpl::at_c unless Index equals the size of the
- * Boost.MPL Sequence, in which case this evaluates to void.
- ******************************************************************************/
-
-template<
- class Sequence, int Index,
- int N = mpl::size< Sequence >::value
->
-struct select
- : public mpl::at_c< Sequence, Index >
-{ };
-template< class Sequence, int N >
-struct select< Sequence, N, N >
-{ typedef void type; };
-
-/*******************************************************************************
- * class deduce_common_type< T, U, NominalCandidates >
- * struct nominal_candidates<T,U>
- * struct common_type_dispatch_on_rvalueness<T,U>
- * struct common_type_impl<T,U>
- *
- * These classes and structs implement the logic behind common_type, which goes
- * roughly as follows. Let C be the type of the conditional expression
- * declval< bool >() ? declval<T>() : declval<U>()
- * if C is an rvalue, then:
- * let T' and U' be T and U stripped of reference- and cv-qualifiers
- * if T' and U' are pointer types, say, T' = V* and U' = W*, then:
- * define the set of NominalCandidates to be
- * { V*, W*, V'*, W'* }
- * where V' is V with whatever cv-qualifiers are on W, and W' is W
- * with whatever cv-qualifiers are on V
- * else if T' and U' are both integral or enum types, then:
- * define the set of NominalCandidates to be
- * {
- * unsigned_soft(T'),
- * unsigned_soft(U'),
- * signed_soft(T'),
- * signed_soft(U'),
- * T',
- * U',
- * unsigned int,
- * int
- * }
- * where unsigned_soft(X) is make_unsigned_soft<X>::type and
- * signed_soft(X) is make_signed_soft<X>::type (these are all
- * generally necessary to cover the various integral promotion cases)
- * else
- * define the set of NominalCandidates to be
- * { T', U' }
- * else
- * let V and W be T and U stripped of reference-qualifiers
- * define the set of NominalCandidates to be
- * { V&, W&, V'&, W'& }
- * where V' is V with whatever cv-qualifiers are on W, and W' is W with
- * whatever cv-qualifiers are on V
- * define the set of Candidates to be equal to the set of NominalCandidates with
- * duplicates removed, and use this set of Candidates to determine C using the
- * conversion_test_overloads struct
- ******************************************************************************/
-
-template< class T, class U, class NominalCandidates >
-class deduce_common_type
-{
- typedef typename mpl::copy<
- NominalCandidates,
- mpl::inserter<
- mpl::vector0<>,
- mpl::if_<
- mpl::contains< mpl::_1, mpl::_2 >,
- mpl::_1,
- mpl::push_back< mpl::_1, mpl::_2 >
- >
- >
- >::type candidate_types;
- static const int best_candidate_index =
- sizeof( conversion_test_overloads< candidate_types >::apply(
- declval< bool >() ? declval<T>() : declval<U>()
- ) ) - 1;
-public:
- typedef typename select< candidate_types, best_candidate_index >::type type;
-};
-
-template<
- class T, class U,
- class V = typename remove_cv< typename remove_reference<T>::type >::type,
- class W = typename remove_cv< typename remove_reference<U>::type >::type,
- bool = is_integral_or_enum<V>::value && is_integral_or_enum<W>::value
->
-struct nominal_candidates
-{ typedef mpl::vector2<V,W> type; };
-
-template< class T, class U, class V, class W >
-struct nominal_candidates< T, U, V, W, true >
-{
- typedef boost::mpl::vector8<
- typename make_unsigned_soft<V>::type,
- typename make_unsigned_soft<W>::type,
- typename make_signed_soft<V>::type,
- typename make_signed_soft<W>::type,
- V, W, unsigned int, int
- > type;
-};
-
-template< class T, class U, class V, class W >
-struct nominal_candidates< T, U, V*, W*, false >
-{
- typedef mpl::vector4<
- V*, W*,
- typename propagate_cv<W,V>::type *,
- typename propagate_cv<V,W>::type *
- > type;
-};
-
-template<class T, class U, bool b>
-struct common_type_dispatch_on_rvalueness
- : public deduce_common_type< T, U, typename nominal_candidates<T,U>::type >
-{ };
-
-template< class T, class U >
-struct common_type_dispatch_on_rvalueness< T, U, false >
-{
-private:
- typedef typename remove_reference<T>::type unrefed_T_type;
- typedef typename remove_reference<U>::type unrefed_U_type;
-public:
- typedef typename deduce_common_type<
- T, U,
- mpl::vector4<
- unrefed_T_type &,
- unrefed_U_type &,
- typename propagate_cv< unrefed_U_type, unrefed_T_type >::type &,
- typename propagate_cv< unrefed_T_type, unrefed_U_type >::type &
- >
- >::type type;
-};
-
-template< class T, class U >
-struct common_type_impl
- : public common_type_dispatch_on_rvalueness<T,U, sizeof( ::boost::detail_type_traits_common_type::rvalue_test(
- declval< bool >() ? declval<T>() : declval<U>() ) ) == sizeof( yes_type ) >
-{ };
-
-template< class T > struct common_type_impl< T, void > { typedef void type; };
-template< class T > struct common_type_impl< void, T > { typedef void type; };
-template<> struct common_type_impl< void, void > { typedef void type; };
-
-} // namespace detail_type_traits_common_type
-
-
-} // namespace boost
-
-#endif // BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_HPP
-
diff --git a/boost/type_traits/detail/common_type_impl.hpp b/boost/type_traits/detail/common_type_impl.hpp
new file mode 100644
index 0000000000..53a634d4df
--- /dev/null
+++ b/boost/type_traits/detail/common_type_impl.hpp
@@ -0,0 +1,107 @@
+#ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMPL_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMPL_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/type_traits/detail/common_arithmetic_type.hpp>
+#include <boost/type_traits/detail/composite_pointer_type.hpp>
+#include <boost/type_traits/detail/composite_member_pointer_type.hpp>
+#include <boost/type_traits/type_identity.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_union.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_member_pointer.hpp>
+#include <boost/type_traits/conditional.hpp>
+
+namespace boost
+{
+
+namespace type_traits_detail
+{
+
+// the arguments to common_type_impl have already been passed through decay<>
+
+template<class T, class U> struct common_type_impl;
+
+// same type
+
+template<class T> struct common_type_impl<T, T>
+{
+ typedef T type;
+};
+
+// one of the operands is a class type, try conversions in both directions
+
+template<class T, class U> struct ct_class
+{
+ BOOST_STATIC_CONSTANT( bool, ct = boost::is_class<T>::value || boost::is_union<T>::value );
+ BOOST_STATIC_CONSTANT( bool, cu = boost::is_class<U>::value || boost::is_union<U>::value );
+
+ BOOST_STATIC_CONSTANT( bool, value = ct || cu );
+};
+
+template<class T, class U> struct common_type_impl3;
+
+template<class T, class U> struct common_type_class: public boost::conditional<
+
+ boost::is_convertible<T, U>::value && !boost::is_convertible<U, T>::value,
+ boost::type_identity<U>,
+
+ typename boost::conditional<
+
+ boost::is_convertible<U, T>::value && !boost::is_convertible<T, U>::value,
+ boost::type_identity<T>,
+
+ common_type_impl3<T, U>
+ >::type
+>::type
+{
+};
+
+template<class T, class U> struct common_type_impl: public boost::conditional<
+ ct_class<T, U>::value,
+ common_type_class<T, U>,
+ common_type_impl3<T, U> >::type
+{
+};
+
+// pointers
+
+template<class T, class U> struct common_type_impl4;
+
+template<class T, class U> struct common_type_impl3: public boost::conditional<
+ boost::is_pointer<T>::value || boost::is_pointer<U>::value,
+ composite_pointer_type<T, U>,
+ common_type_impl4<T, U> >::type
+{
+};
+
+// pointers to members
+
+template<class T, class U> struct common_type_impl5;
+
+template<class T, class U> struct common_type_impl4: public boost::conditional<
+ boost::is_member_pointer<T>::value || boost::is_member_pointer<U>::value,
+ composite_member_pointer_type<T, U>,
+ common_type_impl5<T, U> >::type
+{
+};
+
+// arithmetic types (including class types w/ conversions to arithmetic and enums)
+
+template<class T, class U> struct common_type_impl5: public common_arithmetic_type<T, U>
+{
+};
+
+} // namespace type_traits_detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_TYPE_IMPL_HPP_INCLUDED
diff --git a/boost/type_traits/detail/composite_member_pointer_type.hpp b/boost/type_traits/detail/composite_member_pointer_type.hpp
new file mode 100644
index 0000000000..a747ee4db6
--- /dev/null
+++ b/boost/type_traits/detail/composite_member_pointer_type.hpp
@@ -0,0 +1,113 @@
+#ifndef BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_MEMBER_POINTER_TYPE_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_MEMBER_POINTER_TYPE_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/type_traits/detail/composite_pointer_type.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/conditional.hpp>
+#include <boost/config.hpp>
+#include <cstddef>
+
+namespace boost
+{
+
+namespace type_traits_detail
+{
+
+template<class T, class U> struct composite_member_pointer_type;
+
+// nullptr_t
+
+#if !defined( BOOST_NO_CXX11_NULLPTR )
+
+#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
+
+template<class C, class T> struct composite_member_pointer_type<T C::*, decltype(nullptr)>
+{
+ typedef T C::* type;
+};
+
+template<class C, class T> struct composite_member_pointer_type<decltype(nullptr), T C::*>
+{
+ typedef T C::* type;
+};
+
+template<> struct composite_member_pointer_type<decltype(nullptr), decltype(nullptr)>
+{
+ typedef decltype(nullptr) type;
+};
+
+#else
+
+template<class C, class T> struct composite_member_pointer_type<T C::*, std::nullptr_t>
+{
+ typedef T C::* type;
+};
+
+template<class C, class T> struct composite_member_pointer_type<std::nullptr_t, T C::*>
+{
+ typedef T C::* type;
+};
+
+template<> struct composite_member_pointer_type<std::nullptr_t, std::nullptr_t>
+{
+ typedef std::nullptr_t type;
+};
+
+#endif
+
+#endif // !defined( BOOST_NO_CXX11_NULLPTR )
+
+template<class C1, class C2> struct common_member_class;
+
+template<class C> struct common_member_class<C, C>
+{
+ typedef C type;
+};
+
+template<class C1, class C2> struct common_member_class
+{
+ typedef typename boost::conditional<
+
+ boost::is_base_of<C1, C2>::value,
+ C2,
+ typename boost::conditional<boost::is_base_of<C2, C1>::value, C1, void>::type
+
+ >::type type;
+};
+
+//This indirection avoids compilation errors on some older
+//compilers like MSVC 7.1
+template<class CT, class CB>
+struct common_member_class_pointer_to_member
+{
+ typedef CT CB::* type;
+};
+
+template<class C1, class T1, class C2, class T2> struct composite_member_pointer_type<T1 C1::*, T2 C2::*>
+{
+private:
+
+ typedef typename composite_pointer_type<T1*, T2*>::type CPT;
+ typedef typename boost::remove_pointer<CPT>::type CT;
+
+ typedef typename common_member_class<C1, C2>::type CB;
+
+public:
+
+ typedef typename common_member_class_pointer_to_member<CT, CB>::type type;
+};
+
+} // namespace type_traits_detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_MEMBER_POINTER_TYPE_HPP_INCLUDED
diff --git a/boost/type_traits/detail/composite_pointer_type.hpp b/boost/type_traits/detail/composite_pointer_type.hpp
new file mode 100644
index 0000000000..ae21e18ade
--- /dev/null
+++ b/boost/type_traits/detail/composite_pointer_type.hpp
@@ -0,0 +1,153 @@
+#ifndef BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_POINTER_TYPE_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_POINTER_TYPE_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/type_traits/copy_cv.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_void.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/config.hpp>
+#include <cstddef>
+
+namespace boost
+{
+
+namespace type_traits_detail
+{
+
+template<class T, class U> struct composite_pointer_type;
+
+// same type
+
+template<class T> struct composite_pointer_type<T*, T*>
+{
+ typedef T* type;
+};
+
+// nullptr_t
+
+#if !defined( BOOST_NO_CXX11_NULLPTR )
+
+#if !defined( BOOST_NO_CXX11_DECLTYPE ) && ( ( defined( __clang__ ) && !defined( _LIBCPP_VERSION ) ) || defined( __INTEL_COMPILER ) )
+
+template<class T> struct composite_pointer_type<T*, decltype(nullptr)>
+{
+ typedef T* type;
+};
+
+template<class T> struct composite_pointer_type<decltype(nullptr), T*>
+{
+ typedef T* type;
+};
+
+template<> struct composite_pointer_type<decltype(nullptr), decltype(nullptr)>
+{
+ typedef decltype(nullptr) type;
+};
+
+#else
+
+template<class T> struct composite_pointer_type<T*, std::nullptr_t>
+{
+ typedef T* type;
+};
+
+template<class T> struct composite_pointer_type<std::nullptr_t, T*>
+{
+ typedef T* type;
+};
+
+template<> struct composite_pointer_type<std::nullptr_t, std::nullptr_t>
+{
+ typedef std::nullptr_t type;
+};
+
+#endif
+
+#endif // !defined( BOOST_NO_CXX11_NULLPTR )
+
+namespace detail
+{
+
+template<class T, class U> struct has_common_pointee
+{
+private:
+
+ typedef typename boost::remove_cv<T>::type T2;
+ typedef typename boost::remove_cv<U>::type U2;
+
+public:
+
+ BOOST_STATIC_CONSTANT( bool, value =
+ (boost::is_same<T2, U2>::value)
+ || boost::is_void<T2>::value
+ || boost::is_void<U2>::value
+ || (boost::is_base_of<T2, U2>::value)
+ || (boost::is_base_of<U2, T2>::value) );
+};
+
+template<class T, class U> struct common_pointee
+{
+private:
+
+ typedef typename boost::remove_cv<T>::type T2;
+ typedef typename boost::remove_cv<U>::type U2;
+
+public:
+
+ typedef typename boost::conditional<
+
+ boost::is_same<T2, U2>::value || boost::is_void<T2>::value || boost::is_base_of<T2, U2>::value,
+ typename boost::copy_cv<T, U>::type,
+ typename boost::copy_cv<U, T>::type
+
+ >::type type;
+};
+
+template<class T, class U> struct composite_pointer_impl
+{
+private:
+
+ typedef typename boost::remove_cv<T>::type T2;
+ typedef typename boost::remove_cv<U>::type U2;
+
+public:
+
+ typedef typename boost::copy_cv<typename boost::copy_cv<typename composite_pointer_type<T2, U2>::type const, T>::type, U>::type type;
+};
+
+//Old compilers like MSVC-7.1 have problems using boost::conditional in
+//composite_pointer_type. Partially specializing on has_common_pointee<T, U>::value
+//seems to make their life easier
+template<class T, class U, bool = has_common_pointee<T, U>::value >
+struct composite_pointer_type_dispatch
+ : common_pointee<T, U>
+{};
+
+template<class T, class U>
+struct composite_pointer_type_dispatch<T, U, false>
+ : composite_pointer_impl<T, U>
+{};
+
+
+} // detail
+
+
+template<class T, class U> struct composite_pointer_type<T*, U*>
+{
+ typedef typename detail::composite_pointer_type_dispatch<T, U>::type* type;
+};
+
+} // namespace type_traits_detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMPOSITE_POINTER_TYPE_HPP_INCLUDED
diff --git a/boost/type_traits/detail/config.hpp b/boost/type_traits/detail/config.hpp
new file mode 100644
index 0000000000..ebb1dd65f0
--- /dev/null
+++ b/boost/type_traits/detail/config.hpp
@@ -0,0 +1,72 @@
+
+// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+//
+// See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_CONFIG_HPP_INCLUDED
+#define BOOST_TT_CONFIG_HPP_INCLUDED
+
+#ifndef BOOST_CONFIG_HPP
+#include <boost/config.hpp>
+#endif
+#include <boost/version.hpp>
+#include <boost/detail/workaround.hpp>
+
+//
+// whenever we have a conversion function with ellipses
+// it needs to be declared __cdecl to suppress compiler
+// warnings from MS and Borland compilers (this *must*
+// appear before we include is_same.hpp below):
+#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32))
+# define BOOST_TT_DECL __cdecl
+#else
+# define BOOST_TT_DECL /**/
+#endif
+
+# if (BOOST_WORKAROUND(__MWERKS__, < 0x3000) \
+ || BOOST_WORKAROUND(__IBMCPP__, < 600 ) \
+ || BOOST_WORKAROUND(__BORLANDC__, < 0x5A0) \
+ || defined(__ghs) \
+ || BOOST_WORKAROUND(__HP_aCC, < 60700) \
+ || BOOST_WORKAROUND(MPW_CPLUS, BOOST_TESTED_AT(0x890)) \
+ || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))) \
+ && defined(BOOST_NO_IS_ABSTRACT)
+
+# define BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION 1
+
+#endif
+
+#ifndef BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION
+# define BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION 1
+#endif
+
+//
+// define BOOST_TT_TEST_MS_FUNC_SIGS
+// when we want to test __stdcall etc function types with is_function etc
+// (Note, does not work with Borland, even though it does support __stdcall etc):
+//
+#if defined(_MSC_EXTENSIONS) && !defined(__BORLANDC__)
+# define BOOST_TT_TEST_MS_FUNC_SIGS
+#endif
+
+//
+// define BOOST_TT_NO_CV_FUNC_TEST
+// if tests for cv-qualified member functions don't
+// work in is_member_function_pointer
+//
+#if BOOST_WORKAROUND(__MWERKS__, < 0x3000) || BOOST_WORKAROUND(__IBMCPP__, <= 600)
+# define BOOST_TT_NO_CV_FUNC_TEST
+#endif
+
+//
+// Macros that have been deprecated, defined here for backwards compatibility:
+//
+#define BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(x)
+#define BOOST_TT_BROKEN_COMPILER_SPEC(x)
+
+#endif // BOOST_TT_CONFIG_HPP_INCLUDED
+
+
diff --git a/boost/type_traits/detail/cv_traits_impl.hpp b/boost/type_traits/detail/cv_traits_impl.hpp
deleted file mode 100644
index 8e995bb064..0000000000
--- a/boost/type_traits/detail/cv_traits_impl.hpp
+++ /dev/null
@@ -1,140 +0,0 @@
-
-// (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard
-// Hinnant & John Maddock 2000.
-// Use, modification and distribution are subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt).
-//
-// See http://www.boost.org/libs/type_traits for most recent version including documentation.
-
-
-#ifndef BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
-#define BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
-
-#include <cstddef>
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
-
-// implementation helper:
-
-
-namespace boost {
-namespace detail {
-
-#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
-#define BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(X) X
- template <typename T>
- struct cv_traits_imp
- {
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type;
- };
-
- template <typename T>
- struct cv_traits_imp<T[]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type[];
- };
-
- template <typename T>
- struct cv_traits_imp<const T[]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = true);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type[];
- };
-
- template <typename T>
- struct cv_traits_imp<volatile T[]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = true);
- typedef T unqualified_type[];
- };
-
- template <typename T>
- struct cv_traits_imp<const volatile T[]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = true);
- BOOST_STATIC_CONSTANT(bool, is_volatile = true);
- typedef T unqualified_type[];
- };
-
- template <typename T, std::size_t N>
- struct cv_traits_imp<T[N]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type[N];
- };
-
- template <typename T, std::size_t N>
- struct cv_traits_imp<const T[N]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = true);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type[N];
- };
-
- template <typename T, std::size_t N>
- struct cv_traits_imp<volatile T[N]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = true);
- typedef T unqualified_type[N];
- };
-
- template <typename T, std::size_t N>
- struct cv_traits_imp<const volatile T[N]>
- {
- BOOST_STATIC_CONSTANT(bool, is_const = true);
- BOOST_STATIC_CONSTANT(bool, is_volatile = true);
- typedef T unqualified_type[N];
- };
-
-#else
-#define BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(X) X *
-template <typename T> struct cv_traits_imp {};
-
-template <typename T>
-struct cv_traits_imp<T*>
-{
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type;
-};
-#endif
-
-template <typename T>
-struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(const T)>
-{
- BOOST_STATIC_CONSTANT(bool, is_const = true);
- BOOST_STATIC_CONSTANT(bool, is_volatile = false);
- typedef T unqualified_type;
-};
-
-template <typename T>
-struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(volatile T)>
-{
- BOOST_STATIC_CONSTANT(bool, is_const = false);
- BOOST_STATIC_CONSTANT(bool, is_volatile = true);
- typedef T unqualified_type;
-};
-
-template <typename T>
-struct cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(const volatile T)>
-{
- BOOST_STATIC_CONSTANT(bool, is_const = true);
- BOOST_STATIC_CONSTANT(bool, is_volatile = true);
- typedef T unqualified_type;
-};
-
-} // namespace detail
-} // namespace boost
-
-
-#endif // BOOST_TT_DETAIL_CV_TRAITS_IMPL_HPP_INCLUDED
diff --git a/boost/type_traits/detail/false_result.hpp b/boost/type_traits/detail/false_result.hpp
deleted file mode 100644
index e65e8bc257..0000000000
--- a/boost/type_traits/detail/false_result.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright David Abrahams 2002.
-// Use, modification and distribution are subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt).
-//
-// See http://www.boost.org/libs/type_traits for most recent version including documentation.
-
-
-#ifndef BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED
-#define BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED
-
-#include <boost/config.hpp>
-
-namespace boost {
-namespace type_traits {
-
-// Utility class which always "returns" false
-struct false_result
-{
- template <typename T> struct result_
- {
- BOOST_STATIC_CONSTANT(bool, value = false);
- };
-};
-
-}} // namespace boost::type_traits
-
-#endif // BOOST_TT_DETAIL_FALSE_RESULT_HPP_INCLUDED
diff --git a/boost/type_traits/detail/has_binary_operator.hpp b/boost/type_traits/detail/has_binary_operator.hpp
index d82a5cefdb..039a6bb778 100644
--- a/boost/type_traits/detail/has_binary_operator.hpp
+++ b/boost/type_traits/detail/has_binary_operator.hpp
@@ -7,7 +7,7 @@
// See http://www.boost.org/libs/type_traits for most recent version including documentation.
#include <boost/config.hpp>
-#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/type_traits/is_base_of.hpp>
#include <boost/type_traits/is_const.hpp>
@@ -21,9 +21,6 @@
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/remove_reference.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
// cannot include this header without getting warnings of the kind:
// gcc:
// warning: value computed is not used
@@ -40,7 +37,10 @@
# pragma GCC system_header
#elif defined(BOOST_MSVC)
# pragma warning ( push )
-# pragma warning ( disable : 4018 4244 4547 4800 4804 4805 4913 )
+# pragma warning ( disable : 4018 4244 4547 4800 4804 4805 4913)
+# if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+# pragma warning ( disable : 6334)
+# endif
#endif
namespace boost {
@@ -177,13 +177,7 @@ struct trait_impl1 < Lhs, Rhs, Ret, true > {
template < typename Lhs, typename Rhs, typename Ret >
struct trait_impl1 < Lhs, Rhs, Ret, false > {
BOOST_STATIC_CONSTANT(bool,
- value = (
- ::boost::type_traits::ice_and<
- operator_exists < Lhs, Rhs >::value,
- operator_returns_Ret < Lhs, Rhs, Ret, operator_returns_void < Lhs, Rhs >::value >::value
- >::value
- )
- );
+ value = (operator_exists < Lhs, Rhs >::value && operator_returns_Ret < Lhs, Rhs, Ret, operator_returns_void < Lhs, Rhs >::value >::value));
};
// some specializations needs to be declared for the special void case
@@ -218,12 +212,11 @@ struct trait_impl {
} // namespace detail
// this is the accessible definition of the trait to end user
-BOOST_TT_AUX_BOOL_TRAIT_DEF3(BOOST_TT_TRAIT_NAME, Lhs, Rhs=Lhs, Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::trait_impl < Lhs, Rhs, Ret >::value))
+template <class Lhs, class Rhs=Lhs, class Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care>
+struct BOOST_TT_TRAIT_NAME : public integral_constant<bool, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME, _impl)::trait_impl < Lhs, Rhs, Ret >::value)>{};
} // namespace boost
#if defined(BOOST_MSVC)
# pragma warning ( pop )
#endif
-
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/boost/type_traits/detail/has_postfix_operator.hpp b/boost/type_traits/detail/has_postfix_operator.hpp
index e9048e1214..3e686f12b5 100644
--- a/boost/type_traits/detail/has_postfix_operator.hpp
+++ b/boost/type_traits/detail/has_postfix_operator.hpp
@@ -7,7 +7,7 @@
// See http://www.boost.org/libs/type_traits for most recent version including documentation.
#include <boost/config.hpp>
-#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_fundamental.hpp>
@@ -18,15 +18,15 @@
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/remove_reference.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
// avoid warnings
#if defined(__GNUC__)
# pragma GCC system_header
#elif defined(BOOST_MSVC)
# pragma warning ( push )
-# pragma warning ( disable : 4244 4913 )
+# pragma warning ( disable : 4244 4913)
+# if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+# pragma warning ( disable : 6334)
+# endif
#endif
namespace boost {
@@ -163,13 +163,7 @@ struct trait_impl1 < Lhs, Ret, true > {
template < typename Lhs, typename Ret >
struct trait_impl1 < Lhs, Ret, false > {
BOOST_STATIC_CONSTANT(bool,
- value = (
- ::boost::type_traits::ice_and<
- operator_exists < Lhs >::value,
- operator_returns_Ret < Lhs, Ret, operator_returns_void < Lhs >::value >::value
- >::value
- )
- );
+ value = (operator_exists < Lhs >::value && operator_returns_Ret < Lhs, Ret, operator_returns_void < Lhs >::value >::value));
};
// specialization needs to be declared for the special void case
@@ -191,12 +185,11 @@ struct trait_impl {
} // namespace detail
// this is the accessible definition of the trait to end user
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(BOOST_TT_TRAIT_NAME, Lhs, Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::trait_impl< Lhs, Ret >::value))
+template <class Lhs, class Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care>
+struct BOOST_TT_TRAIT_NAME : public integral_constant<bool, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME, _impl)::trait_impl< Lhs, Ret >::value)>{};
} // namespace boost
#if defined(BOOST_MSVC)
# pragma warning ( pop )
#endif
-
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/boost/type_traits/detail/has_prefix_operator.hpp b/boost/type_traits/detail/has_prefix_operator.hpp
index e1cf8d054f..d4574fc60d 100644
--- a/boost/type_traits/detail/has_prefix_operator.hpp
+++ b/boost/type_traits/detail/has_prefix_operator.hpp
@@ -7,7 +7,7 @@
// See http://www.boost.org/libs/type_traits for most recent version including documentation.
#include <boost/config.hpp>
-#include <boost/type_traits/ice.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_fundamental.hpp>
@@ -19,9 +19,6 @@
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/remove_reference.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
// cannot include this header without getting warnings of the kind:
// gcc:
// warning: value computed is not used
@@ -34,9 +31,14 @@
# pragma GCC system_header
#elif defined(BOOST_MSVC)
# pragma warning ( push )
-# pragma warning ( disable : 4146 4804 4913 4244 )
+# pragma warning ( disable : 4146 4804 4913 4244)
+# if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+# pragma warning ( disable : 6334)
+# endif
#endif
+
+
namespace boost {
namespace detail {
@@ -171,13 +173,7 @@ struct trait_impl1 < Rhs, Ret, true > {
template < typename Rhs, typename Ret >
struct trait_impl1 < Rhs, Ret, false > {
BOOST_STATIC_CONSTANT(bool,
- value = (
- ::boost::type_traits::ice_and<
- operator_exists < Rhs >::value,
- operator_returns_Ret < Rhs, Ret, operator_returns_void < Rhs >::value >::value
- >::value
- )
- );
+ value = (operator_exists < Rhs >::value && operator_returns_Ret < Rhs, Ret, operator_returns_void < Rhs >::value >::value));
};
// specialization needs to be declared for the special void case
@@ -199,12 +195,11 @@ struct trait_impl {
} // namespace detail
// this is the accessible definition of the trait to end user
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(BOOST_TT_TRAIT_NAME, Rhs, Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::trait_impl < Rhs, Ret >::value))
+template <class Rhs, class Ret=::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME,_impl)::dont_care>
+struct BOOST_TT_TRAIT_NAME : public integral_constant<bool, (::boost::detail::BOOST_JOIN(BOOST_TT_TRAIT_NAME, _impl)::trait_impl < Rhs, Ret >::value)>{};
} // namespace boost
#if defined(BOOST_MSVC)
# pragma warning ( pop )
#endif
-
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
diff --git a/boost/type_traits/detail/ice_and.hpp b/boost/type_traits/detail/ice_and.hpp
index 8b461b9fff..3ccb03e850 100644
--- a/boost/type_traits/detail/ice_and.hpp
+++ b/boost/type_traits/detail/ice_and.hpp
@@ -11,6 +11,13 @@
#include <boost/config.hpp>
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (ice_and.hpp) is deprecated")
+#endif
+
namespace boost {
namespace type_traits {
diff --git a/boost/type_traits/detail/ice_eq.hpp b/boost/type_traits/detail/ice_eq.hpp
index ea42a60b66..5908f81512 100644
--- a/boost/type_traits/detail/ice_eq.hpp
+++ b/boost/type_traits/detail/ice_eq.hpp
@@ -10,6 +10,13 @@
#include <boost/config.hpp>
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (ice_eq.hpp) is deprecated")
+#endif
+
namespace boost {
namespace type_traits {
diff --git a/boost/type_traits/detail/ice_not.hpp b/boost/type_traits/detail/ice_not.hpp
index ee1dca0ecd..e095be9cc1 100644
--- a/boost/type_traits/detail/ice_not.hpp
+++ b/boost/type_traits/detail/ice_not.hpp
@@ -10,6 +10,13 @@
#include <boost/config.hpp>
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (ice_not.hpp) is deprecated")
+#endif
+
namespace boost {
namespace type_traits {
diff --git a/boost/type_traits/detail/ice_or.hpp b/boost/type_traits/detail/ice_or.hpp
index f88d9f6aec..ea523c808a 100644
--- a/boost/type_traits/detail/ice_or.hpp
+++ b/boost/type_traits/detail/ice_or.hpp
@@ -10,6 +10,13 @@
#include <boost/config.hpp>
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (ice_or.hpp) is deprecated")
+#endif
+
namespace boost {
namespace type_traits {
diff --git a/boost/type_traits/detail/is_function_ptr_helper.hpp b/boost/type_traits/detail/is_function_ptr_helper.hpp
index 1c3b17f6d2..3538e402da 100644
--- a/boost/type_traits/detail/is_function_ptr_helper.hpp
+++ b/boost/type_traits/detail/is_function_ptr_helper.hpp
@@ -15,12 +15,20 @@
#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED
#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
-
#if defined(BOOST_TT_PREPROCESSING_MODE)
-# include <boost/preprocessor/iterate.hpp>
-# include <boost/preprocessor/enum_params.hpp>
-# include <boost/preprocessor/comma_if.hpp>
+//
+// Hide these #include from dependency analysers as
+// these are required in maintenance mode only:
+//
+#define PP1 <boost/preprocessor/iterate.hpp>
+#include PP1
+#undef PP1
+#define PP1 <boost/preprocessor/enum_params.hpp>
+#include PP1
+#undef PP1
+#define PP1 <boost/preprocessor/comma_if.hpp>
+#include PP1
+#undef PP1
#endif
namespace boost {
diff --git a/boost/type_traits/detail/is_function_ptr_tester.hpp b/boost/type_traits/detail/is_function_ptr_tester.hpp
index 2eb8a6f47f..4fe88e81b2 100644
--- a/boost/type_traits/detail/is_function_ptr_tester.hpp
+++ b/boost/type_traits/detail/is_function_ptr_tester.hpp
@@ -15,12 +15,21 @@
#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED
#include <boost/type_traits/detail/yes_no_type.hpp>
-#include <boost/type_traits/config.hpp>
#if defined(BOOST_TT_PREPROCESSING_MODE)
-# include <boost/preprocessor/iterate.hpp>
-# include <boost/preprocessor/enum_params.hpp>
-# include <boost/preprocessor/comma_if.hpp>
+//
+// Hide include dependencies from analysers since they're
+// only require in maintenance mode:
+//
+#define PP1 <boost/preprocessor/iterate.hpp>
+#define PP2 <boost/preprocessor/enum_params.hpp>
+#define PP3 <boost/preprocessor/comma_if.hpp>
+#include PP1
+#include PP2
+#include PP3
+#undef PP1
+#undef PP2
+#undef PP3
#endif
namespace boost {
diff --git a/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp b/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
index bd5c591b20..5698a74897 100644
--- a/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
+++ b/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp
@@ -17,9 +17,19 @@
#include <boost/config.hpp>
#if defined(BOOST_TT_PREPROCESSING_MODE)
-# include <boost/preprocessor/iterate.hpp>
-# include <boost/preprocessor/enum_params.hpp>
-# include <boost/preprocessor/comma_if.hpp>
+//
+// Maintenance mode, hide include dependencies
+// from trackers:
+//
+#define PPI <boost/preprocessor/iterate.hpp>
+#include PPI
+#undef PPI
+#define PPI <boost/preprocessor/enum_params.hpp>
+#include PPI
+#undef PPI
+#define PPI <boost/preprocessor/comma_if.hpp>
+#include PPI
+#undef PPI
#endif
namespace boost {
diff --git a/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp b/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
index 334a843450..5e31693111 100644
--- a/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
+++ b/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp
@@ -15,12 +15,22 @@
#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED
#include <boost/type_traits/detail/yes_no_type.hpp>
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#if defined(BOOST_TT_PREPROCESSING_MODE)
-# include <boost/preprocessor/iterate.hpp>
-# include <boost/preprocessor/enum_params.hpp>
-# include <boost/preprocessor/comma_if.hpp>
+//
+// Maintentance mode, hide include dependencies
+// from dependency trackers:
+//
+#define PPI <boost/preprocessor/iterate.hpp>
+#include PPI
+#undef PPI
+#define PPI <boost/preprocessor/enum_params.hpp>
+#include PPI
+#undef PPI
+#define <boost/preprocessor/comma_if.hpp>
+#include PPI
+#undef
#endif
namespace boost {
diff --git a/boost/type_traits/detail/mp_defer.hpp b/boost/type_traits/detail/mp_defer.hpp
new file mode 100644
index 0000000000..7910e545e1
--- /dev/null
+++ b/boost/type_traits/detail/mp_defer.hpp
@@ -0,0 +1,56 @@
+#ifndef BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/conditional.hpp>
+
+namespace boost
+{
+
+namespace type_traits_detail
+{
+
+// mp_valid
+// implementation by Bruno Dutra (by the name is_evaluable)
+
+template<template<class...> class F, class... T>
+struct mp_valid_impl
+{
+ template<template<class...> class G, class = G<T...>>
+ static boost::true_type check(int);
+
+ template<template<class...> class>
+ static boost::false_type check(...);
+
+ using type = decltype(check<F>(0));
+};
+
+template<template<class...> class F, class... T>
+using mp_valid = typename mp_valid_impl<F, T...>::type;
+
+// mp_defer
+
+struct mp_empty
+{
+};
+
+template<template<class...> class F, class... T> struct mp_defer_impl
+{
+ using type = F<T...>;
+};
+
+template<template<class...> class F, class... T> using mp_defer = typename boost::conditional<mp_valid<F, T...>::value, mp_defer_impl<F, T...>, mp_empty>::type;
+
+} // namespace type_traits_detail
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
diff --git a/boost/type_traits/detail/size_t_trait_def.hpp b/boost/type_traits/detail/size_t_trait_def.hpp
deleted file mode 100644
index 8cea9b4522..0000000000
--- a/boost/type_traits/detail/size_t_trait_def.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-
-// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
-
-// Copyright Aleksey Gurtovoy 2002-2004
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// $Source$
-// $Date$
-// $Revision$
-
-#include <boost/type_traits/detail/template_arity_spec.hpp>
-#include <boost/type_traits/integral_constant.hpp>
-#include <boost/mpl/aux_/lambda_support.hpp>
-#include <boost/mpl/size_t.hpp>
-
-#include <cstddef>
-
-// Obsolete. Remove.
-#define BOOST_TT_AUX_SIZE_T_BASE(C) public ::boost::integral_constant<std::size_t,C>
-#define BOOST_TT_AUX_SIZE_T_TRAIT_VALUE_DECL(C) /**/
-
-
-#define BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(trait,T,C) \
-template< typename T > struct trait \
- : public ::boost::integral_constant<std::size_t,C> \
-{ \
-public:\
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
-}; \
-\
-BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \
-/**/
-
-#define BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1(trait,spec,C) \
-template<> struct trait<spec> \
- : public ::boost::integral_constant<std::size_t,C> \
-{ \
-public:\
- BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(spec)) \
-}; \
-/**/
-
-#define BOOST_TT_AUX_SIZE_T_TRAIT_PARTIAL_SPEC1_1(param,trait,spec,C) \
-template< param > struct trait<spec> \
- : public ::boost::integral_constant<std::size_t,C> \
-{ \
-}; \
-/**/
diff --git a/boost/type_traits/detail/size_t_trait_undef.hpp b/boost/type_traits/detail/size_t_trait_undef.hpp
deleted file mode 100644
index 1694fac772..0000000000
--- a/boost/type_traits/detail/size_t_trait_undef.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-
-// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
-
-// Copyright Aleksey Gurtovoy 2002-2004
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// $Source$
-// $Date$
-// $Revision$
-
-#undef BOOST_TT_AUX_SIZE_T_TRAIT_DEF1
-#undef BOOST_TT_AUX_SIZE_T_TRAIT_SPEC1
-#undef BOOST_TT_AUX_SIZE_T_TRAIT_PARTIAL_SPEC1_1
diff --git a/boost/type_traits/detail/template_arity_spec.hpp b/boost/type_traits/detail/template_arity_spec.hpp
index fe9b422e83..36ea96d6d5 100644
--- a/boost/type_traits/detail/template_arity_spec.hpp
+++ b/boost/type_traits/detail/template_arity_spec.hpp
@@ -1,4 +1,3 @@
-
// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
// Copyright Aleksey Gurtovoy 2002-2004
@@ -7,25 +6,11 @@
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/aux_/template_arity_fwd.hpp>
-#include <boost/mpl/aux_/preprocessor/params.hpp>
-#include <boost/mpl/aux_/config/lambda.hpp>
-#include <boost/mpl/aux_/config/overload_resolution.hpp>
+//
+// This header is deprecated and no longer used by type_traits:
+//
+#if defined(__GNUC__) || defined(_MSC_VER)
+# pragma message("NOTE: Use of this header (template_arity_spec.hpp) is deprecated")
+#endif
-#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \
- && defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION)
-# define BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(i, name) \
-namespace mpl { namespace aux { \
-template< BOOST_MPL_PP_PARAMS(i, typename T) > \
-struct template_arity< \
- name< BOOST_MPL_PP_PARAMS(i, T) > \
- > \
- : int_<i> \
-{ \
-}; \
-}} \
-/**/
-#else
# define BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(i, name) /**/
-#endif
diff --git a/boost/type_traits/detail/type_trait_def.hpp b/boost/type_traits/detail/type_trait_def.hpp
deleted file mode 100644
index bc54696b55..0000000000
--- a/boost/type_traits/detail/type_trait_def.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-
-// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
-
-// Copyright Aleksey Gurtovoy 2002-2004
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// $Source$
-// $Date$
-// $Revision$
-
-#include <boost/type_traits/detail/template_arity_spec.hpp>
-#include <boost/mpl/aux_/lambda_support.hpp>
-
-#define BOOST_TT_AUX_TYPE_TRAIT_DEF1(trait,T,result) \
-template< typename T > struct trait \
-{ \
-public:\
- typedef result type; \
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
-}; \
-\
-BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1,trait) \
-/**/
-
-#define BOOST_TT_AUX_TYPE_TRAIT_SPEC1(trait,spec,result) \
-template<> struct trait<spec> \
-{ \
-public:\
- typedef result type; \
- BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,trait,(spec)) \
-}; \
-/**/
-
-#define BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1(trait,spec,result) \
-template<> struct trait##_impl<spec> \
-{ \
-public:\
- typedef result type; \
-}; \
-/**/
-
-#define BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(param,trait,spec,result) \
-template< param > struct trait<spec> \
-{ \
-public:\
- typedef result type; \
-}; \
-/**/
-
-#define BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(param1,param2,trait,spec,result) \
-template< param1, param2 > struct trait<spec> \
-{ \
-public:\
- typedef result; \
-}; \
-/**/
-
-#define BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1(param,trait,spec,result) \
-template< param > struct trait##_impl<spec> \
-{ \
-public:\
- typedef result type; \
-}; \
-/**/
diff --git a/boost/type_traits/detail/type_trait_undef.hpp b/boost/type_traits/detail/type_trait_undef.hpp
deleted file mode 100644
index d8edf66275..0000000000
--- a/boost/type_traits/detail/type_trait_undef.hpp
+++ /dev/null
@@ -1,19 +0,0 @@
-
-// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION
-
-// Copyright Aleksey Gurtovoy 2002-2004
-//
-// Distributed under the Boost Software License, Version 1.0.
-// (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// $Source$
-// $Date$
-// $Revision$
-
-#undef BOOST_TT_AUX_TYPE_TRAIT_DEF1
-#undef BOOST_TT_AUX_TYPE_TRAIT_SPEC1
-#undef BOOST_TT_AUX_TYPE_TRAIT_IMPL_SPEC1
-#undef BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1
-#undef BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2
-#undef BOOST_TT_AUX_TYPE_TRAIT_IMPL_PARTIAL_SPEC1_1
diff --git a/boost/type_traits/detail/wrap.hpp b/boost/type_traits/detail/wrap.hpp
deleted file mode 100644
index d0a75d06cb..0000000000
--- a/boost/type_traits/detail/wrap.hpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// (C) Copyright David Abrahams 2002.
-// Use, modification and distribution are subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt).
-//
-// See http://www.boost.org/libs/type_traits for most recent version including documentation.
-
-#ifndef BOOST_TT_DETAIL_WRAP_HPP_INCLUDED
-#define BOOST_TT_DETAIL_WRAP_HPP_INCLUDED
-
-namespace boost {
-namespace type_traits {
-
-template <class T> struct wrap {};
-
-}} // namespace boost::type_traits
-
-#endif // BOOST_TT_DETAIL_WRAP_HPP_INCLUDED
diff --git a/boost/type_traits/extent.hpp b/boost/type_traits/extent.hpp
index c41f7f2ffe..dfb3c54ee8 100644
--- a/boost/type_traits/extent.hpp
+++ b/boost/type_traits/extent.hpp
@@ -10,8 +10,8 @@
#ifndef BOOST_TT_EXTENT_HPP_INCLUDED
#define BOOST_TT_EXTENT_HPP_INCLUDED
-// should be the last #include
-#include <boost/type_traits/detail/size_t_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
namespace boost {
@@ -131,11 +131,8 @@ template <class T, std::size_t N = 0>
struct extent
: public ::boost::integral_constant<std::size_t, ::boost::detail::extent_imp<T,N>::value>
{
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,extent,(T))
};
} // namespace boost
-#include <boost/type_traits/detail/size_t_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/floating_point_promotion.hpp b/boost/type_traits/floating_point_promotion.hpp
index 8b6ae3a32a..993e14ef4b 100644
--- a/boost/type_traits/floating_point_promotion.hpp
+++ b/boost/type_traits/floating_point_promotion.hpp
@@ -6,86 +6,15 @@
#ifndef FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED
#define FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED
-#include <boost/config.hpp>
-
-#ifdef BOOST_NO_CV_SPECIALIZATIONS
-#include <boost/mpl/at.hpp>
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/multiplies.hpp>
-#include <boost/mpl/plus.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/type_traits/is_same.hpp>
-#endif
-
-// Should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-namespace type_traits { namespace detail {
-
-#ifndef BOOST_NO_CV_SPECIALIZATIONS
-
-template<class T>
-struct floating_point_promotion
-{
- typedef T type;
-};
-
-template<>
-struct floating_point_promotion<float>
-{
- typedef double type;
-};
-
-template<>
-struct floating_point_promotion<float const>
-{
- typedef double const type;
-};
+ template<class T> struct floating_point_promotion { typedef T type; };
+ template<> struct floating_point_promotion<float> { typedef double type; };
+ template<> struct floating_point_promotion<float const> { typedef double const type; };
+ template<> struct floating_point_promotion<float volatile>{ typedef double volatile type; };
+ template<> struct floating_point_promotion<float const volatile> { typedef double const volatile type; };
-template<>
-struct floating_point_promotion<float volatile>
-{
- typedef double volatile type;
-};
-
-template<>
-struct floating_point_promotion<float const volatile>
-{
- typedef double const volatile type;
-};
-
-#else
-
-template<class T>
-struct floating_point_promotion
- : mpl::at<
- mpl::vector< T, double, double const, double volatile,
- double const volatile >
- , mpl::plus<
- is_same<T, float>
- , mpl::multiplies< is_same<T, float const> , mpl::int_<2> >
- , mpl::multiplies< is_same<T, float volatile> , mpl::int_<3> >
- , mpl::multiplies< is_same<T, float const volatile>, mpl::int_<4> >
- >
- >
-{
-};
-
-#endif
-
-} }
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(
- floating_point_promotion
- , T
- , BOOST_DEDUCED_TYPENAME
- boost::type_traits::detail::floating_point_promotion<T>::type
- )
}
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // #ifndef FILE_boost_type_traits_floating_point_promotion_hpp_INCLUDED
diff --git a/boost/type_traits/has_bit_and.hpp b/boost/type_traits/has_bit_and.hpp
index ee3307f8da..a16c71a48d 100644
--- a/boost/type_traits/has_bit_and.hpp
+++ b/boost/type_traits/has_bit_and.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_bit_and
#define BOOST_TT_TRAIT_OP &
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_bit_and_assign.hpp b/boost/type_traits/has_bit_and_assign.hpp
index 5b3112a5bd..01e25e318f 100644
--- a/boost/type_traits/has_bit_and_assign.hpp
+++ b/boost/type_traits/has_bit_and_assign.hpp
@@ -12,38 +12,38 @@
#define BOOST_TT_TRAIT_NAME has_bit_and_assign
#define BOOST_TT_TRAIT_OP &=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (\
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_bit_or.hpp b/boost/type_traits/has_bit_or.hpp
index 922b4ce966..6e76929fda 100644
--- a/boost/type_traits/has_bit_or.hpp
+++ b/boost/type_traits/has_bit_or.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_bit_or
#define BOOST_TT_TRAIT_OP |
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_bit_or_assign.hpp b/boost/type_traits/has_bit_or_assign.hpp
index 5481b92453..891c39c51b 100644
--- a/boost/type_traits/has_bit_or_assign.hpp
+++ b/boost/type_traits/has_bit_or_assign.hpp
@@ -12,38 +12,38 @@
#define BOOST_TT_TRAIT_NAME has_bit_or_assign
#define BOOST_TT_TRAIT_OP |=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_bit_xor.hpp b/boost/type_traits/has_bit_xor.hpp
index 883dcf691c..05173ac11d 100644
--- a/boost/type_traits/has_bit_xor.hpp
+++ b/boost/type_traits/has_bit_xor.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_bit_xor
#define BOOST_TT_TRAIT_OP ^
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_bit_xor_assign.hpp b/boost/type_traits/has_bit_xor_assign.hpp
index e2767cc8c6..3866b7ac48 100644
--- a/boost/type_traits/has_bit_xor_assign.hpp
+++ b/boost/type_traits/has_bit_xor_assign.hpp
@@ -12,38 +12,38 @@
#define BOOST_TT_TRAIT_NAME has_bit_xor_assign
#define BOOST_TT_TRAIT_OP ^=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_complement.hpp b/boost/type_traits/has_complement.hpp
index dafd9f5215..d323e12936 100644
--- a/boost/type_traits/has_complement.hpp
+++ b/boost/type_traits/has_complement.hpp
@@ -12,15 +12,15 @@
#define BOOST_TT_TRAIT_NAME has_complement
#define BOOST_TT_TRAIT_OP ~
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* pointer */\
- ::boost::is_pointer< Rhs_noref >::value,\
+ ::boost::is_pointer< Rhs_noref >::value || \
/* fundamental non integral */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_noref >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value
+ (\
+ ::boost::is_fundamental< Rhs_noref >::value && \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )
#include <boost/type_traits/detail/has_prefix_operator.hpp>
diff --git a/boost/type_traits/has_dereference.hpp b/boost/type_traits/has_dereference.hpp
index fe48e11878..1e514cdf41 100644
--- a/boost/type_traits/has_dereference.hpp
+++ b/boost/type_traits/has_dereference.hpp
@@ -13,13 +13,13 @@
#define BOOST_TT_TRAIT_OP *
#define BOOST_TT_FORBIDDEN_IF\
/* void* or fundamental */\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_void< Rhs_noptr >::value\
- >::value,\
+ ) || \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value
+ )
#include <boost/type_traits/detail/has_prefix_operator.hpp>
diff --git a/boost/type_traits/has_divides.hpp b/boost/type_traits/has_divides.hpp
index 277c2da4b6..869e907f6a 100644
--- a/boost/type_traits/has_divides.hpp
+++ b/boost/type_traits/has_divides.hpp
@@ -13,22 +13,22 @@
#define BOOST_TT_TRAIT_OP /
#define BOOST_TT_FORBIDDEN_IF\
/* pointer with pointer or fundamental */\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ )\
+ )||\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_divides_assign.hpp b/boost/type_traits/has_divides_assign.hpp
index b21a05aff8..1a8e3c1e63 100644
--- a/boost/type_traits/has_divides_assign.hpp
+++ b/boost/type_traits/has_divides_assign.hpp
@@ -12,30 +12,30 @@
#define BOOST_TT_TRAIT_NAME has_divides_assign
#define BOOST_TT_TRAIT_OP /=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Lhs==const and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_const< Lhs_noref >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_const< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and (Rhs==fundamental or Rhs==pointer) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value,\
+ )\
+ )||\
/* Rhs==pointer and (Lhs==fundamental or Lhs==pointer) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_equal_to.hpp b/boost/type_traits/has_equal_to.hpp
index c2245c2d2f..d80a55d8e5 100644
--- a/boost/type_traits/has_equal_to.hpp
+++ b/boost/type_traits/has_equal_to.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_equal_to
#define BOOST_TT_TRAIT_OP ==
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==pointer and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not<\
- ::boost::type_traits::ice_or<\
- ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
- ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! \
+ (\
+ ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value || \
+ ::boost::is_same< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_void< Lhs_noptr >::value || \
::boost::is_void< Rhs_noptr >::value\
- >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_greater.hpp b/boost/type_traits/has_greater.hpp
index ce32658405..32e0a12404 100644
--- a/boost/type_traits/has_greater.hpp
+++ b/boost/type_traits/has_greater.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_greater
#define BOOST_TT_TRAIT_OP >
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==pointer and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not<\
- ::boost::type_traits::ice_or<\
- ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
- ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! \
+ ( \
+ ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value || \
+ ::boost::is_same< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_void< Lhs_noptr >::value || \
::boost::is_void< Rhs_noptr >::value\
- >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_greater_equal.hpp b/boost/type_traits/has_greater_equal.hpp
index 681685a23d..a933a6beb8 100644
--- a/boost/type_traits/has_greater_equal.hpp
+++ b/boost/type_traits/has_greater_equal.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_greater_equal
#define BOOST_TT_TRAIT_OP >=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==pointer and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not<\
- ::boost::type_traits::ice_or<\
- ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
- ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! \
+ ( \
+ ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value || \
+ ::boost::is_same< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_void< Lhs_noptr >::value || \
::boost::is_void< Rhs_noptr >::value\
- >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_left_shift.hpp b/boost/type_traits/has_left_shift.hpp
index 88205d9939..e95c12a80a 100644
--- a/boost/type_traits/has_left_shift.hpp
+++ b/boost/type_traits/has_left_shift.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_left_shift
#define BOOST_TT_TRAIT_OP <<
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_left_shift_assign.hpp b/boost/type_traits/has_left_shift_assign.hpp
index 0b3b9b1f9b..74e0df9580 100644
--- a/boost/type_traits/has_left_shift_assign.hpp
+++ b/boost/type_traits/has_left_shift_assign.hpp
@@ -12,38 +12,38 @@
#define BOOST_TT_TRAIT_NAME has_left_shift_assign
#define BOOST_TT_TRAIT_OP <<=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_less.hpp b/boost/type_traits/has_less.hpp
index e1a045e592..0eefcd22dd 100644
--- a/boost/type_traits/has_less.hpp
+++ b/boost/type_traits/has_less.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_less
#define BOOST_TT_TRAIT_OP <
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==pointer and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not<\
- ::boost::type_traits::ice_or<\
- ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
- ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! \
+ ( \
+ ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value || \
+ ::boost::is_same< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_void< Lhs_noptr >::value || \
::boost::is_void< Rhs_noptr >::value\
- >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_less_equal.hpp b/boost/type_traits/has_less_equal.hpp
index c633b8b81d..4725bbd421 100644
--- a/boost/type_traits/has_less_equal.hpp
+++ b/boost/type_traits/has_less_equal.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_less_equal
#define BOOST_TT_TRAIT_OP <=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==pointer and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not<\
- ::boost::type_traits::ice_or<\
- ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
- ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! \
+ ( \
+ ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value || \
+ ::boost::is_same< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_void< Lhs_noptr >::value || \
::boost::is_void< Rhs_noptr >::value\
- >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_logical_and.hpp b/boost/type_traits/has_logical_and.hpp
index 5bfa1c334d..3bb1733d54 100644
--- a/boost/type_traits/has_logical_and.hpp
+++ b/boost/type_traits/has_logical_and.hpp
@@ -13,22 +13,22 @@
#define BOOST_TT_TRAIT_OP &&
#define BOOST_TT_FORBIDDEN_IF\
/* pointer with fundamental non convertible to bool */\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_convertible< Rhs_nocv, bool >::value >::value\
- >::value\
- >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_convertible< Lhs_nocv, bool >::value >::value\
- >::value\
- >::value\
- >::value
+ (\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (! ::boost::is_convertible< Rhs_nocv, bool >::value )\
+ )\
+ )||\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ (! ::boost::is_convertible< Lhs_nocv, bool >::value )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_logical_or.hpp b/boost/type_traits/has_logical_or.hpp
index a4ae6c5f47..a188726e15 100644
--- a/boost/type_traits/has_logical_or.hpp
+++ b/boost/type_traits/has_logical_or.hpp
@@ -13,22 +13,22 @@
#define BOOST_TT_TRAIT_OP ||
#define BOOST_TT_FORBIDDEN_IF\
/* pointer with fundamental non convertible to bool */\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_convertible< Rhs_nocv, bool >::value >::value\
- >::value\
- >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_convertible< Lhs_nocv, bool >::value >::value\
- >::value\
- >::value\
- >::value
+ (\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (! ::boost::is_convertible< Rhs_nocv, bool >::value )\
+ )\
+ )||\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ (! ::boost::is_convertible< Lhs_nocv, bool >::value )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_minus.hpp b/boost/type_traits/has_minus.hpp
index cc1d06b5c3..5e13c16014 100644
--- a/boost/type_traits/has_minus.hpp
+++ b/boost/type_traits/has_minus.hpp
@@ -12,43 +12,43 @@
#define BOOST_TT_TRAIT_NAME has_minus
#define BOOST_TT_TRAIT_OP -
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ ) || \
/* Lhs==void* and (Rhs==fundamental or Rhs==pointer) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_void< Lhs_noptr >::value && \
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value,\
+ )\
+ ) || \
/* Rhs==void* and (Lhs==fundamental or Lhs==pointer) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::is_void< Rhs_noptr >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ::boost::is_void< Rhs_noptr >::value && \
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value\
- >::value,\
+ )\
+ ) ||\
/* Lhs=fundamental and Rhs=pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) ||\
/* two different pointers */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not< ::boost::is_same< Lhs_nocv, Rhs_nocv >::value >::value\
- >::value\
- >::value
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! ::boost::is_same< Lhs_nocv, Rhs_nocv >::value )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_minus_assign.hpp b/boost/type_traits/has_minus_assign.hpp
index 84ba3594d6..b53474e756 100644
--- a/boost/type_traits/has_minus_assign.hpp
+++ b/boost/type_traits/has_minus_assign.hpp
@@ -12,48 +12,48 @@
#define BOOST_TT_TRAIT_NAME has_minus_assign
#define BOOST_TT_TRAIT_OP -=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ ) || \
/* Lhs==void* and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_void< Lhs_noptr >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==void* and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::is_void< Rhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ::boost::is_void< Rhs_noptr >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs=fundamental and Rhs=pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) || \
/* (Lhs==fundamental or Lhs==pointer) and (Rhs==fundamental or Rhs==pointer) and (Lhs==const) */\
- ::boost::type_traits::ice_and<\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ ) && \
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_modulus.hpp b/boost/type_traits/has_modulus.hpp
index 6948728058..24a815f3df 100644
--- a/boost/type_traits/has_modulus.hpp
+++ b/boost/type_traits/has_modulus.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_modulus
#define BOOST_TT_TRAIT_OP %
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (\
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_modulus_assign.hpp b/boost/type_traits/has_modulus_assign.hpp
index f0531f0747..5e3e83fa07 100644
--- a/boost/type_traits/has_modulus_assign.hpp
+++ b/boost/type_traits/has_modulus_assign.hpp
@@ -12,38 +12,38 @@
#define BOOST_TT_TRAIT_NAME has_modulus_assign
#define BOOST_TT_TRAIT_OP %=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_multiplies.hpp b/boost/type_traits/has_multiplies.hpp
index 4b578c5d78..591a0ceae8 100644
--- a/boost/type_traits/has_multiplies.hpp
+++ b/boost/type_traits/has_multiplies.hpp
@@ -13,22 +13,22 @@
#define BOOST_TT_TRAIT_OP *
#define BOOST_TT_FORBIDDEN_IF\
/* pointer with pointer or fundamental */\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value,\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ )\
+ )||\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_multiplies_assign.hpp b/boost/type_traits/has_multiplies_assign.hpp
index 1678b7bda5..b24f87944e 100644
--- a/boost/type_traits/has_multiplies_assign.hpp
+++ b/boost/type_traits/has_multiplies_assign.hpp
@@ -12,30 +12,30 @@
#define BOOST_TT_TRAIT_NAME has_multiplies_assign
#define BOOST_TT_TRAIT_OP *=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Lhs==const and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_const< Lhs_noref >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_const< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and (Rhs==fundamental or Rhs==pointer) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value,\
+ )\
+ )||\
/* Rhs==pointer and (Lhs==fundamental or Lhs==pointer) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ( \
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_new_operator.hpp b/boost/type_traits/has_new_operator.hpp
index c615127da3..4def872ddf 100644
--- a/boost/type_traits/has_new_operator.hpp
+++ b/boost/type_traits/has_new_operator.hpp
@@ -11,12 +11,9 @@
#include <new> // std::nothrow_t
#include <cstddef> // std::size_t
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/detail/workaround.hpp>
#if defined(new)
# if BOOST_WORKAROUND(BOOST_MSVC, >= 1310)
@@ -129,19 +126,17 @@ namespace detail {
#endif
#endif
BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- (s1 == sizeof(type_traits::yes_type)),
- (s2 == sizeof(type_traits::yes_type)),
- (s3 == sizeof(type_traits::yes_type)),
- (s4 == sizeof(type_traits::yes_type)),
- (s5 == sizeof(type_traits::yes_type)),
+ (s1 == sizeof(type_traits::yes_type)) ||
+ (s2 == sizeof(type_traits::yes_type)) ||
+ (s3 == sizeof(type_traits::yes_type)) ||
+ (s4 == sizeof(type_traits::yes_type)) ||
+ (s5 == sizeof(type_traits::yes_type)) ||
(s6 == sizeof(type_traits::yes_type))
- >::value)
);
};
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_new_operator,T,::boost::detail::has_new_operator_impl<T>::value)
+template <class T> struct has_new_operator : public integral_constant<bool, ::boost::detail::has_new_operator_impl<T>::value>{};
} // namespace boost
@@ -149,6 +144,4 @@ BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_new_operator,T,::boost::detail::has_new_operato
# pragma pop_macro("new")
#endif
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
diff --git a/boost/type_traits/has_not_equal_to.hpp b/boost/type_traits/has_not_equal_to.hpp
index e7e370013d..c2b6705e7c 100644
--- a/boost/type_traits/has_not_equal_to.hpp
+++ b/boost/type_traits/has_not_equal_to.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_not_equal_to
#define BOOST_TT_TRAIT_OP !=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==pointer and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==pointer and Lhs!=base(Rhs) and Rhs!=base(Lhs) and Lhs!=void* and Rhs!=void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::type_traits::ice_not<\
- ::boost::type_traits::ice_or<\
- ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value,\
- ::boost::is_same< Lhs_noptr, Rhs_noptr >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_pointer< Rhs_noref >::value && \
+ (! \
+ (\
+ ::boost::is_base_of< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_base_of< Rhs_noptr, Lhs_noptr >::value || \
+ ::boost::is_same< Lhs_noptr, Rhs_noptr >::value || \
+ ::boost::is_void< Lhs_noptr >::value || \
::boost::is_void< Rhs_noptr >::value\
- >::value\
- >::value\
- >::value\
- >::value
+ )\
+ )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_nothrow_assign.hpp b/boost/type_traits/has_nothrow_assign.hpp
index 83e59687a0..a7312a19e9 100644
--- a/boost/type_traits/has_nothrow_assign.hpp
+++ b/boost/type_traits/has_nothrow_assign.hpp
@@ -9,36 +9,75 @@
#ifndef BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED
#define BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED
-#include <boost/type_traits/has_trivial_assign.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/intrinsics.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#if !defined(BOOST_HAS_NOTHROW_ASSIGN) || defined(BOOST_MSVC) || defined(BOOST_INTEL)
+#include <boost/type_traits/has_trivial_assign.hpp>
+#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#include <boost/type_traits/declval.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_assignable.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#endif
+#endif
+#if defined(__GNUC__) || defined(__SUNPRO_CC)
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/is_assignable.hpp>
+#include <boost/type_traits/is_array.hpp>
+#ifdef BOOST_INTEL
+#include <boost/type_traits/is_pod.hpp>
+#endif
+#endif
namespace boost {
-namespace detail{
+#if !defined(BOOST_HAS_NOTHROW_ASSIGN) && !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+
+ namespace detail
+ {
+ template <class T, bool b1, bool b2> struct has_nothrow_assign_imp{ static const bool value = false; };
+ template <class T> struct has_nothrow_assign_imp<T, false, true>{ static const bool value = noexcept(boost::declval<typename add_reference<T>::type>() = boost::declval<typename add_reference<T const>::type>()); };
+ template <class T, std::size_t N> struct has_nothrow_assign_imp<T[N], false, true>{ static const bool value = has_nothrow_assign_imp<T, false, true>::value; };
+ template <class T> struct has_nothrow_assign_imp<T[], false, true>{ static const bool value = has_nothrow_assign_imp<T, false, true>::value; };
+ }
-template <class T>
-struct has_nothrow_assign_imp{
+#endif
+
+ template <class T>
+ struct has_nothrow_assign : public integral_constant < bool,
#ifndef BOOST_HAS_NOTHROW_ASSIGN
- BOOST_STATIC_CONSTANT(bool, value = ::boost::has_trivial_assign<T>::value);
+#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ // Portable C++11 version:
+ detail::has_nothrow_assign_imp<T,
+ (is_const<typename remove_reference<T>::type>::value || is_volatile<typename remove_reference<T>::type>::value || is_reference<T>::value),
+ is_assignable<typename add_reference<T>::type, typename add_reference<const T>::type>::value
+ >::value
#else
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_NOTHROW_ASSIGN(T));
+ ::boost::has_trivial_assign<T>::value
#endif
-};
-
-}
+#else
+ BOOST_HAS_NOTHROW_ASSIGN(T)
+#endif
+ > {};
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_assign,T,::boost::detail::has_nothrow_assign_imp<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void,false)
+template <class T, std::size_t N> struct has_nothrow_assign <T[N]> : public has_nothrow_assign<T> {};
+template <> struct has_nothrow_assign<void> : public false_type{};
+template <class T> struct has_nothrow_assign<T volatile> : public false_type{};
+template <class T> struct has_nothrow_assign<T&> : public false_type{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template <class T> struct has_nothrow_assign<T&&> : public false_type{};
+#endif
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_assign,void volatile,false)
+template <> struct has_nothrow_assign<void const> : public false_type{};
+template <> struct has_nothrow_assign<void const volatile> : public false_type{};
+template <> struct has_nothrow_assign<void volatile> : public false_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_HAS_NOTHROW_ASSIGN_HPP_INCLUDED
diff --git a/boost/type_traits/has_nothrow_constructor.hpp b/boost/type_traits/has_nothrow_constructor.hpp
index 3bc4f802c2..e5af89fe59 100644
--- a/boost/type_traits/has_nothrow_constructor.hpp
+++ b/boost/type_traits/has_nothrow_constructor.hpp
@@ -9,45 +9,64 @@
#ifndef BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED
#define BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED
-#include <boost/type_traits/has_trivial_constructor.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#if defined(BOOST_MSVC) || defined(BOOST_INTEL)
+#include <boost/type_traits/has_trivial_constructor.hpp>
+#endif
+#if defined(__GNUC__ ) || defined(__SUNPRO_CC)
+#include <boost/type_traits/is_default_constructible.hpp>
+#endif
namespace boost {
-namespace detail{
+template <class T> struct has_nothrow_constructor : public integral_constant<bool, BOOST_HAS_NOTHROW_CONSTRUCTOR(T)>{};
-template <class T>
-struct has_nothrow_constructor_imp{
-#ifdef BOOST_HAS_NOTHROW_CONSTRUCTOR
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_NOTHROW_CONSTRUCTOR(T));
-#else
- BOOST_STATIC_CONSTANT(bool, value = ::boost::has_trivial_constructor<T>::value);
+#elif !defined(BOOST_NO_CXX11_NOEXCEPT)
+
+#include <boost/type_traits/is_default_constructible.hpp>
+#include <boost/type_traits/remove_all_extents.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4197) // top-level volatile in cast is ignored
#endif
-};
+namespace boost { namespace detail{
+
+ template <class T, bool b> struct has_nothrow_constructor_imp : public boost::integral_constant<bool, false>{};
+ template <class T> struct has_nothrow_constructor_imp<T, true> : public boost::integral_constant<bool, noexcept(T())>{};
+ template <class T, std::size_t N> struct has_nothrow_constructor_imp<T[N], true> : public has_nothrow_constructor_imp<T, true> {};
}
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_constructor,T,::boost::detail::has_nothrow_constructor_imp<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_default_constructor,T,::boost::detail::has_nothrow_constructor_imp<T>::value)
+template <class T> struct has_nothrow_constructor : public detail::has_nothrow_constructor_imp<T, is_default_constructible<T>::value>{};
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void,false)
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_constructor,void volatile,false)
+#ifdef BOOST_MSVC
+#pragma warning(pop)
#endif
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void,false)
+#else
+
+#include <boost/type_traits/has_trivial_constructor.hpp>
+
+namespace boost {
+
+template <class T> struct has_nothrow_constructor : public ::boost::has_trivial_constructor<T> {};
+
+#endif
+
+template<> struct has_nothrow_constructor<void> : public false_type {};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_default_constructor,void volatile,false)
+template<> struct has_nothrow_constructor<void const> : public false_type{};
+template<> struct has_nothrow_constructor<void const volatile> : public false_type{};
+template<> struct has_nothrow_constructor<void volatile> : public false_type{};
#endif
-} // namespace boost
+template <class T> struct has_nothrow_default_constructor : public has_nothrow_constructor<T>{};
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+} // namespace boost
#endif // BOOST_TT_HAS_NOTHROW_CONSTRUCTOR_HPP_INCLUDED
diff --git a/boost/type_traits/has_nothrow_copy.hpp b/boost/type_traits/has_nothrow_copy.hpp
index 9c3c9030a4..0d9bb18379 100644
--- a/boost/type_traits/has_nothrow_copy.hpp
+++ b/boost/type_traits/has_nothrow_copy.hpp
@@ -9,45 +9,74 @@
#ifndef BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED
#define BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED
-#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+#ifdef BOOST_HAS_NOTHROW_COPY
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#if defined(BOOST_CLANG) || defined(__GNUC__) || defined(__ghs__) || defined(__CODEGEARC__) || defined(__SUNPRO_CC)
+#include <boost/type_traits/is_volatile.hpp>
+#include <boost/type_traits/is_copy_constructible.hpp>
+#include <boost/type_traits/is_reference.hpp>
+#include <boost/type_traits/is_array.hpp>
+#ifdef BOOST_INTEL
+#include <boost/type_traits/is_pod.hpp>
+#endif
+#elif defined(BOOST_MSVC) || defined(BOOST_INTEL)
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/is_array.hpp>
+#ifdef BOOST_INTEL
+#include <boost/type_traits/add_lvalue_reference.hpp>
+#include <boost/type_traits/add_const.hpp>
+#endif
+#endif
namespace boost {
+template <class T> struct has_nothrow_copy_constructor : public integral_constant<bool, BOOST_HAS_NOTHROW_COPY(T)>{};
+
+#elif !defined(BOOST_NO_CXX11_NOEXCEPT)
+
+#include <boost/type_traits/declval.hpp>
+#include <boost/type_traits/is_copy_constructible.hpp>
+
+namespace boost{
+
namespace detail{
+template <class T, bool b>
+struct has_nothrow_copy_constructor_imp : public boost::integral_constant<bool, false>{};
template <class T>
-struct has_nothrow_copy_imp{
-#ifdef BOOST_HAS_NOTHROW_COPY
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_NOTHROW_COPY(T));
-#else
- BOOST_STATIC_CONSTANT(bool, value = ::boost::has_trivial_copy<T>::value);
-#endif
-};
+struct has_nothrow_copy_constructor_imp<T, true> : public boost::integral_constant<bool, noexcept(T(boost::declval<const T&>()))>{};
}
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_copy,T,::boost::detail::has_nothrow_copy_imp<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_copy_constructor,T,::boost::detail::has_nothrow_copy_imp<T>::value)
+template <class T> struct has_nothrow_copy_constructor : public detail::has_nothrow_copy_constructor_imp<T, boost::is_copy_constructible<T>::value>{};
+
+#else
+
+#include <boost/type_traits/has_trivial_copy.hpp>
+
+namespace boost{
+
+template <class T> struct has_nothrow_copy_constructor : public integral_constant<bool, ::boost::has_trivial_copy<T>::value>{};
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void,false)
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy,void volatile,false)
#endif
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void,false)
+template <> struct has_nothrow_copy_constructor<void> : public false_type{};
+template <class T> struct has_nothrow_copy_constructor<T volatile> : public false_type{};
+template <class T> struct has_nothrow_copy_constructor<T&> : public false_type{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template <class T> struct has_nothrow_copy_constructor<T&&> : public false_type{};
+#endif
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_nothrow_copy_constructor,void volatile,false)
+template <> struct has_nothrow_copy_constructor<void const> : public false_type{};
+template <> struct has_nothrow_copy_constructor<void volatile> : public false_type{};
+template <> struct has_nothrow_copy_constructor<void const volatile> : public false_type{};
#endif
-} // namespace boost
+template <class T> struct has_nothrow_copy : public has_nothrow_copy_constructor<T>{};
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+} // namespace boost
#endif // BOOST_TT_HAS_NOTHROW_COPY_HPP_INCLUDED
diff --git a/boost/type_traits/has_nothrow_destructor.hpp b/boost/type_traits/has_nothrow_destructor.hpp
index 4f5882afc0..273eb9f198 100644
--- a/boost/type_traits/has_nothrow_destructor.hpp
+++ b/boost/type_traits/has_nothrow_destructor.hpp
@@ -11,15 +11,37 @@
#include <boost/type_traits/has_trivial_destructor.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(__SUNPRO_CC) && !defined(BOOST_MSVC)
+
+#include <boost/type_traits/declval.hpp>
+#include <boost/type_traits/is_destructible.hpp>
+
+namespace boost{
+
+ namespace detail{
+
+ template <class T, bool b>
+ struct has_nothrow_destructor_imp : public boost::integral_constant<bool, false>{};
+ template <class T>
+ struct has_nothrow_destructor_imp<T, true> : public boost::integral_constant<bool, noexcept(boost::declval<T*&>()->~T())>{};
+
+ }
+
+ template <class T> struct has_nothrow_destructor : public detail::has_nothrow_destructor_imp<T, boost::is_destructible<T>::value>{};
+ template <class T, std::size_t N> struct has_nothrow_destructor<T[N]> : public has_nothrow_destructor<T>{};
+ template <class T> struct has_nothrow_destructor<T&> : public integral_constant<bool, false>{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ template <class T> struct has_nothrow_destructor<T&&> : public integral_constant<bool, false>{};
+#endif
+}
+#else
namespace boost {
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_nothrow_destructor,T,::boost::has_trivial_destructor<T>::value)
+template <class T> struct has_nothrow_destructor : public ::boost::has_trivial_destructor<T> {};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+#endif
#endif // BOOST_TT_HAS_NOTHROW_DESTRUCTOR_HPP_INCLUDED
diff --git a/boost/type_traits/has_plus.hpp b/boost/type_traits/has_plus.hpp
index 70c12008f4..2d7932884d 100644
--- a/boost/type_traits/has_plus.hpp
+++ b/boost/type_traits/has_plus.hpp
@@ -12,37 +12,37 @@
#define BOOST_TT_TRAIT_NAME has_plus
#define BOOST_TT_TRAIT_OP +
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) || \
/* Lhs==void* and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_void< Lhs_noptr >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==void* and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::is_void< Rhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ::boost::is_void< Rhs_noptr >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ ) || \
/* Rhs==pointer and Lhs==fundamental and Lhs!=integral */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value\
- >::value\
- >::value
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ (! ::boost::is_integral< Lhs_noref >::value )\
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_plus_assign.hpp b/boost/type_traits/has_plus_assign.hpp
index 6d65204dcf..5ef6f23289 100644
--- a/boost/type_traits/has_plus_assign.hpp
+++ b/boost/type_traits/has_plus_assign.hpp
@@ -12,49 +12,49 @@
#define BOOST_TT_TRAIT_NAME has_plus_assign
#define BOOST_TT_TRAIT_OP +=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) || \
/* Lhs==void* and Rhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_void< Lhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_void< Lhs_noptr >::value && \
::boost::is_fundamental< Rhs_nocv >::value\
- >::value,\
+ ) || \
/* Rhs==void* and Lhs==fundamental */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::is_void< Rhs_noptr >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ::boost::is_void< Rhs_noptr >::value && \
::boost::is_fundamental< Lhs_nocv >::value\
- >::value,\
+ ) || \
/* Lhs==pointer and Rhs==fundamental and Rhs!=integral */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ ) || \
/* Rhs==pointer and Lhs==fundamental and Lhs!=bool */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::type_traits::ice_not< ::boost::is_same< Lhs_nocv, bool >::value >::value\
- >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ (! ::boost::is_same< Lhs_nocv, bool >::value )\
+ ) || \
/* (Lhs==fundamental or Lhs==pointer) and (Rhs==fundamental or Rhs==pointer) and (Lhs==const) */\
- ::boost::type_traits::ice_and<\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ ) && \
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_post_decrement.hpp b/boost/type_traits/has_post_decrement.hpp
index 024acb06e2..e3f98fff1c 100644
--- a/boost/type_traits/has_post_decrement.hpp
+++ b/boost/type_traits/has_post_decrement.hpp
@@ -14,25 +14,25 @@
#define BOOST_TT_TRAIT_NAME has_post_decrement
#define BOOST_TT_TRAIT_OP --
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* bool */\
- ::boost::is_same< bool, Lhs_nocv >::value,\
+ ::boost::is_same< bool, Lhs_nocv >::value || \
/* void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_void< Lhs_noptr >::value\
- >::value,\
+ ) || \
/* (fundamental or pointer) and const */\
- ::boost::type_traits::ice_and<\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ( \
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ ) && \
::boost::is_const< Lhs_noref >::value\
- >::value,\
+ )||\
/* Arrays */ \
::boost::is_array<Lhs_noref>::value\
- >::value
+ )
#include <boost/type_traits/detail/has_postfix_operator.hpp>
diff --git a/boost/type_traits/has_post_increment.hpp b/boost/type_traits/has_post_increment.hpp
index b055607d52..3861a2bbde 100644
--- a/boost/type_traits/has_post_increment.hpp
+++ b/boost/type_traits/has_post_increment.hpp
@@ -14,25 +14,25 @@
#define BOOST_TT_TRAIT_NAME has_post_increment
#define BOOST_TT_TRAIT_OP ++
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* bool */\
- ::boost::is_same< bool, Lhs_nocv >::value,\
+ ::boost::is_same< bool, Lhs_nocv >::value || \
/* void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_void< Lhs_noptr >::value\
- >::value,\
+ ) || \
/* (fundamental or pointer) and const */\
- ::boost::type_traits::ice_and<\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ( \
+ ::boost::is_fundamental< Lhs_nocv >::value || \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ ) && \
::boost::is_const< Lhs_noref >::value\
- >::value,\
+ )||\
/* Arrays */ \
::boost::is_array<Lhs_noref>::value\
- >::value
+ )
#include <boost/type_traits/detail/has_postfix_operator.hpp>
diff --git a/boost/type_traits/has_pre_decrement.hpp b/boost/type_traits/has_pre_decrement.hpp
index feb3d9d2e6..7ef078329b 100644
--- a/boost/type_traits/has_pre_decrement.hpp
+++ b/boost/type_traits/has_pre_decrement.hpp
@@ -14,25 +14,25 @@
#define BOOST_TT_TRAIT_NAME has_pre_decrement
#define BOOST_TT_TRAIT_OP --
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* bool */\
- ::boost::is_same< bool, Rhs_nocv >::value,\
+ ::boost::is_same< bool, Rhs_nocv >::value || \
/* void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_void< Rhs_noptr >::value\
- >::value,\
+ ) || \
/* (fundamental or pointer) and const */\
- ::boost::type_traits::ice_and<\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) && \
::boost::is_const< Rhs_noref >::value\
- >::value,\
+ )||\
/* Arrays */ \
::boost::is_array<Rhs_noref>::value\
- >::value
+ )
#include <boost/type_traits/detail/has_prefix_operator.hpp>
diff --git a/boost/type_traits/has_pre_increment.hpp b/boost/type_traits/has_pre_increment.hpp
index 6a2411de69..c4c973487c 100644
--- a/boost/type_traits/has_pre_increment.hpp
+++ b/boost/type_traits/has_pre_increment.hpp
@@ -14,25 +14,25 @@
#define BOOST_TT_TRAIT_NAME has_pre_increment
#define BOOST_TT_TRAIT_OP ++
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* bool */\
- ::boost::is_same< bool, Rhs_nocv >::value,\
+ ::boost::is_same< bool, Rhs_nocv >::value || \
/* void* */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Rhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Rhs_noref >::value && \
::boost::is_void< Rhs_noptr >::value\
- >::value,\
+ ) || \
/* (fundamental or pointer) and const */\
- ::boost::type_traits::ice_and<\
- ::boost::type_traits::ice_or<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ( \
+ ::boost::is_fundamental< Rhs_nocv >::value || \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ ) && \
::boost::is_const< Rhs_noref >::value\
- >::value,\
+ )||\
/* Arrays */ \
::boost::is_array<Rhs_noref>::value\
- >::value
+ )
#include <boost/type_traits/detail/has_prefix_operator.hpp>
diff --git a/boost/type_traits/has_right_shift.hpp b/boost/type_traits/has_right_shift.hpp
index 5735870159..5562911233 100644
--- a/boost/type_traits/has_right_shift.hpp
+++ b/boost/type_traits/has_right_shift.hpp
@@ -12,32 +12,32 @@
#define BOOST_TT_TRAIT_NAME has_right_shift
#define BOOST_TT_TRAIT_OP >>
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_right_shift_assign.hpp b/boost/type_traits/has_right_shift_assign.hpp
index 0536e71b6a..0e2c263559 100644
--- a/boost/type_traits/has_right_shift_assign.hpp
+++ b/boost/type_traits/has_right_shift_assign.hpp
@@ -12,38 +12,38 @@
#define BOOST_TT_TRAIT_NAME has_right_shift_assign
#define BOOST_TT_TRAIT_OP >>=
#define BOOST_TT_FORBIDDEN_IF\
- ::boost::type_traits::ice_or<\
+ (\
/* Lhs==fundamental and Rhs==fundamental and (Lhs!=integral or Rhs!=integral) */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
- ::boost::type_traits::ice_or<\
- ::boost::type_traits::ice_not< ::boost::is_integral< Lhs_noref >::value >::value,\
- ::boost::type_traits::ice_not< ::boost::is_integral< Rhs_noref >::value >::value\
- >::value\
- >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
+ ( \
+ (! ::boost::is_integral< Lhs_noref >::value ) || \
+ (! ::boost::is_integral< Rhs_noref >::value )\
+ )\
+ )||\
/* Lhs==fundamental and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Rhs==fundamental and Lhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_pointer< Lhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==pointer and Rhs==pointer */\
- ::boost::type_traits::ice_and<\
- ::boost::is_pointer< Lhs_noref >::value,\
+ (\
+ ::boost::is_pointer< Lhs_noref >::value && \
::boost::is_pointer< Rhs_noref >::value\
- >::value,\
+ )||\
/* Lhs==fundamental and Rhs==fundamental and Lhs==const */\
- ::boost::type_traits::ice_and<\
- ::boost::is_fundamental< Lhs_nocv >::value,\
- ::boost::is_fundamental< Rhs_nocv >::value,\
+ (\
+ ::boost::is_fundamental< Lhs_nocv >::value && \
+ ::boost::is_fundamental< Rhs_nocv >::value && \
::boost::is_const< Lhs_noref >::value\
- >::value\
- >::value
+ )\
+ )
#include <boost/type_traits/detail/has_binary_operator.hpp>
diff --git a/boost/type_traits/has_trivial_assign.hpp b/boost/type_traits/has_trivial_assign.hpp
index 404b62c70d..a5e625d1ae 100644
--- a/boost/type_traits/has_trivial_assign.hpp
+++ b/boost/type_traits/has_trivial_assign.hpp
@@ -9,49 +9,43 @@
#ifndef BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED
#define BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+#if !defined(BOOST_HAS_TRIVIAL_ASSIGN) || defined(BOOST_MSVC) || defined(__GNUC__) || defined(BOOST_INTEL) || defined(__SUNPRO_CC) || defined(__clang)
#include <boost/type_traits/is_pod.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/is_assignable.hpp>
+#endif
namespace boost {
-namespace detail {
-
-template <typename T>
-struct has_trivial_assign_impl
-{
+ template <typename T>
+ struct has_trivial_assign : public integral_constant < bool,
#ifdef BOOST_HAS_TRIVIAL_ASSIGN
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_ASSIGN(T));
+ BOOST_HAS_TRIVIAL_ASSIGN(T)
#else
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::is_pod<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_const<T>::value >::value,
- ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
- >::value));
+ ::boost::is_pod<T>::value && !::boost::is_const<T>::value && !::boost::is_volatile<T>::value
#endif
-};
+ > {};
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_assign,T,::boost::detail::has_trivial_assign_impl<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void,false)
+ template<> struct has_trivial_assign<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_assign,void volatile,false)
+ template<> struct has_trivial_assign<void const> : public false_type{};
+ template<> struct has_trivial_assign<void const volatile> : public false_type{};
+ template<> struct has_trivial_assign<void volatile> : public false_type{};
+#endif
+ template <class T> struct has_trivial_assign<T volatile> : public false_type{};
+ template <class T> struct has_trivial_assign<T&> : public false_type{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ template <class T> struct has_trivial_assign<T&&> : public false_type{};
#endif
+ // Arrays are not explictly assignable:
+ template <typename T, std::size_t N> struct has_trivial_assign<T[N]> : public false_type{};
+ template <typename T> struct has_trivial_assign<T[]> : public false_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED
diff --git a/boost/type_traits/has_trivial_constructor.hpp b/boost/type_traits/has_trivial_constructor.hpp
index 30dbdd8f93..06c137d1de 100644
--- a/boost/type_traits/has_trivial_constructor.hpp
+++ b/boost/type_traits/has_trivial_constructor.hpp
@@ -9,43 +9,49 @@
#ifndef BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED
#define BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
#include <boost/type_traits/is_pod.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/is_default_constructible.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#ifdef BOOST_HAS_TRIVIAL_CONSTRUCTOR
+#ifdef BOOST_HAS_SGI_TYPE_TRAITS
+#include <boost/type_traits/is_same.hpp>
+#elif defined(__GNUC__) || defined(__SUNPRO_CC)
+#include <boost/type_traits/is_volatile.hpp>
+#ifdef BOOST_INTEL
+#include <boost/type_traits/is_pod.hpp>
+#endif
+#endif
+#endif
-namespace boost {
-namespace detail {
+#if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || defined(BOOST_CLANG) || (defined(__SUNPRO_CC) && defined(BOOST_HAS_TRIVIAL_CONSTRUCTOR))
+#include <boost/type_traits/is_default_constructible.hpp>
+#define BOOST_TT_TRIVIAL_CONSTRUCT_FIX && is_default_constructible<T>::value
+#else
+//
+// Mot all compilers, particularly older GCC versions can handle the fix above.
+#define BOOST_TT_TRIVIAL_CONSTRUCT_FIX
+#endif
+
+namespace boost {
-template <typename T>
-struct has_trivial_ctor_impl
-{
+template <typename T> struct has_trivial_constructor
#ifdef BOOST_HAS_TRIVIAL_CONSTRUCTOR
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_pod<T>::value,
- BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)
- >::value));
+ : public integral_constant <bool, ((::boost::is_pod<T>::value || BOOST_HAS_TRIVIAL_CONSTRUCTOR(T)) BOOST_TT_TRIVIAL_CONSTRUCT_FIX)>{};
#else
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_pod<T>::value,
- false
- >::value));
+ : public integral_constant <bool, ::boost::is_pod<T>::value>{};
#endif
-};
-} // namespace detail
+template <> struct has_trivial_constructor<void> : public boost::false_type{};
+template <> struct has_trivial_constructor<void const> : public boost::false_type{};
+template <> struct has_trivial_constructor<void const volatile> : public boost::false_type{};
+template <> struct has_trivial_constructor<void volatile> : public boost::false_type{};
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_constructor,T,::boost::detail::has_trivial_ctor_impl<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_default_constructor,T,::boost::detail::has_trivial_ctor_impl<T>::value)
+template <class T> struct has_trivial_default_constructor : public has_trivial_constructor<T> {};
-} // namespace boost
+#undef BOOST_TT_TRIVIAL_CONSTRUCT_FIX
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+} // namespace boost
#endif // BOOST_TT_HAS_TRIVIAL_CONSTRUCTOR_HPP_INCLUDED
diff --git a/boost/type_traits/has_trivial_copy.hpp b/boost/type_traits/has_trivial_copy.hpp
index 1c567cf042..9d3265d1dc 100644
--- a/boost/type_traits/has_trivial_copy.hpp
+++ b/boost/type_traits/has_trivial_copy.hpp
@@ -9,74 +9,54 @@
#ifndef BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED
#define BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
-#include <boost/type_traits/is_volatile.hpp>
#include <boost/type_traits/is_pod.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
+#include <boost/type_traits/is_reference.hpp>
-#ifdef __clang__
+#if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || defined(BOOST_CLANG) || (defined(__SUNPRO_CC) && defined(BOOST_HAS_TRIVIAL_COPY))
#include <boost/type_traits/is_copy_constructible.hpp>
+#define BOOST_TT_TRIVIAL_CONSTRUCT_FIX && is_copy_constructible<T>::value
+#else
+#define BOOST_TT_TRIVIAL_CONSTRUCT_FIX
#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#ifdef BOOST_INTEL
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_lvalue_reference.hpp>
+#endif
namespace boost {
-namespace detail {
-
-template <typename T>
-struct has_trivial_copy_impl
-{
+template <typename T> struct has_trivial_copy
+: public integral_constant<bool,
#ifdef BOOST_HAS_TRIVIAL_COPY
-# ifdef __clang__
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_COPY(T) && boost::is_copy_constructible<T>::value);
-# else
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_COPY(T));
-# endif
+ BOOST_HAS_TRIVIAL_COPY(T) BOOST_TT_TRIVIAL_CONSTRUCT_FIX
#else
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::is_pod<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
- >::value));
-#endif
-};
-
-#ifdef __clang__
-
-template <typename T, std::size_t N>
-struct has_trivial_copy_impl<T[N]>
-{
- static const bool value = has_trivial_copy_impl<T>::value;
-};
-
+ ::boost::is_pod<T>::value
#endif
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy,T,::boost::detail::has_trivial_copy_impl<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_copy_constructor,T,::boost::detail::has_trivial_copy_impl<T>::value)
-
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void,false)
+>{};
+// Arrays are not explicitly copyable:
+template <typename T, std::size_t N> struct has_trivial_copy<T[N]> : public false_type{};
+template <typename T> struct has_trivial_copy<T[]> : public false_type{};
+// Are volatile types ever trivial? We don't really know, so assume not:
+template <typename T> struct has_trivial_copy<T volatile> : public false_type{};
+
+template <> struct has_trivial_copy<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy,void volatile,false)
+template <> struct has_trivial_copy<void const> : public false_type{};
+template <> struct has_trivial_copy<void volatile> : public false_type{};
+template <> struct has_trivial_copy<void const volatile> : public false_type{};
#endif
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void,false)
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_copy_constructor,void volatile,false)
+template <class T> struct has_trivial_copy<T&> : public false_type{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template <class T> struct has_trivial_copy<T&&> : public false_type{};
#endif
-} // namespace boost
+template <class T> struct has_trivial_copy_constructor : public has_trivial_copy<T>{};
+
+#undef BOOST_TT_TRIVIAL_CONSTRUCT_FIX
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+} // namespace boost
#endif // BOOST_TT_HAS_TRIVIAL_COPY_HPP_INCLUDED
diff --git a/boost/type_traits/has_trivial_destructor.hpp b/boost/type_traits/has_trivial_destructor.hpp
index 79d7522fdc..763283d78c 100644
--- a/boost/type_traits/has_trivial_destructor.hpp
+++ b/boost/type_traits/has_trivial_destructor.hpp
@@ -9,41 +9,40 @@
#ifndef BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED
#define BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+#ifdef BOOST_HAS_TRIVIAL_DESTRUCTOR
+
+#if defined(BOOST_INTEL) || defined(BOOST_MSVC)
#include <boost/type_traits/is_pod.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
+#endif
+#ifdef BOOST_HAS_SGI_TYPE_TRAITS
+#include <boost/type_traits/is_same.hpp>
+#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#if defined(__GNUC__) || defined(__clang) || defined(__SUNPRO_CC)
+#include <boost/type_traits/is_destructible.hpp>
+#endif
namespace boost {
-namespace detail {
-
-template <typename T>
-struct has_trivial_dtor_impl
-{
-#ifdef BOOST_HAS_TRIVIAL_DESTRUCTOR
- BOOST_STATIC_CONSTANT(bool, value = BOOST_HAS_TRIVIAL_DESTRUCTOR(T));
+template <typename T> struct has_trivial_destructor : public integral_constant<bool, BOOST_HAS_TRIVIAL_DESTRUCTOR(T)>{};
#else
- BOOST_STATIC_CONSTANT(bool, value = ::boost::is_pod<T>::value);
-#endif
-};
+#include <boost/type_traits/is_pod.hpp>
-} // namespace detail
+namespace boost{
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_destructor,T,::boost::detail::has_trivial_dtor_impl<T>::value)
+template <typename T> struct has_trivial_destructor : public integral_constant<bool, ::boost::is_pod<T>::value>{};
+#endif
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void,false)
+template <> struct has_trivial_destructor<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_destructor,void volatile,false)
+template <> struct has_trivial_destructor<void const> : public false_type{};
+template <> struct has_trivial_destructor<void const volatile> : public false_type{};
+template <> struct has_trivial_destructor<void volatile> : public false_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED
diff --git a/boost/type_traits/has_trivial_move_assign.hpp b/boost/type_traits/has_trivial_move_assign.hpp
index db337f77e8..f7bb1987cb 100644
--- a/boost/type_traits/has_trivial_move_assign.hpp
+++ b/boost/type_traits/has_trivial_move_assign.hpp
@@ -11,47 +11,62 @@
#ifndef BOOST_TT_HAS_TRIVIAL_MOVE_ASSIGN_HPP_INCLUDED
#define BOOST_TT_HAS_TRIVIAL_MOVE_ASSIGN_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+#if !defined(BOOST_HAS_TRIVIAL_MOVE_ASSIGN) || defined(BOOST_MSVC) || defined(BOOST_INTEL)
#include <boost/type_traits/is_pod.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
+#ifdef BOOST_MSVC
+#include <boost/type_traits/is_reference.hpp>
+#endif
+#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#if defined(__GNUC__) || defined(__clang)
+#include <boost/type_traits/is_assignable.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#endif
-namespace boost {
+#ifdef __SUNPRO_CC
+#include <boost/type_traits/is_assignable.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#if __cplusplus >= 201103
+#define SOLARIS_EXTRA_CHECK && is_assignable<typename remove_const<T>::type&, typename remove_const<T>::type&&>::value
+#endif
+#endif
+
+#ifndef SOLARIS_EXTRA_CHECK
+#define SOLARIS_EXTRA_CHECK
+#endif
-namespace detail {
+namespace boost{
template <typename T>
-struct has_trivial_move_assign_impl
-{
+struct has_trivial_move_assign : public integral_constant<bool,
#ifdef BOOST_HAS_TRIVIAL_MOVE_ASSIGN
- BOOST_STATIC_CONSTANT(bool, value = (BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T)));
+ BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T)
#else
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::is_pod<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_const<T>::value >::value,
- ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
- >::value));
+ ::boost::is_pod<T>::value && !::boost::is_const<T>::value && !::boost::is_volatile<T>::value SOLARIS_EXTRA_CHECK
#endif
-};
+ > {};
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_move_assign,T,::boost::detail::has_trivial_move_assign_impl<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void,false)
+template <> struct has_trivial_move_assign<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_assign,void volatile,false)
+template <> struct has_trivial_move_assign<void const> : public false_type{};
+template <> struct has_trivial_move_assign<void const volatile> : public false_type{};
+template <> struct has_trivial_move_assign<void volatile> : public false_type{};
+#endif
+template <class T> struct has_trivial_move_assign<T&> : public false_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T> struct has_trivial_move_assign<T&&> : public false_type{};
#endif
+// Array types are not assignable:
+template <class T, std::size_t N> struct has_trivial_move_assign<T[N]> : public false_type{};
+template <class T> struct has_trivial_move_assign<T[]> : public false_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+#undef SOLARIS_EXTRA_CHECK
#endif // BOOST_TT_HAS_TRIVIAL_MOVE_ASSIGN_HPP_INCLUDED
diff --git a/boost/type_traits/has_trivial_move_constructor.hpp b/boost/type_traits/has_trivial_move_constructor.hpp
index a3418340b4..9e601f38ae 100644
--- a/boost/type_traits/has_trivial_move_constructor.hpp
+++ b/boost/type_traits/has_trivial_move_constructor.hpp
@@ -11,47 +11,67 @@
#ifndef BOOST_TT_HAS_TRIVIAL_MOVE_CONSTRUCTOR_HPP_INCLUDED
#define BOOST_TT_HAS_TRIVIAL_MOVE_CONSTRUCTOR_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+#ifdef BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR
+
+#if defined(BOOST_MSVC) || defined(BOOST_INTEL)
#include <boost/type_traits/is_pod.hpp>
#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
+#endif
+
+#if defined(__GNUC__) || defined(__clang)
+#include <boost/type_traits/is_constructible.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
-namespace detail {
+template <typename T> struct has_trivial_move_constructor : public integral_constant<bool, BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)>{};
-template <typename T>
-struct has_trivial_move_ctor_impl
-{
-#ifdef BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR
- BOOST_STATIC_CONSTANT(bool, value = (BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T)));
#else
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::is_pod<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value
- >::value));
+
+#ifdef __SUNPRO_CC
+#include <boost/type_traits/is_constructible.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#if __cplusplus >= 201103
+#define SOLARIS_EXTRA_CHECK && is_constructible<typename remove_const<T>::type, typename remove_const<T>::type&&>::value
+#endif
#endif
-};
-} // namespace detail
+#ifndef SOLARIS_EXTRA_CHECK
+#define SOLARIS_EXTRA_CHECK
+#endif
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_trivial_move_constructor,T,::boost::detail::has_trivial_move_ctor_impl<T>::value)
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/is_volatile.hpp>
+
+namespace boost {
+
+template <typename T> struct has_trivial_move_constructor
+ : public integral_constant<bool, ::boost::is_pod<T>::value && !::boost::is_volatile<T>::value SOLARIS_EXTRA_CHECK>{};
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void,false)
+#undef SOLARIS_EXTRA_CHECK
+
+#endif
+
+template <> struct has_trivial_move_constructor<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(has_trivial_move_constructor,void volatile,false)
+template <> struct has_trivial_move_constructor<void const> : public false_type{};
+template <> struct has_trivial_move_constructor<void volatile> : public false_type{};
+template <> struct has_trivial_move_constructor<void const volatile> : public false_type{};
#endif
+// What should we do with reference types??? The standard seems to suggest these are trivial, even if the thing they reference is not:
+template <class T> struct has_trivial_move_constructor<T&> : public true_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T> struct has_trivial_move_constructor<T&&> : public true_type{};
+#endif
+// Arrays can not be explicitly copied:
+template <class T, std::size_t N> struct has_trivial_move_constructor<T[N]> : public false_type{};
+template <class T> struct has_trivial_move_constructor<T[]> : public false_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_HAS_TRIVIAL_MOVE_CONSTRUCTOR_HPP_INCLUDED
diff --git a/boost/type_traits/has_virtual_destructor.hpp b/boost/type_traits/has_virtual_destructor.hpp
index b741197d3a..4b0f38368a 100644
--- a/boost/type_traits/has_virtual_destructor.hpp
+++ b/boost/type_traits/has_virtual_destructor.hpp
@@ -11,19 +11,16 @@
#define BOOST_TT_HAS_VIRTUAL_DESTRUCTOR_HPP_INCLUDED
#include <boost/type_traits/intrinsics.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
#ifdef BOOST_HAS_VIRTUAL_DESTRUCTOR
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_virtual_destructor,T,BOOST_HAS_VIRTUAL_DESTRUCTOR(T))
+ template <class T> struct has_virtual_destructor : public integral_constant<bool, BOOST_HAS_VIRTUAL_DESTRUCTOR(T)>{};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_virtual_destructor,T,false)
+ template <class T> struct has_virtual_destructor : public integral_constant<bool, false>{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/integral_constant.hpp b/boost/type_traits/integral_constant.hpp
index c6847715e0..ae2448d070 100644
--- a/boost/type_traits/integral_constant.hpp
+++ b/boost/type_traits/integral_constant.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright John Maddock 2005.
+// (C) Copyright John Maddock 2015.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -7,32 +7,99 @@
#define BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP
#include <boost/config.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/integral_c.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
+ || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
+ || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \
+ || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
+ || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) )
+
namespace boost{
+ namespace mpl
+ {
+ template <bool B> struct bool_;
+ template <class I, I val> struct integral_c;
+ struct integral_c_tag;
+ }
+}
-#if defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS) || defined(__BORLANDC__)
-template <class T, int val>
#else
-template <class T, T val>
-#endif
-struct integral_constant : public mpl::integral_c<T, val>
-{
- typedef integral_constant<T,val> type;
-};
-template<> struct integral_constant<bool,true> : public mpl::true_
-{
- typedef integral_constant<bool,true> type;
-};
-template<> struct integral_constant<bool,false> : public mpl::false_
+namespace mpl_{
+
+ template <bool B> struct bool_;
+ template <class I, I val> struct integral_c;
+ struct integral_c_tag;
+}
+
+namespace boost
{
- typedef integral_constant<bool,false> type;
-};
+ namespace mpl
+ {
+ using ::mpl_::bool_;
+ using ::mpl_::integral_c;
+ using ::mpl_::integral_c_tag;
+ }
+}
+
+#endif
+
+namespace boost{
+
+ template <class T, T val>
+ struct integral_constant
+ {
+ typedef mpl::integral_c_tag tag;
+ typedef T value_type;
+ typedef integral_constant<T, val> type;
+ static const T value = val;
+ //
+ // This helper function is just to disable type-punning
+ // warnings from GCC:
+ //
+ template <class U>
+ static U& dereference(U* p) { return *p; }
+
+ operator const mpl::integral_c<T, val>& ()const
+ {
+ static const char data[sizeof(long)] = { 0 };
+ return dereference(reinterpret_cast<const mpl::integral_c<T, val>*>(&data));
+ }
+ BOOST_CONSTEXPR operator T()const { return val; }
+ };
+
+ template <class T, T val>
+ T const integral_constant<T, val>::value;
+
+ template <bool val>
+ struct integral_constant<bool, val>
+ {
+ typedef mpl::integral_c_tag tag;
+ typedef bool value_type;
+ typedef integral_constant<bool, val> type;
+ static const bool value = val;
+ //
+ // This helper function is just to disable type-punning
+ // warnings from GCC:
+ //
+ template <class T>
+ static T& dereference(T* p) { return *p; }
+
+ operator const mpl::bool_<val>& ()const
+ {
+ static const char data = 0;
+ return dereference(reinterpret_cast<const mpl::bool_<val>*>(&data));
+ }
+ BOOST_CONSTEXPR operator bool()const { return val; }
+ };
+
+ template <bool val>
+ bool const integral_constant<bool, val>::value;
-typedef integral_constant<bool,true> true_type;
-typedef integral_constant<bool,false> false_type;
+ typedef integral_constant<bool, true> true_type;
+ typedef integral_constant<bool, false> false_type;
}
diff --git a/boost/type_traits/integral_promotion.hpp b/boost/type_traits/integral_promotion.hpp
index 9c5514b115..0478f56349 100644
--- a/boost/type_traits/integral_promotion.hpp
+++ b/boost/type_traits/integral_promotion.hpp
@@ -7,18 +7,12 @@
#define FILE_boost_type_traits_integral_promotion_hpp_INCLUDED
#include <boost/config.hpp>
-
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_enum.hpp>
#include <boost/type_traits/is_volatile.hpp>
#include <boost/type_traits/remove_cv.hpp>
-// Should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
namespace type_traits { namespace detail {
@@ -168,27 +162,20 @@ struct integral_promotion_impl
>::type type;
};
-template<class T>
-struct integral_promotion
- : public boost::mpl::eval_if<
- need_promotion<BOOST_DEDUCED_TYPENAME remove_cv<T>::type>
- , integral_promotion_impl<T>
- , boost::mpl::identity<T>
- >
-{
-};
+template<class T, bool b> struct integral_promotion { typedef T type; };
+template<class T> struct integral_promotion<T, true> : public integral_promotion_impl<T>{};
} }
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(
- integral_promotion
- , T
- , BOOST_DEDUCED_TYPENAME
- boost::type_traits::detail::integral_promotion<T>::type
- )
-}
+template <class T> struct integral_promotion
+{
+private:
+ typedef boost::type_traits::detail::need_promotion<typename remove_cv<T>::type> tag_type;
+public:
+ typedef typename boost::type_traits::detail::integral_promotion<T, tag_type::value>::type type;
+};
-#include <boost/type_traits/detail/type_trait_undef.hpp>
+}
#endif // #ifndef FILE_boost_type_traits_integral_promotion_hpp_INCLUDED
diff --git a/boost/type_traits/intrinsics.hpp b/boost/type_traits/intrinsics.hpp
index e8a87b04e4..e2246be4d3 100644
--- a/boost/type_traits/intrinsics.hpp
+++ b/boost/type_traits/intrinsics.hpp
@@ -8,8 +8,12 @@
#ifndef BOOST_TT_INTRINSICS_HPP_INCLUDED
#define BOOST_TT_INTRINSICS_HPP_INCLUDED
+#ifndef BOOST_TT_DISABLE_INTRINSICS
+
+#include <boost/config.hpp>
+
#ifndef BOOST_TT_CONFIG_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#endif
//
@@ -44,6 +48,9 @@
// BOOST_IS_ENUM(T) true is T is an enum
// BOOST_IS_POLYMORPHIC(T) true if T is a polymorphic type
// BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T.
+//
+// define BOOST_TT_DISABLE_INTRINSICS to prevent any intrinsics being used (mostly used when testing)
+//
#ifdef BOOST_HAS_SGI_TYPE_TRAITS
// Hook into SGI's __type_traits class, this will pick up user supplied
@@ -85,18 +92,25 @@
#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\
|| (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))
-# include <boost/type_traits/is_same.hpp>
-# include <boost/type_traits/is_function.hpp>
-
+//
+// Note that even though these intrinsics rely on other type traits classes
+// we do not #include those here as it produces cyclic dependencies and
+// can cause the intrinsics to not even be used at all!
+//
# define BOOST_IS_UNION(T) __is_union(T)
# define BOOST_IS_POD(T) (__is_pod(T) && __has_trivial_constructor(T))
# define BOOST_IS_EMPTY(T) __is_empty(T)
# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
-# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T)|| ( ::boost::is_pod<T>::value && !::boost::is_volatile<T>::value))
# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) || ( ::boost::is_pod<T>::value && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value))
# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) || ::boost::is_pod<T>::value)
# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) || ::boost::has_trivial_constructor<T>::value)
-# define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) || ::boost::has_trivial_copy<T>::value)
+#if !defined(BOOST_INTEL)
+# define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) || ::boost::has_trivial_copy<T>::value) && !is_array<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) || ::boost::is_pod<T>::value)
+#elif (_MSC_VER >= 1900)
+# define BOOST_HAS_NOTHROW_COPY(T) ((__is_nothrow_constructible(T, typename add_lvalue_reference<typename add_const<T>::type>::type)) && !is_array<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) (__is_trivially_constructible(T, typename add_lvalue_reference<typename add_const<T>::type>::type))
+#endif
# define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) || ::boost::has_trivial_assign<T>::value)
# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
@@ -105,15 +119,18 @@
# define BOOST_IS_CLASS(T) __is_class(T)
# define BOOST_IS_CONVERTIBLE(T,U) ((__is_convertible_to(T,U) || (is_same<T,U>::value && !is_function<U>::value)) && !__is_abstract(U))
# define BOOST_IS_ENUM(T) __is_enum(T)
-// This one doesn't quite always do the right thing:
-// # define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
// This one fails if the default alignment has been changed with /Zp:
// # define BOOST_ALIGNMENT_OF(T) __alignof(T)
# if defined(_MSC_VER) && (_MSC_VER >= 1700)
-# define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) ((__has_trivial_move_constructor(T) || __is_pod(T)) && !::boost::is_volatile<T>::value && !::boost::is_reference<T>::value)
-# define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) ((__has_trivial_move_assign(T) || __is_pod(T)) && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value && !::boost::is_reference<T>::value)
+# define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) ((__has_trivial_move_constructor(T) || boost::is_pod<T>::value) && ! ::boost::is_volatile<T>::value && ! ::boost::is_reference<T>::value)
+# define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) ((__has_trivial_move_assign(T) || boost::is_pod<T>::value) && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value && ! ::boost::is_reference<T>::value)
# endif
+#ifndef BOOST_NO_CXX11_FINAL
+// This one doesn't quite always do the right thing on older VC++ versions
+// we really need it when the final keyword is supporyted though:
+# define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
+#endif
#if _MSC_FULL_VER >= 180020827
# define BOOST_IS_NOTHROW_MOVE_ASSIGN(T) (__is_nothrow_assignable(T&, T&&))
# define BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T) (__is_nothrow_constructible(T, T&&))
@@ -144,10 +161,12 @@
// This is a rubbish fix as it basically stops type traits from working correctly,
// but maybe the best we can do for now. See https://svn.boost.org/trac/boost/ticket/10694
//
+//
+// Note that even though these intrinsics rely on other type traits classes
+// we do not #include those here as it produces cyclic dependencies and
+// can cause the intrinsics to not even be used at all!
+//
# include <cstddef>
-# include <boost/type_traits/is_same.hpp>
-# include <boost/type_traits/is_reference.hpp>
-# include <boost/type_traits/is_volatile.hpp>
# if __has_feature(is_union)
# define BOOST_IS_UNION(T) __is_union(T)
@@ -162,22 +181,22 @@
# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
# endif
# if __has_feature(has_trivial_copy)
-# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value && !is_volatile<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value)
# endif
# if __has_feature(has_trivial_assign)
-# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
+# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value && is_assignable<T&, const T&>::value)
# endif
# if __has_feature(has_trivial_destructor)
-# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
+# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) && is_destructible<T>::value)
# endif
# if __has_feature(has_nothrow_constructor)
-# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
+# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) && is_default_constructible<T>::value)
# endif
# if __has_feature(has_nothrow_copy)
-# define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value)
+# define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value && is_copy_constructible<T>::value)
# endif
# if __has_feature(has_nothrow_assign)
-# define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)
+# define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value && is_assignable<T&, const T&>::value)
# endif
# if __has_feature(has_virtual_destructor)
# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
@@ -201,12 +220,17 @@
# define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
# endif
# if __has_feature(has_trivial_move_constructor)
-# define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) __has_trivial_move_constructor(T)
+# define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) (__has_trivial_move_constructor(T) && is_constructible<T, T&&>::value && !::boost::is_volatile<T>::value)
# endif
# if __has_feature(has_trivial_move_assign)
-# define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) __has_trivial_move_assign(T)
+# define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) (__has_trivial_move_assign(T) && is_assignable<T&, T&&>::value && !::boost::is_volatile<T>::value)
+# endif
+# if (!defined(unix) && !defined(__unix__)) || defined(__LP64__) || !defined(__GNUC__)
+// GCC sometimes lies about alignment requirements
+// of type double on 32-bit unix platforms, use the
+// old implementation instead in that case:
+# define BOOST_ALIGNMENT_OF(T) __alignof(T)
# endif
-# define BOOST_ALIGNMENT_OF(T) __alignof(T)
# if __has_feature(is_final)
# define BOOST_IS_FINAL(T) __is_final(T)
# endif
@@ -215,9 +239,11 @@
#endif
#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)
-# include <boost/type_traits/is_same.hpp>
-# include <boost/type_traits/is_reference.hpp>
-# include <boost/type_traits/is_volatile.hpp>
+//
+// Note that even though these intrinsics rely on other type traits classes
+// we do not #include those here as it produces cyclic dependencies and
+// can cause the intrinsics to not even be used at all!
+//
#ifdef BOOST_INTEL
# define BOOST_INTEL_TT_OPTS || is_pod<T>::value
@@ -229,12 +255,20 @@
# define BOOST_IS_POD(T) __is_pod(T)
# define BOOST_IS_EMPTY(T) __is_empty(T)
# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ((__has_trivial_constructor(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value)
-# define BOOST_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_INTEL_TT_OPTS) && !is_reference<T>::value && ! ::boost::is_volatile<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_INTEL_TT_OPTS) && !is_reference<T>::value)
+#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409
+# define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value && is_assignable<T&, const T&>::value)
+# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_INTEL_TT_OPTS && is_destructible<T>::value)
+# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) && is_default_constructible<T>::value BOOST_INTEL_TT_OPTS)
+# define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value && is_copy_constructible<T>::value)
+# define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value && is_assignable<T&, const T&>::value)
+#else
# define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value)
# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_INTEL_TT_OPTS)
# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) BOOST_INTEL_TT_OPTS)
-# define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value)
-# define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value)
+# define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value && !is_array<T>::value)
+# define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value && !is_array<T>::value)
+#endif
# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)
# define BOOST_IS_ABSTRACT(T) __is_abstract(T)
@@ -252,24 +286,26 @@
# define BOOST_IS_FINAL(T) __is_final(T)
# endif
+# if (__GNUC__ >= 5) && (__cplusplus >= 201103)
+# define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) (__is_trivially_assignable(T&, T&&) && is_assignable<T&, T&&>::value && !::boost::is_volatile<T>::value)
+# define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) (__is_trivially_constructible(T, T&&) && is_constructible<T, T&&>::value && !::boost::is_volatile<T>::value)
+# endif
+
# define BOOST_HAS_TYPE_TRAITS_INTRINSICS
#endif
#if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)
-# include <boost/type_traits/is_same.hpp>
-# include <boost/type_traits/is_reference.hpp>
-# include <boost/type_traits/is_volatile.hpp>
-
# define BOOST_IS_UNION(T) __oracle_is_union(T)
-# define BOOST_IS_POD(T) __oracle_is_pod(T)
+# define BOOST_IS_POD(T) (__oracle_is_pod(T) && !is_function<T>::value)
# define BOOST_IS_EMPTY(T) __oracle_is_empty(T)
# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__oracle_has_trivial_constructor(T) && ! ::boost::is_volatile<T>::value)
-# define BOOST_HAS_TRIVIAL_COPY(T) (__oracle_has_trivial_copy(T) && !is_reference<T>::value && ! ::boost::is_volatile<T>::value)
-# define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value)
-# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __oracle_has_trivial_destructor(T)
-# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__oracle_has_nothrow_constructor(T) || __oracle_has_trivial_constructor(T) || __oracle_is_trivial(T))
-# define BOOST_HAS_NOTHROW_COPY(T) ((__oracle_has_nothrow_copy(T) || __oracle_has_trivial_copy(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_reference<T>::value)
-# define BOOST_HAS_NOTHROW_ASSIGN(T) ((__oracle_has_nothrow_assign(T) || __oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_const<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) (__oracle_has_trivial_copy(T) && !is_reference<T>::value)
+# define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value && is_assignable<T&, const T&>::value)
+# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__oracle_has_trivial_destructor(T) && is_destructible<T>::value)
+# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) ((__oracle_has_nothrow_constructor(T) || __oracle_has_trivial_constructor(T) || __oracle_is_trivial(T)) && is_default_constructible<T>::value)
+// __oracle_has_nothrow_copy appears to behave the same as __oracle_has_nothrow_assign, disabled for now:
+//# define BOOST_HAS_NOTHROW_COPY(T) ((__oracle_has_nothrow_copy(T) || __oracle_has_trivial_copy(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_reference<T>::value && is_copy_constructible<T>::value)
+# define BOOST_HAS_NOTHROW_ASSIGN(T) ((__oracle_has_nothrow_assign(T) || __oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_const<T>::value && is_assignable<T&, const T&>::value)
# define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __oracle_has_virtual_destructor(T)
# define BOOST_IS_ABSTRACT(T) __oracle_is_abstract(T)
@@ -292,7 +328,7 @@
# define BOOST_IS_POD(T) __is_pod(T)
# define BOOST_IS_EMPTY(T) __is_empty(T)
# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)
-# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value && !is_volatile<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value)
# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)
# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)
@@ -319,7 +355,7 @@
# define BOOST_IS_POD(T) __is_pod(T)
# define BOOST_IS_EMPTY(T) __is_empty(T)
# define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T))
-# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T) && !is_volatile<T>::value && !is_reference<T>::value)
+# define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T) && !is_reference<T>::value)
# define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)
# define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T))
# define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T))
@@ -338,11 +374,7 @@
# define BOOST_HAS_TYPE_TRAITS_INTRINSICS
#endif
-#endif // BOOST_TT_INTRINSICS_HPP_INCLUDED
-
-
-
-
-
+#endif // BOOST_TT_DISABLE_INTRINSICS
+#endif // BOOST_TT_INTRINSICS_HPP_INCLUDED
diff --git a/boost/type_traits/is_abstract.hpp b/boost/type_traits/is_abstract.hpp
index f1cd92c67c..7715c5ca37 100644
--- a/boost/type_traits/is_abstract.hpp
+++ b/boost/type_traits/is_abstract.hpp
@@ -49,20 +49,18 @@
//
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifndef BOOST_IS_ABSTRACT
#include <boost/static_assert.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/is_class.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
#ifdef BOOST_NO_IS_ABSTRACT
#include <boost/type_traits/is_polymorphic.hpp>
#endif
#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
+
namespace detail{
#ifdef BOOST_IS_ABSTRACT
@@ -141,13 +139,11 @@ struct is_abstract_imp
}
#ifndef BOOST_NO_IS_ABSTRACT
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_abstract,T,::boost::detail::is_abstract_imp<T>::value)
+template <class T> struct is_abstract : public integral_constant<bool, ::boost::detail::is_abstract_imp<T>::value> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_abstract,T,::boost::detail::is_polymorphic_imp<T>::value)
+template <class T> struct is_abstract : public integral_constant<bool, ::boost::detail::is_polymorphic_imp<T>::value> {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif //BOOST_TT_IS_ABSTRACT_CLASS_HPP
diff --git a/boost/type_traits/is_arithmetic.hpp b/boost/type_traits/is_arithmetic.hpp
index a1d8c46d5f..c23811ebea 100644
--- a/boost/type_traits/is_arithmetic.hpp
+++ b/boost/type_traits/is_arithmetic.hpp
@@ -9,43 +9,14 @@
#ifndef BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED
#define BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED
-#if !defined( __CODEGEARC__ )
#include <boost/type_traits/is_integral.hpp>
-#include <boost/type_traits/is_float.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/config.hpp>
-#endif
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
namespace boost {
-#if !defined(__CODEGEARC__)
-namespace detail {
-
-template< typename T >
-struct is_arithmetic_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_integral<T>::value,
- ::boost::is_float<T>::value
- >::value));
-};
-
-} // namespace detail
-#endif
-
-//* is a type T an arithmetic type described in the standard (3.9.1p8)
-#if defined(__CODEGEARC__)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_arithmetic,T,__is_arithmetic(T))
-#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_arithmetic,T,::boost::detail::is_arithmetic_impl<T>::value)
-#endif
+template <class T>
+struct is_arithmetic : public integral_constant<bool, is_integral<T>::value || is_floating_point<T>::value> {};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED
diff --git a/boost/type_traits/is_array.hpp b/boost/type_traits/is_array.hpp
index c381ca4e70..497dc49327 100644
--- a/boost/type_traits/is_array.hpp
+++ b/boost/type_traits/is_array.hpp
@@ -14,30 +14,25 @@
#ifndef BOOST_TT_IS_ARRAY_HPP_INCLUDED
#define BOOST_TT_IS_ARRAY_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
-
-
+#include <boost/type_traits/integral_constant.hpp>
#include <cstddef>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,__is_array(T))
+ template <class T> struct is_array : public integral_constant<bool, __is_array(T)> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_array,T,false)
+ template <class T> struct is_array : public false_type {};
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T[N],true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const[N],true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T volatile[N],true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,is_array,T const volatile[N],true)
+ template <class T, std::size_t N> struct is_array<T[N]> : public true_type {};
+ template <class T, std::size_t N> struct is_array<T const[N]> : public true_type{};
+ template <class T, std::size_t N> struct is_array<T volatile[N]> : public true_type{};
+ template <class T, std::size_t N> struct is_array<T const volatile[N]> : public true_type{};
#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T[],true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const[],true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T volatile[],true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const volatile[],true)
+ template <class T> struct is_array<T[]> : public true_type{};
+ template <class T> struct is_array<T const[]> : public true_type{};
+ template <class T> struct is_array<T const volatile[]> : public true_type{};
+ template <class T> struct is_array<T volatile[]> : public true_type{};
#endif
#endif
@@ -45,6 +40,4 @@ BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_array,T const volatile[],t
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_ARRAY_HPP_INCLUDED
diff --git a/boost/type_traits/is_assignable.hpp b/boost/type_traits/is_assignable.hpp
new file mode 100644
index 0000000000..9cf681dd31
--- /dev/null
+++ b/boost/type_traits/is_assignable.hpp
@@ -0,0 +1,76 @@
+
+// (C) Copyright John Maddock 2015.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+//
+// See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_ASSIGNABLE_HPP_INCLUDED
+#define BOOST_TT_IS_ASSIGNABLE_HPP_INCLUDED
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost{
+
+ template <class T, class U = T> struct is_assignable;
+
+}
+
+#if !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800)
+
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/declval.hpp>
+
+namespace boost{
+
+ namespace detail{
+
+ struct is_assignable_imp
+ {
+ template<typename T, typename U, typename = decltype(boost::declval<T>() = boost::declval<U>())>
+ static boost::type_traits::yes_type test(int);
+
+ template<typename, typename>
+ static boost::type_traits::no_type test(...);
+ };
+
+ }
+
+ template <class T, class U> struct is_assignable : public integral_constant<bool, sizeof(detail::is_assignable_imp::test<T, U>(0)) == sizeof(boost::type_traits::yes_type)>{};
+ template <class T, std::size_t N, class U> struct is_assignable<T[N], U> : public is_assignable<T, U>{};
+ template <class T, std::size_t N, class U> struct is_assignable<T(&)[N], U> : public is_assignable<T&, U>{};
+ template <class T, class U> struct is_assignable<T[], U> : public is_assignable<T, U>{};
+ template <class T, class U> struct is_assignable<T(&)[], U> : public is_assignable<T&, U>{};
+ template <class U> struct is_assignable<void, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void const, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void volatile, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void const volatile, U> : public integral_constant<bool, false>{};
+
+#else
+
+#include <boost/type_traits/has_trivial_assign.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost{
+
+ // We don't know how to implement this:
+ template <class T, class U> struct is_assignable : public integral_constant<bool, false>{};
+ template <class T, class U> struct is_assignable<T&, U> : public integral_constant<bool, is_pod<T>::value && is_pod<typename remove_reference<U>::type>::value>{};
+ template <class T, class U> struct is_assignable<const T&, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void const, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void volatile, U> : public integral_constant<bool, false>{};
+ template <class U> struct is_assignable<void const volatile, U> : public integral_constant<bool, false>{};
+ /*
+ template <> struct is_assignable<void, void> : public integral_constant<bool, false>{};
+ template <> struct is_assignable<void const, void const> : public integral_constant<bool, false>{};
+ template <> struct is_assignable<void volatile, void volatile> : public integral_constant<bool, false>{};
+ template <> struct is_assignable<void const volatile, void const volatile> : public integral_constant<bool, false>{};
+ */
+#endif
+
+} // namespace boost
+
+#endif // BOOST_TT_IS_ASSIGNABLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_base_and_derived.hpp b/boost/type_traits/is_base_and_derived.hpp
index 632b699445..ee3dce597c 100644
--- a/boost/type_traits/is_base_and_derived.hpp
+++ b/boost/type_traits/is_base_and_derived.hpp
@@ -10,18 +10,16 @@
#define BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifndef BOOST_IS_BASE_OF
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
#include <boost/config.hpp>
#include <boost/static_assert.hpp>
#endif
#include <boost/type_traits/remove_cv.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/is_same.hpp>
namespace boost {
@@ -230,23 +228,17 @@ struct is_base_and_derived_impl
#endif
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(
- is_base_and_derived
- , Base
- , Derived
- , (::boost::detail::is_base_and_derived_impl<Base,Derived>::value)
- )
+template <class Base, class Derived> struct is_base_and_derived
+ : public integral_constant<bool, (::boost::detail::is_base_and_derived_impl<Base, Derived>::value)> {};
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base&,Derived,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base,Derived&,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_and_derived,Base&,Derived&,false)
+template <class Base, class Derived> struct is_base_and_derived<Base&, Derived> : public false_type{};
+template <class Base, class Derived> struct is_base_and_derived<Base, Derived&> : public false_type{};
+template <class Base, class Derived> struct is_base_and_derived<Base&, Derived&> : public false_type{};
#if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename Base,is_base_and_derived,Base,Base,false)
+template <class Base> struct is_base_and_derived<Base, Base> : public true_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
diff --git a/boost/type_traits/is_base_of.hpp b/boost/type_traits/is_base_of.hpp
index 3655b0bd23..89f2f67980 100644
--- a/boost/type_traits/is_base_of.hpp
+++ b/boost/type_traits/is_base_of.hpp
@@ -12,11 +12,6 @@
#include <boost/type_traits/is_base_and_derived.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/is_class.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
@@ -26,24 +21,19 @@ namespace boost {
{
typedef typename remove_cv<B>::type ncvB;
typedef typename remove_cv<D>::type ncvD;
- BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or<
- (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value),
- (::boost::type_traits::ice_and< ::boost::is_same<ncvB,ncvD>::value, ::boost::is_class<ncvB>::value>::value)>::value));
+ BOOST_STATIC_CONSTANT(bool, value = (
+ (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value) ||
+ (::boost::is_same<ncvB,ncvD>::value && ::boost::is_class<ncvB>::value)));
};
}
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(
- is_base_of
- , Base
- , Derived
- , (::boost::detail::is_base_of_imp<Base, Derived>::value))
+ template <class Base, class Derived> struct is_base_of
+ : public integral_constant<bool, (::boost::detail::is_base_of_imp<Base, Derived>::value)> {};
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false)
+ template <class Base, class Derived> struct is_base_of<Base, Derived&> : false_type{};
+ template <class Base, class Derived> struct is_base_of<Base&, Derived&> : false_type{};
+ template <class Base, class Derived> struct is_base_of<Base&, Derived> : false_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED
diff --git a/boost/type_traits/is_base_of_tr1.hpp b/boost/type_traits/is_base_of_tr1.hpp
index 7264f159fc..210bf54e7b 100644
--- a/boost/type_traits/is_base_of_tr1.hpp
+++ b/boost/type_traits/is_base_of_tr1.hpp
@@ -12,10 +12,6 @@
#include <boost/type_traits/is_base_and_derived.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/is_class.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost { namespace tr1{
@@ -25,24 +21,17 @@ namespace boost { namespace tr1{
{
typedef typename remove_cv<B>::type ncvB;
typedef typename remove_cv<D>::type ncvD;
- BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or<
- (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value),
- (::boost::is_same<ncvB,ncvD>::value)>::value));
+ BOOST_STATIC_CONSTANT(bool, value = ((::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value) || (::boost::is_same<ncvB,ncvD>::value)));
};
}
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(
- is_base_of
- , Base
- , Derived
- , (::boost::tr1::detail::is_base_of_imp<Base, Derived>::value))
+ template <class Base, class Derived> struct is_base_of
+ : public integral_constant<bool, (::boost::tr1::detail::is_base_of_imp<Base, Derived>::value)>{};
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false)
+ template <class Base, class Derived> struct is_base_of<Base, Derived&> : public false_type{};
+ template <class Base, class Derived> struct is_base_of<Base&, Derived&> : public false_type{};
+ template <class Base, class Derived> struct is_base_of<Base&, Derived> : public false_type{};
} } // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
diff --git a/boost/type_traits/is_class.hpp b/boost/type_traits/is_class.hpp
index 0675b57822..e3a22d2b63 100644
--- a/boost/type_traits/is_class.hpp
+++ b/boost/type_traits/is_class.hpp
@@ -10,12 +10,11 @@
#ifndef BOOST_TT_IS_CLASS_HPP_INCLUDED
#define BOOST_TT_IS_CLASS_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifndef BOOST_IS_CLASS
# include <boost/type_traits/is_union.hpp>
-# include <boost/type_traits/detail/ice_and.hpp>
-# include <boost/type_traits/detail/ice_not.hpp>
#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
# include <boost/type_traits/detail/yes_no_type.hpp>
@@ -29,13 +28,6 @@
#endif // BOOST_IS_CLASS
-#ifdef __EDG_VERSION__
-# include <boost/type_traits/remove_cv.hpp>
-#endif
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
namespace detail {
@@ -63,10 +55,8 @@ struct is_class_impl
{
BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type),
- ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value
- >::value)
+ sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type)
+ && ! ::boost::is_union<T>::value
);
};
@@ -79,10 +69,8 @@ struct is_class_impl
template <class U> static ::boost::type_traits::no_type is_class_tester(...);
BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type),
- ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value
- >::value)
+ sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type)
+ && ! ::boost::is_union<T>::value
);
};
@@ -94,14 +82,13 @@ template <typename T>
struct is_class_impl
{
BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value,
- ::boost::type_traits::ice_not< ::boost::is_scalar<T>::value >::value,
- ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value,
- ::boost::type_traits::ice_not< ::boost::is_reference<T>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_void<T>::value >::value,
- ::boost::type_traits::ice_not< ::boost::is_function<T>::value >::value
- >::value));
+ ! ::boost::is_union<T>::value >::value
+ && ! ::boost::is_scalar<T>::value
+ && ! ::boost::is_array<T>::value
+ && ! ::boost::is_reference<T>::value
+ && ! ::boost::is_void<T>::value
+ && ! ::boost::is_function<T>::value
+ );
};
# endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
@@ -115,15 +102,13 @@ struct is_class_impl
} // namespace detail
+template <class T> struct is_class : public integral_constant<bool, ::boost::detail::is_class_impl<T>::value> {};
# ifdef __EDG_VERSION__
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(
- is_class,T, boost::detail::is_class_impl<typename boost::remove_cv<T>::type>::value)
-# else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_class,T,::boost::detail::is_class_impl<T>::value)
+template <class T> struct is_class<const T> : public is_class<T>{};
+template <class T> struct is_class<const volatile T> : public is_class<T>{};
+template <class T> struct is_class<volatile T> : public is_class<T>{};
# endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_CLASS_HPP_INCLUDED
diff --git a/boost/type_traits/is_complex.hpp b/boost/type_traits/is_complex.hpp
index 0813dac903..7cf04b4796 100644
--- a/boost/type_traits/is_complex.hpp
+++ b/boost/type_traits/is_complex.hpp
@@ -8,27 +8,17 @@
#ifndef BOOST_TT_IS_COMPLEX_HPP
#define BOOST_TT_IS_COMPLEX_HPP
-#include <boost/type_traits/is_convertible.hpp>
#include <complex>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-namespace detail{
-
-struct is_convertible_from_tester
-{
- template <class T>
- is_convertible_from_tester(const std::complex<T>&);
-};
-}
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_complex,T,(::boost::is_convertible<T, boost::detail::is_convertible_from_tester>::value))
+ template <class T> struct is_complex : public false_type {};
+ template <class T> struct is_complex<const T > : public is_complex<T>{};
+ template <class T> struct is_complex<volatile const T > : public is_complex<T>{};
+ template <class T> struct is_complex<volatile T > : public is_complex<T>{};
+ template <class T> struct is_complex<std::complex<T> > : public true_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif //BOOST_TT_IS_COMPLEX_HPP
diff --git a/boost/type_traits/is_compound.hpp b/boost/type_traits/is_compound.hpp
index bbaaa42cd7..7995eb8a23 100644
--- a/boost/type_traits/is_compound.hpp
+++ b/boost/type_traits/is_compound.hpp
@@ -9,38 +9,16 @@
#ifndef BOOST_TT_IS_COMPOUND_HPP_INCLUDED
#define BOOST_TT_IS_COMPOUND_HPP_INCLUDED
-#include <boost/config.hpp>
#include <boost/type_traits/is_fundamental.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
-#if !defined( __CODEGEARC__ )
-namespace detail {
-
-template <typename T>
-struct is_compound_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_not<
- ::boost::is_fundamental<T>::value
- >::value));
-};
-
-} // namespace detail
-#endif // !defined( __CODEGEARC__ )
-
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_compound,T,__is_compound(T))
+ template <class T> struct is_compound : public integral_constant<bool, __is_compound(T)> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_compound,T,::boost::detail::is_compound_impl<T>::value)
+ template <class T> struct is_compound : public integral_constant<bool, ! ::boost::is_fundamental<T>::value> {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_COMPOUND_HPP_INCLUDED
diff --git a/boost/type_traits/is_const.hpp b/boost/type_traits/is_const.hpp
index e3e62b697c..d9dd2aa326 100644
--- a/boost/type_traits/is_const.hpp
+++ b/boost/type_traits/is_const.hpp
@@ -21,70 +21,26 @@
#ifndef BOOST_TT_IS_CONST_HPP_INCLUDED
#define BOOST_TT_IS_CONST_HPP_INCLUDED
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
-# include <boost/type_traits/detail/cv_traits_impl.hpp>
-# ifdef __GNUC__
-# include <boost/type_traits/is_reference.hpp>
-# endif
-# if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
-# include <boost/type_traits/remove_bounds.hpp>
-# endif
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,__is_const(T))
+ template <class T>
+ struct is_const : public integral_constant<bool, __is_const(T)> {};
#else
-namespace detail{
-//
-// We can't filter out rvalue_references at the same level as
-// references or we get ambiguities from msvc:
-//
-template <class T>
-struct is_const_rvalue_filter
-{
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
- BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<typename boost::remove_bounds<T>::type*>::is_const);
-#else
- BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::is_const);
-#endif
-};
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-template <class T>
-struct is_const_rvalue_filter<T&&>
-{
- BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#endif
-}
-
-//* is a type T declared const - is_const<T>
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_const,T,::boost::detail::is_const_rvalue_filter<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T&,false)
-
-#if defined(BOOST_ILLEGAL_CV_REFERENCES)
-// these are illegal specialisations; cv-qualifies applied to
-// references have no effect according to [8.3.2p1],
-// C++ Builder requires them though as it treats cv-qualified
-// references as distinct types...
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& const,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_const,T& const volatile,false)
-#endif
+ template <class T>
+ struct is_const : public false_type {};
+ template <class T> struct is_const<T const> : public true_type{};
+ template <class T, size_t N> struct is_const<T const[N]> : public true_type{};
+ template <class T> struct is_const<T const[]> : public true_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_CONST_HPP_INCLUDED
diff --git a/boost/type_traits/is_constructible.hpp b/boost/type_traits/is_constructible.hpp
new file mode 100644
index 0000000000..20173172ce
--- /dev/null
+++ b/boost/type_traits/is_constructible.hpp
@@ -0,0 +1,80 @@
+
+// (C) Copyright John Maddock 2015.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+//
+// See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_CONSTRUCTIBLE_HPP_INCLUDED
+#define BOOST_TT_IS_CONSTRUCTIBLE_HPP_INCLUDED
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800) && !BOOST_WORKAROUND(BOOST_GCC_VERSION, < 40500)
+
+#include <boost/type_traits/is_destructible.hpp>
+#include <boost/type_traits/is_default_constructible.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/declval.hpp>
+
+namespace boost{
+
+ namespace detail{
+
+ struct is_constructible_imp
+ {
+ template<typename T, typename ...TheArgs, typename = decltype(T(boost::declval<TheArgs>()...))>
+ static boost::type_traits::yes_type test(int);
+ template<typename, typename...>
+ static boost::type_traits::no_type test(...);
+
+ template<typename T, typename Arg, typename = decltype(::new T(boost::declval<Arg>()))>
+ static boost::type_traits::yes_type test1(int);
+ template<typename, typename>
+ static boost::type_traits::no_type test1(...);
+
+ template <typename T>
+ static boost::type_traits::yes_type ref_test(T);
+ template <typename T>
+ static boost::type_traits::no_type ref_test(...);
+ };
+
+ }
+
+ template <class T, class ...Args> struct is_constructible : public integral_constant<bool, sizeof(detail::is_constructible_imp::test<T, Args...>(0)) == sizeof(boost::type_traits::yes_type)>{};
+ template <class T, class Arg> struct is_constructible<T, Arg> : public integral_constant<bool, is_destructible<T>::value && sizeof(detail::is_constructible_imp::test1<T, Arg>(0)) == sizeof(boost::type_traits::yes_type)>{};
+ template <class Ref, class Arg> struct is_constructible<Ref&, Arg> : public integral_constant<bool, sizeof(detail::is_constructible_imp::ref_test<Ref&>(boost::declval<Arg>())) == sizeof(boost::type_traits::yes_type)>{};
+ template <class Ref, class Arg> struct is_constructible<Ref&&, Arg> : public integral_constant<bool, sizeof(detail::is_constructible_imp::ref_test<Ref&&>(boost::declval<Arg>())) == sizeof(boost::type_traits::yes_type)>{};
+
+ template <> struct is_constructible<void> : public false_type{};
+ template <> struct is_constructible<void const> : public false_type{};
+ template <> struct is_constructible<void const volatile> : public false_type{};
+ template <> struct is_constructible<void volatile> : public false_type{};
+
+ template <class T> struct is_constructible<T> : public is_default_constructible<T>{};
+
+#else
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_default_constructible.hpp>
+
+namespace boost{
+
+ // We don't know how to implement this:
+ template <class T, class U = void> struct is_constructible : public is_convertible<U, T>{};
+ template <class T> struct is_constructible<T, void> : public is_default_constructible<T>{};
+ template <> struct is_constructible<void, void> : public false_type{};
+ template <> struct is_constructible<void const, void> : public false_type{};
+ template <> struct is_constructible<void const volatile, void> : public false_type{};
+ template <> struct is_constructible<void volatile, void> : public false_type{};
+ template <class Ref> struct is_constructible<Ref&, void> : public false_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ template <class Ref> struct is_constructible<Ref&&, void> : public false_type{};
+#endif
+#endif
+
+} // namespace boost
+
+#endif // BOOST_TT_IS_CONSTRUCTIBLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_convertible.hpp b/boost/type_traits/is_convertible.hpp
index a844cecb36..417ece20b4 100644
--- a/boost/type_traits/is_convertible.hpp
+++ b/boost/type_traits/is_convertible.hpp
@@ -13,14 +13,14 @@
#define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifndef BOOST_IS_CONVERTIBLE
#include <boost/type_traits/detail/yes_no_type.hpp>
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#include <boost/type_traits/is_array.hpp>
-#include <boost/type_traits/ice.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
#include <boost/type_traits/is_void.hpp>
-#ifndef BOOST_NO_IS_ABSTRACT
+#if !defined(BOOST_NO_IS_ABSTRACT)
#include <boost/type_traits/is_abstract.hpp>
#endif
#include <boost/type_traits/add_lvalue_reference.hpp>
@@ -31,13 +31,13 @@
#include <boost/type_traits/remove_reference.hpp>
#endif
#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
-# include <boost/utility/declval.hpp>
+# include <boost/type_traits/declval.hpp>
#endif
+#elif defined(BOOST_MSVC) || defined(BOOST_INTEL)
+#include <boost/type_traits/is_function.hpp>
+#include <boost/type_traits/is_same.hpp>
#endif // BOOST_IS_CONVERTIBLE
-// should be always the last #include directive
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
#ifndef BOOST_IS_CONVERTIBLE
@@ -54,7 +54,7 @@ namespace boost {
namespace detail {
-#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !(defined(BOOST_GCC) && (BOOST_GCC < 40700))
// This is a C++11 conforming version, place this first and use it wherever possible:
@@ -300,13 +300,26 @@ struct is_convertible_basic_impl:
// This version seems to work pretty well for a wide spectrum of compilers,
// however it does rely on undefined behaviour by passing UDT's through (...).
//
+
+//Workaround for old compilers like MSVC 7.1 to avoid
+//forming a reference to an array of unknown bound
+template <typename From>
+struct is_convertible_basic_impl_add_lvalue_reference
+ : add_lvalue_reference<From>
+{};
+
+template <typename From>
+struct is_convertible_basic_impl_add_lvalue_reference<From[]>
+{
+ typedef From type [];
+};
+
template <typename From, typename To>
struct is_convertible_basic_impl
{
static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);
static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);
- typedef typename add_lvalue_reference<From>::type lvalue_type;
- typedef typename add_rvalue_reference<From>::type rvalue_type;
+ typedef typename is_convertible_basic_impl_add_lvalue_reference<From>::type lvalue_type;
static lvalue_type _m_from;
#ifdef BOOST_MSVC
#pragma warning(push)
@@ -316,6 +329,7 @@ struct is_convertible_basic_impl
#endif
#endif
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ typedef typename add_rvalue_reference<From>::type rvalue_type;
BOOST_STATIC_CONSTANT(bool, value =
sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)
);
@@ -336,38 +350,15 @@ struct is_convertible_basic_impl
template <typename From, typename To>
struct is_convertible_impl
{
- enum { value =
- (::boost::type_traits::ice_and<
- ::boost::type_traits::ice_or<
- ::boost::detail::is_convertible_basic_impl<From,To>::value,
- ::boost::is_void<To>::value
- >::value,
- ::boost::type_traits::ice_not<
- ::boost::is_array<To>::value
- >::value,
- ::boost::type_traits::ice_not<
- ::boost::is_function<To>::value
- >::value
- >::value) };
+ enum {
+ value = ( ::boost::detail::is_convertible_basic_impl<From,To>::value && ! ::boost::is_array<To>::value && ! ::boost::is_function<To>::value)
+ };
};
#elif !defined(__BORLANDC__) || __BORLANDC__ > 0x551
template <typename From, typename To>
struct is_convertible_impl
{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::type_traits::ice_or<
- ::boost::detail::is_convertible_basic_impl<From,To>::value,
- ::boost::is_void<To>::value
- >::value,
- ::boost::type_traits::ice_not<
- ::boost::is_array<To>::value
- >::value,
- ::boost::type_traits::ice_not<
- ::boost::is_function<To>::value
- >::value
- >::value)
- );
+ BOOST_STATIC_CONSTANT(bool, value = ( ::boost::detail::is_convertible_basic_impl<From, To>::value && !::boost::is_array<To>::value && !::boost::is_function<To>::value));
};
#endif
@@ -443,52 +434,55 @@ struct is_convertible_impl_dispatch
// implementation above:
//
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-# define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \
- BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2,value) \
- BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const,value) \
- BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 volatile,value) \
- BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(trait,spec1,spec2 const volatile,value) \
- /**/
-# define TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(trait,spec1,spec2,value) \
- TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1,spec2,value) \
- TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const,spec2,value) \
- TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 volatile,spec2,value) \
- TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1(trait,spec1 const volatile,spec2,value) \
- /**/
+template <> struct is_convertible_impl_dispatch<void, void> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void, void const> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void, void const volatile> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void, void volatile> : public true_type{};
+
+template <> struct is_convertible_impl_dispatch<void const, void> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void const, void const> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void const, void const volatile> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void const, void volatile> : public true_type{};
- TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2(is_convertible,void,void,true)
+template <> struct is_convertible_impl_dispatch<void const volatile, void> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void const volatile, void const> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void const volatile, void const volatile> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void const volatile, void volatile> : public true_type{};
-# undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2
-# undef TT_AUX_BOOL_CV_VOID_TRAIT_SPEC2_PART1
+template <> struct is_convertible_impl_dispatch<void volatile, void> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void volatile, void const> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void volatile, void const volatile> : public true_type{};
+template <> struct is_convertible_impl_dispatch<void volatile, void volatile> : public true_type{};
#else
- BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC2(is_convertible,void,void,true)
+template <> struct is_convertible_impl_dispatch<void, void> : public true_type{};
#endif // BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void,To,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void,false)
+template <class To> struct is_convertible_impl_dispatch<void, To> : public false_type{};
+template <class From> struct is_convertible_impl_dispatch<From, void> : public false_type{};
+
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const,To,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void volatile,To,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename To,is_convertible,void const volatile,To,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_PARTIAL_SPEC2_1(typename From,is_convertible,From,void const volatile,false)
+template <class To> struct is_convertible_impl_dispatch<void const, To> : public false_type{};
+template <class From> struct is_convertible_impl_dispatch<From, void const> : public false_type{};
+template <class To> struct is_convertible_impl_dispatch<void const volatile, To> : public false_type{};
+template <class From> struct is_convertible_impl_dispatch<From, void const volatile> : public false_type{};
+template <class To> struct is_convertible_impl_dispatch<void volatile, To> : public false_type{};
+template <class From> struct is_convertible_impl_dispatch<From, void volatile> : public false_type{};
#endif
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,(::boost::detail::is_convertible_impl_dispatch<From,To>::value))
+template <class From, class To>
+struct is_convertible : public integral_constant<bool, ::boost::detail::is_convertible_impl_dispatch<From, To>::value> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_convertible,From,To,BOOST_IS_CONVERTIBLE(From,To))
+template <class From, class To>
+struct is_convertible : public integral_constant<bool, BOOST_IS_CONVERTIBLE(From, To)> {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_copy_assignable.hpp b/boost/type_traits/is_copy_assignable.hpp
index 48af818849..76afdda5dd 100644
--- a/boost/type_traits/is_copy_assignable.hpp
+++ b/boost/type_traits/is_copy_assignable.hpp
@@ -18,7 +18,7 @@
&& !defined(BOOST_INTEL_CXX_VERSION) && \
!(defined(BOOST_MSVC) && _MSC_VER == 1800)
#define BOOST_TT_CXX11_IS_COPY_ASSIGNABLE
-#include <boost/utility/declval.hpp>
+#include <boost/type_traits/declval.hpp>
#else
//For compilers without decltype
#include <boost/type_traits/is_const.hpp>
@@ -27,10 +27,6 @@
#include <boost/type_traits/remove_reference.hpp>
#endif
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
namespace detail{
@@ -132,16 +128,14 @@ struct is_copy_assignable_impl {
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_copy_assignable,T,::boost::detail::is_copy_assignable_impl<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void,false)
+template <class T> struct is_copy_assignable : public integral_constant<bool, ::boost::detail::is_copy_assignable_impl<T>::value>{};
+template <> struct is_copy_assignable<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_assignable,void volatile,false)
+template <> struct is_copy_assignable<void const> : public false_type{};
+template <> struct is_copy_assignable<void const volatile> : public false_type{};
+template <> struct is_copy_assignable<void volatile> : public false_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_COPY_ASSIGNABLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_copy_constructible.hpp b/boost/type_traits/is_copy_constructible.hpp
index 24f5eebc27..c68826431b 100644
--- a/boost/type_traits/is_copy_constructible.hpp
+++ b/boost/type_traits/is_copy_constructible.hpp
@@ -10,116 +10,178 @@
#define BOOST_TT_IS_COPY_CONSTRUCTIBLE_HPP_INCLUDED
#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800) && !BOOST_WORKAROUND(BOOST_GCC_VERSION, < 40900)
+
+#include <boost/type_traits/is_constructible.hpp>
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1800)
+
+namespace boost {
+
+template <class T> struct is_copy_constructible : public boost::is_constructible<T, const T&>{};
+
+template <> struct is_copy_constructible<void> : public false_type{};
+template <> struct is_copy_constructible<void const> : public false_type{};
+template <> struct is_copy_constructible<void const volatile> : public false_type{};
+template <> struct is_copy_constructible<void volatile> : public false_type{};
+
+} // namespace boost
+
+#else
+//
+// Special version for VC12 which has a problem when a base class (such as non_copyable) has a deleted
+// copy constructor. In this case the compiler thinks there really is a copy-constructor and tries to
+// instantiate the deleted member. std::is_copy_constructible has the same issue (or at least returns
+// an incorrect value, which just defers the issue into the users code) as well. We can at least fix
+// boost::non_copyable as a base class as a special case:
+//
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/noncopyable.hpp>
+
+namespace boost {
+
+ namespace detail
+ {
+
+ template <class T, bool b> struct is_copy_constructible_imp : public boost::is_constructible<T, const T&>{};
+ template <class T> struct is_copy_constructible_imp<T, true> : public false_type{};
+
+ }
+
+ template <class T> struct is_copy_constructible : public detail::is_copy_constructible_imp<T, is_base_and_derived<boost::noncopyable, T>::value>{};
+
+ template <> struct is_copy_constructible<void> : public false_type{};
+ template <> struct is_copy_constructible<void const> : public false_type{};
+ template <> struct is_copy_constructible<void const volatile> : public false_type{};
+ template <> struct is_copy_constructible<void volatile> : public false_type{};
+
+} // namespace boost
+
+#endif
+
+#else
+
#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/is_base_and_derived.hpp>
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_rvalue_reference.hpp>
-#include <boost/utility/declval.hpp>
+#include <boost/type_traits/declval.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/declval.hpp>
#include <boost/noncopyable.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4181)
+#endif
namespace boost {
-namespace detail{
+ namespace detail{
-template <bool DerivedFromNoncopyable, class T>
-struct is_copy_constructible_impl2 {
+ template <bool DerivedFromNoncopyable, class T>
+ struct is_copy_constructible_impl2 {
-// Intel compiler has problems with SFINAE for copy constructors and deleted functions:
-//
-// error: function *function_name* cannot be referenced -- it is a deleted function
-// static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
-// ^
-//
-// MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
-// https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
+ // Intel compiler has problems with SFINAE for copy constructors and deleted functions:
+ //
+ // error: function *function_name* cannot be referenced -- it is a deleted function
+ // static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+ // ^
+ //
+ // MSVC 12.0 (Visual 2013) has problems when the copy constructor has been deleted. See:
+ // https://connect.microsoft.com/VisualStudio/feedback/details/800328/std-is-copy-constructible-is-broken
#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_INTEL_CXX_VERSION) && !(defined(BOOST_MSVC) && _MSC_VER == 1800)
#ifdef BOOST_NO_CXX11_DECLTYPE
- template <class T1>
- static boost::type_traits::yes_type test(T1&, boost::mpl::int_<sizeof(T1(boost::declval<T1&>()))>* = 0);
+ template <class T1>
+ static boost::type_traits::yes_type test(const T1&, boost::mpl::int_<sizeof(T1(boost::declval<const T1&>()))>* = 0);
#else
- template <class T1>
- static boost::type_traits::yes_type test(T1&, decltype(T1(boost::declval<T1&>()))* = 0);
+ template <class T1>
+ static boost::type_traits::yes_type test(const T1&, decltype(T1(boost::declval<const T1&>()))* = 0);
#endif
- static boost::type_traits::no_type test(...);
+ static boost::type_traits::no_type test(...);
#else
- template <class T1>
- static boost::type_traits::no_type test(T1&, typename T1::boost_move_no_copy_constructor_or_assign* = 0);
- static boost::type_traits::yes_type test(...);
+ template <class T1>
+ static boost::type_traits::no_type test(const T1&, typename T1::boost_move_no_copy_constructor_or_assign* = 0);
+ static boost::type_traits::yes_type test(...);
#endif
- // If you see errors like this:
- //
- // `'T::T(const T&)' is private`
- // `boost/type_traits/is_copy_constructible.hpp:68:5: error: within this context`
- //
- // then you are trying to call that macro for a structure defined like that:
- //
- // struct T {
- // ...
- // private:
- // T(const T &);
- // ...
- // };
- //
- // To fix that you must modify your structure:
- //
- // // C++03 and C++11 version
- // struct T: private boost::noncopyable {
- // ...
- // private:
- // T(const T &);
- // ...
- // };
- //
- // // C++11 version
- // struct T {
- // ...
- // private:
- // T(const T &) = delete;
- // ...
- // };
- BOOST_STATIC_CONSTANT(bool, value = (
+ // If you see errors like this:
+ //
+ // `'T::T(const T&)' is private`
+ // `boost/type_traits/is_copy_constructible.hpp:68:5: error: within this context`
+ //
+ // then you are trying to call that macro for a structure defined like that:
+ //
+ // struct T {
+ // ...
+ // private:
+ // T(const T &);
+ // ...
+ // };
+ //
+ // To fix that you must modify your structure:
+ //
+ // // C++03 and C++11 version
+ // struct T: private boost::noncopyable {
+ // ...
+ // private:
+ // T(const T &);
+ // ...
+ // };
+ //
+ // // C++11 version
+ // struct T {
+ // ...
+ // private:
+ // T(const T &) = delete;
+ // ...
+ // };
+ BOOST_STATIC_CONSTANT(bool, value = (
sizeof(test(
- boost::declval<BOOST_DEDUCED_TYPENAME boost::add_reference<T>::type>()
+ boost::declval<BOOST_DEDUCED_TYPENAME boost::add_reference<T const>::type>()
)) == sizeof(boost::type_traits::yes_type)
- ||
- boost::is_rvalue_reference<T>::value
- ));
-};
-
-template <class T>
-struct is_copy_constructible_impl2<true, T> {
- BOOST_STATIC_CONSTANT(bool, value = false);
-};
-
-template <class T>
-struct is_copy_constructible_impl {
-
- BOOST_STATIC_CONSTANT(bool, value = (
- boost::detail::is_copy_constructible_impl2<
+ &&
+ !boost::is_rvalue_reference<T>::value
+ && !boost::is_array<T>::value
+ ));
+ };
+
+ template <class T>
+ struct is_copy_constructible_impl2<true, T> {
+ BOOST_STATIC_CONSTANT(bool, value = false);
+ };
+
+ template <class T>
+ struct is_copy_constructible_impl {
+
+ BOOST_STATIC_CONSTANT(bool, value = (
+ boost::detail::is_copy_constructible_impl2<
boost::is_base_and_derived<boost::noncopyable, T>::value,
T
- >::value
- ));
-};
+ >::value
+ ));
+ };
-} // namespace detail
+ } // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_copy_constructible,T,::boost::detail::is_copy_constructible_impl<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void,false)
+ template <class T> struct is_copy_constructible : public integral_constant<bool, ::boost::detail::is_copy_constructible_impl<T>::value>{};
+ template <> struct is_copy_constructible<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_copy_constructible,void volatile,false)
+ template <> struct is_copy_constructible<void const> : public false_type{};
+ template <> struct is_copy_constructible<void volatile> : public false_type{};
+ template <> struct is_copy_constructible<void const volatile> : public false_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
#endif // BOOST_TT_IS_COPY_CONSTRUCTIBLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_default_constructible.hpp b/boost/type_traits/is_default_constructible.hpp
new file mode 100644
index 0000000000..7fd63f8969
--- /dev/null
+++ b/boost/type_traits/is_default_constructible.hpp
@@ -0,0 +1,64 @@
+
+// (C) Copyright John Maddock 2015.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+//
+// See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_DEFAULT_CONSTRUCTIBLE_HPP_INCLUDED
+#define BOOST_TT_IS_DEFAULT_CONSTRUCTIBLE_HPP_INCLUDED
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800) && !BOOST_WORKAROUND(BOOST_GCC_VERSION, < 40500)
+
+#include <boost/type_traits/detail/yes_no_type.hpp>
+
+namespace boost{
+
+ namespace detail{
+
+ struct is_default_constructible_imp
+ {
+ template<typename _Tp, typename = decltype(_Tp())>
+ static boost::type_traits::yes_type test(int);
+
+ template<typename>
+ static boost::type_traits::no_type test(...);
+ };
+
+ }
+
+ template <class T> struct is_default_constructible : public integral_constant<bool, sizeof(detail::is_default_constructible_imp::test<T>(0)) == sizeof(boost::type_traits::yes_type)>{};
+ template <class T, std::size_t N> struct is_default_constructible<T[N]> : public is_default_constructible<T>{};
+ template <class T> struct is_default_constructible<T[]> : public is_default_constructible<T>{};
+ template <class T> struct is_default_constructible<T&> : public integral_constant<bool, false>{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+ template <class T> struct is_default_constructible<T&&> : public integral_constant<bool, false>{};
+#endif
+ template <> struct is_default_constructible<void> : public integral_constant<bool, false>{};
+ template <> struct is_default_constructible<void const> : public integral_constant<bool, false>{};
+ template <> struct is_default_constructible<void volatile> : public integral_constant<bool, false>{};
+ template <> struct is_default_constructible<void const volatile> : public integral_constant<bool, false>{};
+
+#else
+
+#include <boost/type_traits/is_pod.hpp>
+
+namespace boost{
+
+ // We don't know how to implement this, note we can not use has_trivial_constructor here
+ // because the correct implementation of that trait requires this one:
+ template <class T> struct is_default_constructible : public is_pod<T>{};
+ template <> struct is_default_constructible<void> : public integral_constant<bool, false>{};
+ template <> struct is_default_constructible<void const> : public integral_constant<bool, false>{};
+ template <> struct is_default_constructible<void volatile> : public integral_constant<bool, false>{};
+ template <> struct is_default_constructible<void const volatile> : public integral_constant<bool, false>{};
+
+#endif
+
+} // namespace boost
+
+#endif // BOOST_TT_IS_DEFAULT_CONSTRUCTIBLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_destructible.hpp b/boost/type_traits/is_destructible.hpp
new file mode 100644
index 0000000000..9f1e5d9817
--- /dev/null
+++ b/boost/type_traits/is_destructible.hpp
@@ -0,0 +1,60 @@
+
+// (C) Copyright John Maddock 2015.
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+//
+// See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_IS_DESTRUCTIBLE_HPP_INCLUDED
+#define BOOST_TT_IS_DESTRUCTIBLE_HPP_INCLUDED
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800)
+
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/declval.hpp>
+
+namespace boost{
+
+ namespace detail{
+
+ struct is_destructible_imp
+ {
+ template<typename T, typename = decltype(boost::declval<T&>().~T())>
+ static boost::type_traits::yes_type test(int);
+ template<typename>
+ static boost::type_traits::no_type test(...);
+ };
+
+ }
+
+ template <class T> struct is_destructible : public integral_constant<bool, sizeof(detail::is_destructible_imp::test<T>(0)) == sizeof(boost::type_traits::yes_type)>{};
+
+#else
+
+#include <boost/type_traits/is_pod.hpp>
+#include <boost/type_traits/is_class.hpp>
+
+namespace boost{
+
+ // We don't know how to implement this:
+ template <class T> struct is_destructible : public integral_constant<bool, is_pod<T>::value || is_class<T>::value>{};
+#endif
+
+ template <> struct is_destructible<void> : public false_type{};
+ template <> struct is_destructible<void const> : public false_type{};
+ template <> struct is_destructible<void volatile> : public false_type{};
+ template <> struct is_destructible<void const volatile> : public false_type{};
+ template <class T> struct is_destructible<T&> : public is_destructible<T>{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ template <class T> struct is_destructible<T&&> : public is_destructible<T>{};
+#endif
+ template <class T, std::size_t N> struct is_destructible<T[N]> : public is_destructible<T>{};
+ template <class T> struct is_destructible<T[]> : public is_destructible<T>{};
+
+} // namespace boost
+
+#endif // BOOST_TT_IS_DESTRUCTIBLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_empty.hpp b/boost/type_traits/is_empty.hpp
index adb239ee24..ef288c518b 100644
--- a/boost/type_traits/is_empty.hpp
+++ b/boost/type_traits/is_empty.hpp
@@ -10,16 +10,12 @@
#define BOOST_TT_IS_EMPTY_HPP_INCLUDED
#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
-# include <boost/type_traits/remove_cv.hpp>
-# include <boost/type_traits/is_class.hpp>
-# include <boost/type_traits/add_reference.hpp>
-
-// should be always the last #include directive
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/add_reference.hpp>
#ifndef BOOST_INTERNAL_IS_EMPTY
#define BOOST_INTERNAL_IS_EMPTY(T) false
@@ -75,12 +71,8 @@ struct is_empty_impl
{
typedef typename remove_cv<T>::type cvt;
BOOST_STATIC_CONSTANT(
- bool, value = (
- ::boost::type_traits::ice_or<
- ::boost::detail::empty_helper<cvt,::boost::is_class<T>::value>::value
- , BOOST_INTERNAL_IS_EMPTY(cvt)
- >::value
- ));
+ bool,
+ value = ( ::boost::detail::empty_helper<cvt,::boost::is_class<T>::value>::value || BOOST_INTERNAL_IS_EMPTY(cvt)));
};
#else // __BORLANDC__
@@ -107,35 +99,21 @@ struct is_empty_impl
BOOST_STATIC_CONSTANT(
bool, value = (
- ::boost::type_traits::ice_or<
::boost::detail::empty_helper<
cvt
, ::boost::is_class<T>::value
, ::boost::is_convertible< r_type,int>::value
- >::value
- , BOOST_INTERNAL_IS_EMPTY(cvt)
- >::value));
+ >::value || BOOST_INTERNAL_IS_EMPTY(cvt));
};
#endif // __BORLANDC__
-
-// these help when the compiler has no partial specialization support:
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void,false)
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_empty,void const volatile,false)
-#endif
-
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_empty,T,::boost::detail::is_empty_impl<T>::value)
+template <class T> struct is_empty : integral_constant<bool, ::boost::detail::is_empty_impl<T>::value> {};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#undef BOOST_INTERNAL_IS_EMPTY
#endif // BOOST_TT_IS_EMPTY_HPP_INCLUDED
diff --git a/boost/type_traits/is_enum.hpp b/boost/type_traits/is_enum.hpp
index 7929c962a5..eada480a65 100644
--- a/boost/type_traits/is_enum.hpp
+++ b/boost/type_traits/is_enum.hpp
@@ -12,6 +12,7 @@
#define BOOST_TT_IS_ENUM_HPP_INCLUDED
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifndef BOOST_IS_ENUM
#include <boost/type_traits/add_reference.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
@@ -21,16 +22,13 @@
#ifdef __GNUC__
#include <boost/type_traits/is_function.hpp>
#endif
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION)
# include <boost/type_traits/is_class.hpp>
# include <boost/type_traits/is_union.hpp>
#endif
#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
#ifndef BOOST_IS_ENUM
@@ -43,11 +41,7 @@ namespace detail {
template <typename T>
struct is_class_or_union
{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_class<T>::value
- , ::boost::is_union<T>::value
- >::value));
+ BOOST_STATIC_CONSTANT(bool, value = ::boost::is_class<T>::value || ::boost::is_union<T>::value);
};
#else
@@ -94,8 +88,8 @@ template <>
struct is_enum_helper<false>
{
template <typename T> struct type
- : public ::boost::is_convertible<typename boost::add_reference<T>::type,::boost::detail::int_convertible>
{
+ static const bool value = ::boost::is_convertible<typename boost::add_reference<T>::type, ::boost::detail::int_convertible>::value;
};
};
@@ -112,34 +106,28 @@ template <typename T> struct is_enum_impl
// order to correctly deduce that noncopyable types are not enums
// (dwa 2002/04/15)...
BOOST_STATIC_CONSTANT(bool, selector =
- (::boost::type_traits::ice_or<
::boost::is_arithmetic<T>::value
- , ::boost::is_reference<T>::value
- , ::boost::is_function<T>::value
- , is_class_or_union<T>::value
- , is_array<T>::value
- >::value));
+ || ::boost::is_reference<T>::value
+ || ::boost::is_function<T>::value
+ || is_class_or_union<T>::value
+ || is_array<T>::value);
#else
// ...however, not checking is_class_or_union on non-conforming
// compilers prevents a dependency recursion.
BOOST_STATIC_CONSTANT(bool, selector =
- (::boost::type_traits::ice_or<
::boost::is_arithmetic<T>::value
- , ::boost::is_reference<T>::value
- , ::boost::is_function<T>::value
- , is_array<T>::value
- >::value));
+ || ::boost::is_reference<T>::value
+ || ::boost::is_function<T>::value
+ || is_array<T>::value);
#endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION
#else // !defined(__GNUC__):
BOOST_STATIC_CONSTANT(bool, selector =
- (::boost::type_traits::ice_or<
::boost::is_arithmetic<T>::value
- , ::boost::is_reference<T>::value
- , is_class_or_union<T>::value
- , is_array<T>::value
- >::value));
+ || ::boost::is_reference<T>::value
+ || is_class_or_union<T>::value
+ || is_array<T>::value);
#endif
@@ -155,34 +143,24 @@ template <typename T> struct is_enum_impl
BOOST_STATIC_CONSTANT(bool, value = helper::value);
};
-// these help on compilers with no partial specialization support:
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void,false)
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_enum,void const volatile,false)
-#endif
-
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,::boost::detail::is_enum_impl<T>::value)
+template <class T> struct is_enum : public integral_constant<bool, ::boost::detail::is_enum_impl<T>::value> {};
#else // __BORLANDC__
//
// buggy is_convertible prevents working
// implementation of is_enum:
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,false)
+template <class T> struct is_enum : public integral_constant<bool, false> {};
#endif
#else // BOOST_IS_ENUM
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_enum,T,BOOST_IS_ENUM(T))
+template <class T> struct is_enum : public integral_constant<bool, BOOST_IS_ENUM(T)> {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_ENUM_HPP_INCLUDED
diff --git a/boost/type_traits/is_final.hpp b/boost/type_traits/is_final.hpp
index 36bd62e54a..410d18663b 100644
--- a/boost/type_traits/is_final.hpp
+++ b/boost/type_traits/is_final.hpp
@@ -11,31 +11,20 @@
#ifndef BOOST_TT_IS_FINAL_HPP_INCLUDED
#define BOOST_TT_IS_FINAL_HPP_INCLUDED
-#include <boost/type_traits/remove_cv.hpp>
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#ifdef BOOST_IS_FINAL
+#include <boost/type_traits/remove_cv.hpp>
+#endif
namespace boost {
-namespace detail {
-template <typename T> struct is_final_impl
-{
#ifdef BOOST_IS_FINAL
- typedef typename remove_cv<T>::type cvt;
- BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_FINAL(cvt));
+template <class T> struct is_final : public integral_constant<bool, BOOST_IS_FINAL(typename remove_cv<T>::type)> {};
#else
- BOOST_STATIC_CONSTANT(bool, value = false);
+template <class T> struct is_final : public integral_constant<bool, false> {};
#endif
-};
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_final,T,::boost::detail::is_final_impl<T>::value)
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_FINAL_HPP_INCLUDED
diff --git a/boost/type_traits/is_float.hpp b/boost/type_traits/is_float.hpp
index 25d16f1800..7bf7d1f820 100644
--- a/boost/type_traits/is_float.hpp
+++ b/boost/type_traits/is_float.hpp
@@ -1,4 +1,3 @@
-
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,18 +9,12 @@
#define BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
namespace boost {
//* is a type T a floating-point type described in the standard (3.9.1p8)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_float,T,false)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,float,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,double,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_float,long double,true)
-
+ template <class T> struct is_float : public is_floating_point<T> {};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
diff --git a/boost/type_traits/is_floating_point.hpp b/boost/type_traits/is_floating_point.hpp
index 2224453054..196c900cf9 100755..100644
--- a/boost/type_traits/is_floating_point.hpp
+++ b/boost/type_traits/is_floating_point.hpp
@@ -1,4 +1,3 @@
-
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000-2005.
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -9,19 +8,23 @@
#ifndef BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED
#define BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
//* is a type T a floating-point type described in the standard (3.9.1p8)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_floating_point,T,false)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,float,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,double,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_floating_point,long double,true)
+ template <class T> struct is_floating_point : public false_type{};
+ template <class T> struct is_floating_point<const T> : public is_floating_point<T>{};
+ template <class T> struct is_floating_point<volatile const T> : public is_floating_point<T>{};
+ template <class T> struct is_floating_point<volatile T> : public is_floating_point<T>{};
+ template<> struct is_floating_point<float> : public true_type{};
+ template<> struct is_floating_point<double> : public true_type{};
+ template<> struct is_floating_point<long double> : public true_type{};
+
+#if defined(BOOST_HAS_FLOAT128)
+ template<> struct is_floating_point<__float128> : public true_type{};
+#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED
diff --git a/boost/type_traits/is_function.hpp b/boost/type_traits/is_function.hpp
index eeb4382010..f77c1f0469 100644
--- a/boost/type_traits/is_function.hpp
+++ b/boost/type_traits/is_function.hpp
@@ -12,8 +12,7 @@
#define BOOST_TT_IS_FUNCTION_HPP_INCLUDED
#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/detail/false_result.hpp>
-#include <boost/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#if !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
# include <boost/type_traits/detail/is_function_ptr_helper.hpp>
@@ -22,9 +21,6 @@
# include <boost/type_traits/detail/yes_no_type.hpp>
#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
// is a type a function?
// Please note that this implementation is unnecessarily complex:
// we could just use !is_convertible<T*, const volatile void*>::value,
@@ -40,17 +36,16 @@ namespace detail {
#if !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
template<bool is_ref = true>
struct is_function_chooser
- : public ::boost::type_traits::false_result
{
+ template< typename T > struct result_
+ : public false_type {};
};
template <>
struct is_function_chooser<false>
{
template< typename T > struct result_
- : public ::boost::type_traits::is_function_ptr_helper<T*>
- {
- };
+ : public ::boost::type_traits::is_function_ptr_helper<T*> {};
};
template <typename T>
@@ -95,15 +90,13 @@ struct is_function_impl<T&&> : public false_type
#endif // !defined( __CODEGEARC__ )
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,__is_function(T))
+template <class T> struct is_function : integral_constant<bool, __is_function(T)> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_function,T,::boost::detail::is_function_impl<T>::value)
+template <class T> struct is_function : integral_constant<bool, ::boost::detail::is_function_impl<T>::value> {};
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_function,T&&,false)
+template <class T> struct is_function<T&&> : public false_type {};
#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED
diff --git a/boost/type_traits/is_fundamental.hpp b/boost/type_traits/is_fundamental.hpp
index 138e296887..f58767a489 100644
--- a/boost/type_traits/is_fundamental.hpp
+++ b/boost/type_traits/is_fundamental.hpp
@@ -11,35 +11,16 @@
#include <boost/type_traits/is_arithmetic.hpp>
#include <boost/type_traits/is_void.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
-namespace detail {
-
-template <typename T>
-struct is_fundamental_impl
- : public ::boost::type_traits::ice_or<
- ::boost::is_arithmetic<T>::value
- , ::boost::is_void<T>::value
- >
-{
-};
-
-} // namespace detail
-
//* is a type T a fundamental type described in the standard (3.9.1)
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_fundamental,T,__is_fundamental(T))
+template <class T> struct is_fundamental : public integral_constant<bool, __is_fundamental(T)> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_fundamental,T,::boost::detail::is_fundamental_impl<T>::value)
+template <class T> struct is_fundamental : public integral_constant<bool, ::boost::is_arithmetic<T>::value || ::boost::is_void<T>::value> {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_FUNDAMENTAL_HPP_INCLUDED
diff --git a/boost/type_traits/is_integral.hpp b/boost/type_traits/is_integral.hpp
index 6bfad49d39..7a7e54bb70 100644
--- a/boost/type_traits/is_integral.hpp
+++ b/boost/type_traits/is_integral.hpp
@@ -10,79 +10,80 @@
#define BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
#include <boost/config.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-//* is a type T an [cv-qualified-] integral type described in the standard (3.9.1p3)
-// as an extension we include long long, as this is likely to be added to the
-// standard at a later date
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_integral,T,__is_integral(T))
+ template <class T>
+ struct is_integral : public integral_constant<bool, __is_integral(T)> {};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_integral,T,false)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned char,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned short,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned int,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned long,true)
+template <class T> struct is_integral : public false_type {};
+template <class T> struct is_integral<const T> : public is_integral<T> {};
+template <class T> struct is_integral<volatile const T> : public is_integral<T>{};
+template <class T> struct is_integral<volatile T> : public is_integral<T>{};
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed char,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed short,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed int,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,signed long,true)
+//* is a type T an [cv-qualified-] integral type described in the standard (3.9.1p3)
+// as an extension we include long long, as this is likely to be added to the
+// standard at a later date
+template<> struct is_integral<unsigned char> : public true_type {};
+template<> struct is_integral<unsigned short> : public true_type{};
+template<> struct is_integral<unsigned int> : public true_type{};
+template<> struct is_integral<unsigned long> : public true_type{};
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,bool,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char,true)
+template<> struct is_integral<signed char> : public true_type{};
+template<> struct is_integral<short> : public true_type{};
+template<> struct is_integral<int> : public true_type{};
+template<> struct is_integral<long> : public true_type{};
+
+template<> struct is_integral<char> : public true_type{};
+template<> struct is_integral<bool> : public true_type{};
#ifndef BOOST_NO_INTRINSIC_WCHAR_T
// If the following line fails to compile and you're using the Intel
// compiler, see http://lists.boost.org/MailArchives/boost-users/msg06567.php,
// and define BOOST_NO_INTRINSIC_WCHAR_T on the command line.
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,wchar_t,true)
+template<> struct is_integral<wchar_t> : public true_type{};
#endif
// Same set of integral types as in boost/type_traits/integral_promotion.hpp.
// Please, keep in sync. -- Alexander Nasonov
#if (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \
|| (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300))
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int8,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int8,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int16,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int16,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int32,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int32,true)
+template<> struct is_integral<unsigned __int8> : public true_type{};
+template<> struct is_integral<unsigned __int16> : public true_type{};
+template<> struct is_integral<unsigned __int32> : public true_type{};
+template<> struct is_integral<__int8> : public true_type{};
+template<> struct is_integral<__int16> : public true_type{};
+template<> struct is_integral<__int32> : public true_type{};
#ifdef __BORLANDC__
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true)
+template<> struct is_integral<unsigned __int64> : public true_type{};
+template<> struct is_integral<__int64> : public true_type{};
#endif
#endif
# if defined(BOOST_HAS_LONG_LONG)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::ulong_long_type,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral, ::boost::long_long_type,true)
+template<> struct is_integral< ::boost::ulong_long_type> : public true_type{};
+template<> struct is_integral< ::boost::long_long_type> : public true_type{};
#elif defined(BOOST_HAS_MS_INT64)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,unsigned __int64,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,__int64,true)
+template<> struct is_integral<unsigned __int64> : public true_type{};
+template<> struct is_integral<__int64> : public true_type{};
#endif
#ifdef BOOST_HAS_INT128
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,boost::int128_type,true)
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,boost::uint128_type,true)
+template<> struct is_integral<boost::int128_type> : public true_type{};
+template<> struct is_integral<boost::uint128_type> : public true_type{};
#endif
#ifndef BOOST_NO_CXX11_CHAR16_T
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char16_t,true)
+template<> struct is_integral<char16_t> : public true_type{};
#endif
#ifndef BOOST_NO_CXX11_CHAR32_T
-BOOST_TT_AUX_BOOL_TRAIT_CV_SPEC1(is_integral,char32_t,true)
+template<> struct is_integral<char32_t> : public true_type{};
#endif
#endif // non-CodeGear implementation
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
diff --git a/boost/type_traits/is_lvalue_reference.hpp b/boost/type_traits/is_lvalue_reference.hpp
index 0b0130ab2d..e94d787481 100644
--- a/boost/type_traits/is_lvalue_reference.hpp
+++ b/boost/type_traits/is_lvalue_reference.hpp
@@ -21,36 +21,30 @@
#ifndef BOOST_TT_IS_LVALUE_REFERENCE_HPP_INCLUDED
#define BOOST_TT_IS_LVALUE_REFERENCE_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
-
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_lvalue_reference,T,__is_reference(T))
+ template <class T> struct is_lvalue_reference : public integral_constant<bool, __is_reference(T)>{};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_lvalue_reference,T,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T&,true)
+ template <class T> struct is_lvalue_reference : public false_type{};
+ template <class T> struct is_lvalue_reference<T&> : public true_type{};
#if defined(BOOST_ILLEGAL_CV_REFERENCES)
// these are illegal specialisations; cv-qualifies applied to
// references have no effect according to [8.3.2p1],
// C++ Builder requires them though as it treats cv-qualified
// references as distinct types...
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T& const,true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T& volatile,true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_lvalue_reference,T& const volatile,true)
+ template <class T> struct is_lvalue_reference<T&const> : public true_type{};
+ template <class T> struct is_lvalue_reference<T&volatile> : public true_type{};
+ template <class T> struct is_lvalue_reference<T&const volatile> : public true_type{};
#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/is_member_function_pointer.hpp b/boost/type_traits/is_member_function_pointer.hpp
index d1c3690ba7..223197f333 100644
--- a/boost/type_traits/is_member_function_pointer.hpp
+++ b/boost/type_traits/is_member_function_pointer.hpp
@@ -11,7 +11,7 @@
#ifndef BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
#define BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#include <boost/detail/workaround.hpp>
#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
@@ -22,29 +22,22 @@
//
# include <boost/type_traits/detail/is_mem_fun_pointer_impl.hpp>
# include <boost/type_traits/remove_cv.hpp>
+# include <boost/type_traits/integral_constant.hpp>
#else
# include <boost/type_traits/is_reference.hpp>
# include <boost/type_traits/is_array.hpp>
# include <boost/type_traits/detail/yes_no_type.hpp>
-# include <boost/type_traits/detail/false_result.hpp>
-# include <boost/type_traits/detail/ice_or.hpp>
# include <boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>
#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_function_pointer,T,__is_member_function_pointer( T ))
+template <class T> struct is_member_function_pointer : public integral_constant<bool, __is_member_function_pointer( T )> {};
#elif !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(
- is_member_function_pointer
- , T
- , ::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value
- )
+template <class T> struct is_member_function_pointer
+ : public ::boost::integral_constant<bool, ::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value>{};
#else
@@ -54,8 +47,8 @@ namespace detail {
template <bool>
struct is_mem_fun_pointer_select
- : public ::boost::type_traits::false_result
{
+ template <class T> struct result_ : public false_type{};
};
template <>
@@ -82,14 +75,8 @@ struct is_mem_fun_pointer_select<false>
template <typename T>
struct is_member_function_pointer_impl
- : public is_mem_fun_pointer_select<
- ::boost::type_traits::ice_or<
- ::boost::is_reference<T>::value
- , ::boost::is_array<T>::value
- >::value
- >::template result_<T>
-{
-};
+ : public is_mem_fun_pointer_select<
+ ::boost::is_reference<T>::value || ::boost::is_array<T>::value>::template result_<T>{};
template <typename T>
struct is_member_function_pointer_impl<T&> : public false_type{};
@@ -113,21 +100,21 @@ struct is_member_function_pointer_impl<T&>
#endif
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void,false)
+template<> struct is_member_function_pointer_impl<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_member_function_pointer,void const volatile,false)
+template<> struct is_member_function_pointer_impl<void const> : public false_type{};
+template<> struct is_member_function_pointer_impl<void const volatile> : public false_type{};
+template<> struct is_member_function_pointer_impl<void volatile> : public false_type{};
#endif
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_function_pointer,T,::boost::detail::is_member_function_pointer_impl<T>::value)
+template <class T>
+struct is_member_function_pointer
+ : public integral_constant<bool, ::boost::detail::is_member_function_pointer_impl<T>::value>{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/is_member_object_pointer.hpp b/boost/type_traits/is_member_object_pointer.hpp
index 66b76c90b3..cb7cf14abf 100755..100644
--- a/boost/type_traits/is_member_object_pointer.hpp
+++ b/boost/type_traits/is_member_object_pointer.hpp
@@ -10,37 +10,15 @@
#ifndef BOOST_TT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED
#define BOOST_TT_IS_MEMBER_OBJECT_POINTER_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/is_member_pointer.hpp>
#include <boost/type_traits/is_member_function_pointer.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
-namespace detail{
-
-template <typename T>
-struct is_member_object_pointer_impl
-{
- BOOST_STATIC_CONSTANT(
- bool, value = (::boost::type_traits::ice_and<
- ::boost::is_member_pointer<T>::value,
- ::boost::type_traits::ice_not<
- ::boost::is_member_function_pointer<T>::value
- >::value
- >::value ));
-};
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_object_pointer,T,::boost::detail::is_member_object_pointer_impl<T>::value)
+template <class T> struct is_member_object_pointer
+ : public integral_constant<bool,
+ ::boost::is_member_pointer<T>::value && !::boost::is_member_function_pointer<T>::value>{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/is_member_pointer.hpp b/boost/type_traits/is_member_pointer.hpp
index cba31af0c2..9757afc950 100644
--- a/boost/type_traits/is_member_pointer.hpp
+++ b/boost/type_traits/is_member_pointer.hpp
@@ -21,45 +21,25 @@
#ifndef BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
#define BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/detail/workaround.hpp>
-
-#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
-# include <boost/type_traits/is_member_function_pointer.hpp>
-#else
-# include <boost/type_traits/is_reference.hpp>
-# include <boost/type_traits/is_array.hpp>
-# include <boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>
-# include <boost/type_traits/detail/yes_no_type.hpp>
-# include <boost/type_traits/detail/false_result.hpp>
-# include <boost/type_traits/detail/ice_or.hpp>
-#endif
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/is_member_function_pointer.hpp>
namespace boost {
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,__is_member_pointer(T))
-#elif BOOST_WORKAROUND(__BORLANDC__, < 0x600)
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
-
+template <class T> struct is_member_pointer : public integral_constant<bool, __is_member_pointer(T)>{};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::is_member_function_pointer<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
+template <class T> struct is_member_pointer : public integral_constant<bool, ::boost::is_member_function_pointer<T>::value>{};
+template <class T, class U> struct is_member_pointer<U T::* > : public true_type{};
#if !BOOST_WORKAROUND(__MWERKS__,<=0x3003) && !BOOST_WORKAROUND(__IBMCPP__, <=600)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const,true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*volatile,true)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const volatile,true)
+template <class T, class U> struct is_member_pointer<U T::*const> : public true_type{};
+template <class T, class U> struct is_member_pointer<U T::*const volatile> : public true_type{};
+template <class T, class U> struct is_member_pointer<U T::*volatile> : public true_type{};
#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/is_nothrow_move_assignable.hpp b/boost/type_traits/is_nothrow_move_assignable.hpp
index 3268307cdf..9755430ecf 100644
--- a/boost/type_traits/is_nothrow_move_assignable.hpp
+++ b/boost/type_traits/is_nothrow_move_assignable.hpp
@@ -16,37 +16,27 @@
#include <boost/type_traits/has_nothrow_assign.hpp>
#include <boost/type_traits/is_array.hpp>
#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
#include <boost/utility/enable_if.hpp>
-#include <boost/utility/declval.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/declval.hpp>
namespace boost {
-namespace detail{
-
#ifdef BOOST_IS_NOTHROW_MOVE_ASSIGN
template <class T>
-struct is_nothrow_move_assignable_imp{ BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_NOTHROW_MOVE_ASSIGN(T)); };
-template <class T>
-struct is_nothrow_move_assignable_imp<T const>{ BOOST_STATIC_CONSTANT(bool, value = false); };
-template <class T>
-struct is_nothrow_move_assignable_imp<T volatile>{ BOOST_STATIC_CONSTANT(bool, value = false); };
-template <class T>
-struct is_nothrow_move_assignable_imp<T const volatile>{ BOOST_STATIC_CONSTANT(bool, value = false); };
-template <class T>
-struct is_nothrow_move_assignable_imp<T&>{ BOOST_STATIC_CONSTANT(bool, value = false); };
-template <class T>
-struct is_nothrow_move_assignable_imp<T&&>{ BOOST_STATIC_CONSTANT(bool, value = false); };
-
+struct is_nothrow_move_assignable : public integral_constant<bool, BOOST_IS_NOTHROW_MOVE_ASSIGN(T)>{};
+template <class T> struct is_nothrow_move_assignable<T const> : public false_type{};
+template <class T> struct is_nothrow_move_assignable<T volatile> : public false_type{};
+template <class T> struct is_nothrow_move_assignable<T const volatile> : public false_type{};
+template <class T> struct is_nothrow_move_assignable<T&> : public false_type{};
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template <class T> struct is_nothrow_move_assignable<T&&> : public false_type{};
+#endif
#elif !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR)
+namespace detail{
+
template <class T, class Enable = void>
struct false_or_cpp11_noexcept_move_assignable: public ::boost::false_type {};
@@ -57,52 +47,35 @@ struct false_or_cpp11_noexcept_move_assignable <
> : public ::boost::integral_constant<bool, BOOST_NOEXCEPT_EXPR(::boost::declval<T&>() = ::boost::declval<T>())>
{};
-template <class T>
-struct is_nothrow_move_assignable_imp{
- BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::false_or_cpp11_noexcept_move_assignable<T>::value);
-};
+}
template <class T>
-struct is_nothrow_move_assignable_imp<T const> : public ::boost::false_type {};
-template <class T>
-struct is_nothrow_move_assignable_imp<T volatile> : public ::boost::false_type{};
-template <class T>
-struct is_nothrow_move_assignable_imp<T const volatile> : public ::boost::false_type{};
-template <class T>
-struct is_nothrow_move_assignable_imp<T&> : public ::boost::false_type{};
+struct is_nothrow_move_assignable : public integral_constant<bool, ::boost::detail::false_or_cpp11_noexcept_move_assignable<T>::value>{};
+
+template <class T> struct is_nothrow_move_assignable<T const> : public ::boost::false_type {};
+template <class T> struct is_nothrow_move_assignable<T const volatile> : public ::boost::false_type{};
+template <class T> struct is_nothrow_move_assignable<T volatile> : public ::boost::false_type{};
+template <class T> struct is_nothrow_move_assignable<T&> : public ::boost::false_type{};
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-template <class T>
-struct is_nothrow_move_assignable_imp<T&&> : public ::boost::false_type{};
+template <class T> struct is_nothrow_move_assignable<T&&> : public ::boost::false_type{};
#endif
#else
template <class T>
-struct is_nothrow_move_assignable_imp{
- BOOST_STATIC_CONSTANT(bool, value = (
- ::boost::type_traits::ice_and<
- ::boost::type_traits::ice_or<
- ::boost::has_trivial_move_assign<T>::value,
- ::boost::has_nothrow_assign<T>::value
- >::value,
- ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value
- >::value));
-};
+struct is_nothrow_move_assignable : public integral_constant<bool,
+ (::boost::has_trivial_move_assign<T>::value || ::boost::has_nothrow_assign<T>::value) && ! ::boost::is_array<T>::value>{};
#endif
-}
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_nothrow_move_assignable,T,::boost::detail::is_nothrow_move_assignable_imp<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void,false)
+template <> struct is_nothrow_move_assignable<void> : public false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_assignable,void volatile,false)
+template <> struct is_nothrow_move_assignable<void const> : public false_type{};
+template <> struct is_nothrow_move_assignable<void const volatile> : public false_type{};
+template <> struct is_nothrow_move_assignable<void volatile> : public false_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_NOTHROW_MOVE_ASSIGNABLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_nothrow_move_constructible.hpp b/boost/type_traits/is_nothrow_move_constructible.hpp
index c09d5d1f94..8f4cee2cf9 100644
--- a/boost/type_traits/is_nothrow_move_constructible.hpp
+++ b/boost/type_traits/is_nothrow_move_constructible.hpp
@@ -13,41 +13,25 @@
#include <boost/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
-#include <boost/type_traits/has_trivial_move_constructor.hpp>
-#include <boost/type_traits/has_nothrow_copy.hpp>
-#include <boost/type_traits/is_array.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/utility/declval.hpp>
-#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#ifdef BOOST_IS_NOTHROW_MOVE_CONSTRUCT
namespace boost {
-namespace detail{
+template <class T>
+struct is_nothrow_move_constructible : public integral_constant<bool, BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T)>{};
-#ifdef BOOST_IS_NOTHROW_MOVE_CONSTRUCT
+template <class T> struct is_nothrow_move_constructible<volatile T> : public ::boost::false_type {};
+template <class T> struct is_nothrow_move_constructible<const volatile T> : public ::boost::false_type{};
-template <class T>
-struct is_nothrow_move_constructible_imp{
- BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T));
-};
+#elif !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR) && !BOOST_WORKAROUND(BOOST_GCC_VERSION, < 40700)
-template <class T>
-struct is_nothrow_move_constructible_imp<volatile T> : public ::boost::false_type {};
-template <class T>
-struct is_nothrow_move_constructible_imp<const volatile T> : public ::boost::false_type{};
-template <class T>
-struct is_nothrow_move_constructible_imp<T&> : public ::boost::false_type{};
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-template <class T>
-struct is_nothrow_move_constructible_imp<T&&> : public ::boost::false_type{};
-#endif
+#include <boost/type_traits/declval.hpp>
+#include <boost/utility/enable_if.hpp>
-#elif !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_SFINAE_EXPR)
+namespace boost{ namespace detail{
template <class T, class Enable = void>
struct false_or_cpp11_noexcept_move_constructible: public ::boost::false_type {};
@@ -59,51 +43,44 @@ struct false_or_cpp11_noexcept_move_constructible <
> : public ::boost::integral_constant<bool, BOOST_NOEXCEPT_EXPR(T(::boost::declval<T>()))>
{};
-template <class T>
-struct is_nothrow_move_constructible_imp{
- BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::false_or_cpp11_noexcept_move_constructible<T>::value);
-};
+}
-template <class T>
-struct is_nothrow_move_constructible_imp<volatile T> : public ::boost::false_type {};
-template <class T>
-struct is_nothrow_move_constructible_imp<const volatile T> : public ::boost::false_type{};
-template <class T>
-struct is_nothrow_move_constructible_imp<T&> : public ::boost::false_type{};
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-template <class T>
-struct is_nothrow_move_constructible_imp<T&&> : public ::boost::false_type{};
-#endif
+template <class T> struct is_nothrow_move_constructible
+ : public integral_constant<bool, ::boost::detail::false_or_cpp11_noexcept_move_constructible<T>::value>{};
+
+template <class T> struct is_nothrow_move_constructible<volatile T> : public ::boost::false_type {};
+template <class T> struct is_nothrow_move_constructible<const volatile T> : public ::boost::false_type{};
+template <class T, std::size_t N> struct is_nothrow_move_constructible<T[N]> : public ::boost::false_type{};
+template <class T> struct is_nothrow_move_constructible<T[]> : public ::boost::false_type{};
#else
-template <class T>
-struct is_nothrow_move_constructible_imp{
- BOOST_STATIC_CONSTANT(bool, value =(
- ::boost::type_traits::ice_and<
- ::boost::type_traits::ice_or<
- ::boost::has_trivial_move_constructor<T>::value,
- ::boost::has_nothrow_copy<T>::value
- >::value,
- ::boost::type_traits::ice_not< ::boost::is_array<T>::value >::value
- >::value));
-};
+#include <boost/type_traits/has_trivial_move_constructor.hpp>
+#include <boost/type_traits/has_nothrow_copy.hpp>
+#include <boost/type_traits/is_array.hpp>
-#endif
+namespace boost{
-}
+template <class T>
+struct is_nothrow_move_constructible
+ : public integral_constant<bool,
+ (::boost::has_trivial_move_constructor<T>::value || ::boost::has_nothrow_copy<T>::value) && !::boost::is_array<T>::value>
+{};
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_nothrow_move_constructible,T,::boost::detail::is_nothrow_move_constructible_imp<T>::value)
+#endif
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void,false)
+template <> struct is_nothrow_move_constructible<void> : false_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void const,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void const volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_nothrow_move_constructible,void volatile,false)
+template <> struct is_nothrow_move_constructible<void const> : false_type{};
+template <> struct is_nothrow_move_constructible<void volatile> : false_type{};
+template <> struct is_nothrow_move_constructible<void const volatile> : false_type{};
+#endif
+// References are always trivially constructible, even if the thing they reference is not:
+template <class T> struct is_nothrow_move_constructible<T&> : public ::boost::true_type{};
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+template <class T> struct is_nothrow_move_constructible<T&&> : public ::boost::true_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_NOTHROW_MOVE_CONSTRUCTIBLE_HPP_INCLUDED
diff --git a/boost/type_traits/is_object.hpp b/boost/type_traits/is_object.hpp
index 1d1ae4f02e..fc9d2f25d3 100644
--- a/boost/type_traits/is_object.hpp
+++ b/boost/type_traits/is_object.hpp
@@ -9,37 +9,20 @@
#ifndef BOOST_TT_IS_OBJECT_HPP_INCLUDED
#define BOOST_TT_IS_OBJECT_HPP_INCLUDED
+#include <boost/config.hpp>
#include <boost/type_traits/is_reference.hpp>
#include <boost/type_traits/is_void.hpp>
#include <boost/type_traits/is_function.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
-#include <boost/config.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
-namespace detail {
-
-template <typename T>
-struct is_object_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::type_traits::ice_not< ::boost::is_reference<T>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_void<T>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_function<T>::value>::value
- >::value));
-};
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_object,T,::boost::detail::is_object_impl<T>::value)
+template <class T> struct is_object
+ : public
+ integral_constant<
+ bool,
+ ! ::boost::is_reference<T>::value && ! ::boost::is_void<T>::value && ! ::boost::is_function<T>::value >
+{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_OBJECT_HPP_INCLUDED
diff --git a/boost/type_traits/is_pod.hpp b/boost/type_traits/is_pod.hpp
index 820a3ceeb9..9204c93e25 100644
--- a/boost/type_traits/is_pod.hpp
+++ b/boost/type_traits/is_pod.hpp
@@ -9,16 +9,16 @@
#ifndef BOOST_TT_IS_POD_HPP_INCLUDED
#define BOOST_TT_IS_POD_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/config.hpp>
#include <boost/type_traits/is_void.hpp>
#include <boost/type_traits/is_scalar.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
#include <boost/type_traits/intrinsics.hpp>
-#include <cstddef>
+#ifdef __SUNPRO_CC
+#include <boost/type_traits/is_function.hpp>
+#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <cstddef>
#ifndef BOOST_IS_POD
#define BOOST_INTERNAL_IS_POD(T) false
@@ -31,49 +31,28 @@ namespace boost {
// forward declaration, needed by 'is_pod_array_helper' template below
template< typename T > struct is_POD;
-namespace detail {
-
-
-template <typename T> struct is_pod_impl
-{
- BOOST_STATIC_CONSTANT(
- bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_scalar<T>::value,
- ::boost::is_void<T>::value,
- BOOST_INTERNAL_IS_POD(T)
- >::value));
-};
+template <typename T> struct is_pod
+: public integral_constant<bool, ::boost::is_scalar<T>::value || ::boost::is_void<T>::value || BOOST_INTERNAL_IS_POD(T)>
+{};
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-template <typename T, std::size_t sz>
-struct is_pod_impl<T[sz]>
- : public is_pod_impl<T>
-{
-};
+template <typename T, std::size_t sz> struct is_pod<T[sz]> : public is_pod<T>{};
#endif
// the following help compilers without partial specialization support:
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void,true)
+template<> struct is_pod<void> : public true_type{};
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void const,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void volatile,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,void const volatile,true)
+template<> struct is_pod<void const> : public true_type{};
+template<> struct is_pod<void const volatile> : public true_type{};
+template<> struct is_pod<void volatile> : public true_type{};
#endif
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pod,T,::boost::detail::is_pod_impl<T>::value)
-// is_POD is the old depricated name for this trait, do not use this as it may
-// be removed in future without warning!!
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_POD,T,::boost::is_pod<T>::value)
+template<class T> struct is_POD : public is_pod<T>{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#undef BOOST_INTERNAL_IS_POD
#endif // BOOST_TT_IS_POD_HPP_INCLUDED
diff --git a/boost/type_traits/is_pointer.hpp b/boost/type_traits/is_pointer.hpp
index aad30f2541..44b06c227e 100644
--- a/boost/type_traits/is_pointer.hpp
+++ b/boost/type_traits/is_pointer.hpp
@@ -21,68 +21,27 @@
#ifndef BOOST_TT_IS_POINTER_HPP_INCLUDED
#define BOOST_TT_IS_POINTER_HPP_INCLUDED
-#include <boost/type_traits/is_member_pointer.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
-#include <boost/type_traits/config.hpp>
-#include <boost/type_traits/remove_cv.hpp>
-
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,__is_pointer(T))
+template <class T> struct is_pointer : public integral_constant<bool, __is_pointer(T)>{};
#else
-
-namespace detail {
-
-template< typename T > struct is_pointer_helper
-{
- BOOST_STATIC_CONSTANT(bool, value = false);
-};
-
-# define TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC(helper,sp,result) \
-template< typename T > struct helper<sp> \
-{ \
- BOOST_STATIC_CONSTANT(bool, value = result); \
-}; \
-/**/
-
-TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC(is_pointer_helper,T*,true)
-
-# undef TT_AUX_BOOL_TRAIT_HELPER_PARTIAL_SPEC
-
-template< typename T >
-struct is_pointer_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::detail::is_pointer_helper<typename remove_cv<T>::type>::value
- , ::boost::type_traits::ice_not<
- ::boost::is_member_pointer<T>::value
- >::value
- >::value)
- );
-};
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_pointer,T,::boost::detail::is_pointer_impl<T>::value)
-
-#if defined(__BORLANDC__) && !defined(__COMO__) && (__BORLANDC__ < 0x600)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T&,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& const,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_pointer,T& const volatile,false)
+template <class T> struct is_pointer : public false_type{};
+template <class T> struct is_pointer<T*> : public true_type{};
+template <class T> struct is_pointer<T*const> : public true_type{};
+template <class T> struct is_pointer<T*const volatile> : public true_type{};
+template <class T> struct is_pointer<T*volatile> : public true_type{};
+
+#ifdef BOOST_MSVC
+template <class T> struct is_pointer<T const> : public is_pointer<T>{};
+template <class T> struct is_pointer<T const volatile> : public is_pointer<T>{};
+template <class T> struct is_pointer<T volatile> : public is_pointer<T>{};
#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/is_polymorphic.hpp b/boost/type_traits/is_polymorphic.hpp
index aac985105d..722d8b46b2 100644
--- a/boost/type_traits/is_polymorphic.hpp
+++ b/boost/type_traits/is_polymorphic.hpp
@@ -9,12 +9,10 @@
#define BOOST_TT_IS_POLYMORPHIC_HPP
#include <boost/type_traits/intrinsics.hpp>
+#include <boost/type_traits/integral_constant.hpp>
#ifndef BOOST_IS_POLYMORPHIC
#include <boost/type_traits/is_class.hpp>
-#include <boost/type_traits/remove_cv.hpp>
#endif
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
#include <boost/detail/workaround.hpp>
#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)
@@ -34,8 +32,7 @@ struct is_polymorphic_imp1
# if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) // CWPro7 should return false always.
typedef char d1, (&d2)[2];
# else
- typedef typename remove_cv<T>::type ncvT;
- struct d1 : public ncvT
+ struct d1 : public T
{
d1();
# if !defined(__GNUC__) // this raises warnings with some classes, and buys nothing with GCC
@@ -47,7 +44,7 @@ struct is_polymorphic_imp1
d1(const d1&);
d1& operator=(const d1&);
};
- struct d2 : public ncvT
+ struct d2 : public T
{
d2();
virtual ~d2()throw();
@@ -67,6 +64,10 @@ struct is_polymorphic_imp1
BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1)));
};
+template <class T> struct is_polymorphic_imp1<T const> : public is_polymorphic_imp1<T>{};
+template <class T> struct is_polymorphic_imp1<T const volatile> : public is_polymorphic_imp1<T>{};
+template <class T> struct is_polymorphic_imp1<T volatile> : public is_polymorphic_imp1<T>{};
+
template <class T>
struct is_polymorphic_imp2
{
@@ -104,18 +105,16 @@ struct is_polymorphic_imp
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,::boost::detail::is_polymorphic_imp<T>::value)
+template <class T> struct is_polymorphic : public integral_constant<bool, ::boost::detail::is_polymorphic_imp<T>::value> {};
#else // BOOST_IS_POLYMORPHIC
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_polymorphic,T,BOOST_IS_POLYMORPHIC(T))
+template <class T> struct is_polymorphic : public integral_constant<bool, BOOST_IS_POLYMORPHIC(T)> {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)
#pragma warning(pop)
#endif
diff --git a/boost/type_traits/is_reference.hpp b/boost/type_traits/is_reference.hpp
index 49b5f9ff0f..85f0a63204 100644
--- a/boost/type_traits/is_reference.hpp
+++ b/boost/type_traits/is_reference.hpp
@@ -12,34 +12,19 @@
#ifndef BOOST_TT_IS_REFERENCE_HPP_INCLUDED
#define BOOST_TT_IS_REFERENCE_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/is_lvalue_reference.hpp>
#include <boost/type_traits/is_rvalue_reference.hpp>
-#include <boost/type_traits/ice.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
-namespace detail {
-
-template <typename T>
-struct is_reference_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_lvalue_reference<T>::value, ::boost::is_rvalue_reference<T>::value
- >::value));
-};
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_reference,T,::boost::detail::is_reference_impl<T>::value)
+template <class T> struct is_reference
+ : public
+ integral_constant<
+ bool,
+ ::boost::is_lvalue_reference<T>::value || ::boost::is_rvalue_reference<T>::value>
+{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/is_rvalue_reference.hpp b/boost/type_traits/is_rvalue_reference.hpp
index 93cd0bf187..50e88edee0 100644
--- a/boost/type_traits/is_rvalue_reference.hpp
+++ b/boost/type_traits/is_rvalue_reference.hpp
@@ -9,21 +9,17 @@
#ifndef BOOST_TT_IS_RVALUE_REFERENCE_HPP_INCLUDED
#define BOOST_TT_IS_RVALUE_REFERENCE_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/config.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_rvalue_reference,T,false)
+template <class T> struct is_rvalue_reference : public false_type {};
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_rvalue_reference,T&&,true)
+template <class T> struct is_rvalue_reference<T&&> : public true_type {};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/is_same.hpp b/boost/type_traits/is_same.hpp
index c8987b07a8..d16f4b2b1a 100644
--- a/boost/type_traits/is_same.hpp
+++ b/boost/type_traits/is_same.hpp
@@ -21,25 +21,21 @@
#ifndef BOOST_TT_IS_SAME_HPP_INCLUDED
#define BOOST_TT_IS_SAME_HPP_INCLUDED
-#include <boost/type_traits/config.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(is_same,T,U,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename T,is_same,T,T,true)
+ template <class T, class U> struct is_same : public false_type {};
+ template <class T> struct is_same<T,T> : public true_type {};
#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
// without this, Borland's compiler gives the wrong answer for
// references to arrays:
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_1(typename T,is_same,T&,T&,true)
+ template <class T> struct is_same<T&, T&> : public true_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_SAME_HPP_INCLUDED
diff --git a/boost/type_traits/is_scalar.hpp b/boost/type_traits/is_scalar.hpp
index 4af3def14c..3031440596 100644
--- a/boost/type_traits/is_scalar.hpp
+++ b/boost/type_traits/is_scalar.hpp
@@ -13,43 +13,15 @@
#include <boost/type_traits/is_enum.hpp>
#include <boost/type_traits/is_pointer.hpp>
#include <boost/type_traits/is_member_pointer.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
#include <boost/config.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
template <typename T>
-struct is_scalar_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_or<
- ::boost::is_arithmetic<T>::value,
- ::boost::is_enum<T>::value,
- ::boost::is_pointer<T>::value,
- ::boost::is_member_pointer<T>::value
- >::value));
-};
-
-// these specializations are only really needed for compilers
-// without partial specialization support:
-template <> struct is_scalar_impl<void>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-template <> struct is_scalar_impl<void const>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
-template <> struct is_scalar_impl<void volatile>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
-template <> struct is_scalar_impl<void const volatile>{ BOOST_STATIC_CONSTANT(bool, value = false ); };
-#endif
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_scalar,T,::boost::detail::is_scalar_impl<T>::value)
+struct is_scalar
+ : public integral_constant<bool, ::boost::is_arithmetic<T>::value || ::boost::is_enum<T>::value || ::boost::is_pointer<T>::value || ::boost::is_member_pointer<T>::value>
+{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_SCALAR_HPP_INCLUDED
diff --git a/boost/type_traits/is_signed.hpp b/boost/type_traits/is_signed.hpp
index 5673284944..70ca2e4796 100644
--- a/boost/type_traits/is_signed.hpp
+++ b/boost/type_traits/is_signed.hpp
@@ -13,18 +13,17 @@
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/type_traits/is_enum.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <climits>
namespace boost {
#if !defined( __CODEGEARC__ )
-namespace detail{
+#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1310) && \
+ !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) &&\
+ !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
-#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) && !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+namespace detail{
template <class T>
struct is_signed_values
@@ -67,70 +66,98 @@ struct is_signed_select_helper<false>
};
template <class T>
-struct is_signed_imp
+struct is_signed_impl
{
- typedef is_signed_select_helper<
- ::boost::type_traits::ice_or<
- ::boost::is_integral<T>::value,
- ::boost::is_enum<T>::value>::value
- > selector;
+ typedef ::boost::detail::is_signed_select_helper< ::boost::is_integral<T>::value || ::boost::is_enum<T>::value> selector;
typedef typename selector::template rebind<T> binder;
typedef typename binder::type type;
BOOST_STATIC_CONSTANT(bool, value = type::value);
};
+}
+
+template <class T> struct is_signed : public integral_constant<bool, boost::detail::is_signed_impl<T>::value> {};
+
#else
-template <class T> struct is_signed_imp : public false_type{};
-template <> struct is_signed_imp<signed char> : public true_type{};
-template <> struct is_signed_imp<const signed char> : public true_type{};
-template <> struct is_signed_imp<volatile signed char> : public true_type{};
-template <> struct is_signed_imp<const volatile signed char> : public true_type{};
-template <> struct is_signed_imp<short> : public true_type{};
-template <> struct is_signed_imp<const short> : public true_type{};
-template <> struct is_signed_imp<volatile short> : public true_type{};
-template <> struct is_signed_imp<const volatile short> : public true_type{};
-template <> struct is_signed_imp<int> : public true_type{};
-template <> struct is_signed_imp<const int> : public true_type{};
-template <> struct is_signed_imp<volatile int> : public true_type{};
-template <> struct is_signed_imp<const volatile int> : public true_type{};
-template <> struct is_signed_imp<long> : public true_type{};
-template <> struct is_signed_imp<const long> : public true_type{};
-template <> struct is_signed_imp<volatile long> : public true_type{};
-template <> struct is_signed_imp<const volatile long> : public true_type{};
-#ifdef BOOST_HAS_LONG_LONG
-template <> struct is_signed_imp<long long> : public true_type{};
-template <> struct is_signed_imp<const long long> : public true_type{};
-template <> struct is_signed_imp<volatile long long> : public true_type{};
-template <> struct is_signed_imp<const volatile long long> : public true_type{};
-#endif
-#if defined(CHAR_MIN) && (CHAR_MIN != 0)
-template <> struct is_signed_imp<char> : public true_type{};
-template <> struct is_signed_imp<const char> : public true_type{};
-template <> struct is_signed_imp<volatile char> : public true_type{};
-template <> struct is_signed_imp<const volatile char> : public true_type{};
-#endif
-#if defined(WCHAR_MIN) && (WCHAR_MIN != 0)
-template <> struct is_signed_imp<wchar_t> : public true_type{};
-template <> struct is_signed_imp<const wchar_t> : public true_type{};
-template <> struct is_signed_imp<volatile wchar_t> : public true_type{};
-template <> struct is_signed_imp<const volatile wchar_t> : public true_type{};
-#endif
+template <class T> struct is_signed : public false_type{};
#endif
-}
-
-#endif // !defined( __CODEGEARC__ )
+#else //defined( __CODEGEARC__ )
+ template <class T> struct is_signed : public integral_constant<bool, __is_signed(T)>{};
+#endif
-#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_signed,T,__is_signed(T))
+template <> struct is_signed<signed char> : public true_type{};
+template <> struct is_signed<const signed char> : public true_type{};
+template <> struct is_signed<volatile signed char> : public true_type{};
+template <> struct is_signed<const volatile signed char> : public true_type{};
+template <> struct is_signed<short> : public true_type{};
+template <> struct is_signed<const short> : public true_type{};
+template <> struct is_signed<volatile short> : public true_type{};
+template <> struct is_signed<const volatile short> : public true_type{};
+template <> struct is_signed<int> : public true_type{};
+template <> struct is_signed<const int> : public true_type{};
+template <> struct is_signed<volatile int> : public true_type{};
+template <> struct is_signed<const volatile int> : public true_type{};
+template <> struct is_signed<long> : public true_type{};
+template <> struct is_signed<const long> : public true_type{};
+template <> struct is_signed<volatile long> : public true_type{};
+template <> struct is_signed<const volatile long> : public true_type{};
+
+template <> struct is_signed<unsigned char> : public false_type{};
+template <> struct is_signed<const unsigned char> : public false_type{};
+template <> struct is_signed<volatile unsigned char> : public false_type{};
+template <> struct is_signed<const volatile unsigned char> : public false_type{};
+template <> struct is_signed<unsigned short> : public false_type{};
+template <> struct is_signed<const unsigned short> : public false_type{};
+template <> struct is_signed<volatile unsigned short> : public false_type{};
+template <> struct is_signed<const volatile unsigned short> : public false_type{};
+template <> struct is_signed<unsigned int> : public false_type{};
+template <> struct is_signed<const unsigned int> : public false_type{};
+template <> struct is_signed<volatile unsigned int> : public false_type{};
+template <> struct is_signed<const volatile unsigned int> : public false_type{};
+template <> struct is_signed<unsigned long> : public false_type{};
+template <> struct is_signed<const unsigned long> : public false_type{};
+template <> struct is_signed<volatile unsigned long> : public false_type{};
+template <> struct is_signed<const volatile unsigned long> : public false_type{};
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct is_signed< ::boost::long_long_type> : public true_type{};
+template <> struct is_signed<const ::boost::long_long_type> : public true_type{};
+template <> struct is_signed<volatile ::boost::long_long_type> : public true_type{};
+template <> struct is_signed<const volatile ::boost::long_long_type> : public true_type{};
+
+template <> struct is_signed< ::boost::ulong_long_type> : public false_type{};
+template <> struct is_signed<const ::boost::ulong_long_type> : public false_type{};
+template <> struct is_signed<volatile ::boost::ulong_long_type> : public false_type{};
+template <> struct is_signed<const volatile ::boost::ulong_long_type> : public false_type{};
+#endif
+#if defined(CHAR_MIN)
+#if CHAR_MIN != 0
+template <> struct is_signed<char> : public true_type{};
+template <> struct is_signed<const char> : public true_type{};
+template <> struct is_signed<volatile char> : public true_type{};
+template <> struct is_signed<const volatile char> : public true_type{};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_signed,T,::boost::detail::is_signed_imp<T>::value)
+template <> struct is_signed<char> : public false_type{};
+template <> struct is_signed<const char> : public false_type{};
+template <> struct is_signed<volatile char> : public false_type{};
+template <> struct is_signed<const volatile char> : public false_type{};
+#endif
+#endif
+#if defined(WCHAR_MIN) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#if WCHAR_MIN != 0
+template <> struct is_signed<wchar_t> : public true_type{};
+template <> struct is_signed<const wchar_t> : public true_type{};
+template <> struct is_signed<volatile wchar_t> : public true_type{};
+template <> struct is_signed<const volatile wchar_t> : public true_type{};
+#else
+template <> struct is_signed<wchar_t> : public false_type{};
+template <> struct is_signed<const wchar_t> : public false_type{};
+template <> struct is_signed<volatile wchar_t> : public false_type{};
+template <> struct is_signed<const volatile wchar_t> : public false_type{};
+#endif
#endif
-
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/is_stateless.hpp b/boost/type_traits/is_stateless.hpp
index d8d40635fe..f9266da5b8 100644
--- a/boost/type_traits/is_stateless.hpp
+++ b/boost/type_traits/is_stateless.hpp
@@ -14,35 +14,20 @@
#include <boost/type_traits/has_trivial_destructor.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_empty.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
#include <boost/config.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
template <typename T>
-struct is_stateless_impl
-{
- BOOST_STATIC_CONSTANT(bool, value =
- (::boost::type_traits::ice_and<
- ::boost::has_trivial_constructor<T>::value,
- ::boost::has_trivial_copy<T>::value,
- ::boost::has_trivial_destructor<T>::value,
- ::boost::is_class<T>::value,
- ::boost::is_empty<T>::value
- >::value));
-};
-
-} // namespace detail
-
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_stateless,T,::boost::detail::is_stateless_impl<T>::value)
+struct is_stateless
+ : public integral_constant<bool,
+ (::boost::has_trivial_constructor<T>::value
+ && ::boost::has_trivial_copy<T>::value
+ && ::boost::has_trivial_destructor<T>::value
+ && ::boost::is_class<T>::value
+ && ::boost::is_empty<T>::value)>
+{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_STATELESS_HPP_INCLUDED
diff --git a/boost/type_traits/is_union.hpp b/boost/type_traits/is_union.hpp
index 610f162ba4..c5e1a96019 100644
--- a/boost/type_traits/is_union.hpp
+++ b/boost/type_traits/is_union.hpp
@@ -11,47 +11,21 @@
#ifndef BOOST_TT_IS_UNION_HPP_INCLUDED
#define BOOST_TT_IS_UNION_HPP_INCLUDED
-#include <boost/type_traits/remove_cv.hpp>
-#include <boost/type_traits/config.hpp>
#include <boost/type_traits/intrinsics.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-namespace detail {
-#ifndef __GNUC__
-template <typename T> struct is_union_impl
-{
- typedef typename remove_cv<T>::type cvt;
#ifdef BOOST_IS_UNION
- BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_UNION(cvt));
+template <class T> struct is_union : public integral_constant<bool, BOOST_IS_UNION(T)> {};
#else
- BOOST_STATIC_CONSTANT(bool, value = false);
+template <class T> struct is_union : public integral_constant<bool, false> {};
#endif
-};
-#else
-//
-// using remove_cv here generates a whole load of needless
-// warnings with gcc, since it doesn't do any good with gcc
-// in any case (at least at present), just remove it:
-//
-template <typename T> struct is_union_impl
-{
-#ifdef BOOST_IS_UNION
- BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_UNION(T));
-#else
- BOOST_STATIC_CONSTANT(bool, value = false);
-#endif
-};
-#endif
-} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_union,T,::boost::detail::is_union_impl<T>::value)
+template <class T> struct is_union<T const> : public is_union<T>{};
+template <class T> struct is_union<T volatile const> : public is_union<T>{};
+template <class T> struct is_union<T volatile> : public is_union<T>{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_UNION_HPP_INCLUDED
diff --git a/boost/type_traits/is_unsigned.hpp b/boost/type_traits/is_unsigned.hpp
index 0602838a33..c4c54af7b3 100644
--- a/boost/type_traits/is_unsigned.hpp
+++ b/boost/type_traits/is_unsigned.hpp
@@ -13,18 +13,18 @@
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_enum.hpp>
#include <boost/type_traits/remove_cv.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <climits>
namespace boost {
#if !defined( __CODEGEARC__ )
-namespace detail{
+#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1310) &&\
+ !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) &&\
+ !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
-#if !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) && !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+namespace detail{
template <class T>
struct is_unsigned_values
@@ -46,7 +46,7 @@ struct is_ununsigned_helper
};
template <bool integral_type>
-struct is_ununsigned_select_helper
+struct is_unsigned_select_helper
{
template <class T>
struct rebind
@@ -56,7 +56,7 @@ struct is_ununsigned_select_helper
};
template <>
-struct is_ununsigned_select_helper<false>
+struct is_unsigned_select_helper<false>
{
template <class T>
struct rebind
@@ -66,70 +66,98 @@ struct is_ununsigned_select_helper<false>
};
template <class T>
-struct is_unsigned_imp
+struct is_unsigned
{
- typedef is_ununsigned_select_helper<
- ::boost::type_traits::ice_or<
- ::boost::is_integral<T>::value,
- ::boost::is_enum<T>::value>::value
- > selector;
+ typedef ::boost::detail::is_unsigned_select_helper< ::boost::is_integral<T>::value || ::boost::is_enum<T>::value > selector;
typedef typename selector::template rebind<T> binder;
typedef typename binder::type type;
BOOST_STATIC_CONSTANT(bool, value = type::value);
};
+} // namespace detail
+
+template <class T> struct is_unsigned : public integral_constant<bool, boost::detail::is_unsigned<T>::value> {};
+
#else
-template <class T> struct is_unsigned_imp : public false_type{};
-template <> struct is_unsigned_imp<unsigned char> : public true_type{};
-template <> struct is_unsigned_imp<const unsigned char> : public true_type{};
-template <> struct is_unsigned_imp<volatile unsigned char> : public true_type{};
-template <> struct is_unsigned_imp<const volatile unsigned char> : public true_type{};
-template <> struct is_unsigned_imp<unsigned short> : public true_type{};
-template <> struct is_unsigned_imp<const unsigned short> : public true_type{};
-template <> struct is_unsigned_imp<volatile unsigned short> : public true_type{};
-template <> struct is_unsigned_imp<const volatile unsigned short> : public true_type{};
-template <> struct is_unsigned_imp<unsigned int> : public true_type{};
-template <> struct is_unsigned_imp<const unsigned int> : public true_type{};
-template <> struct is_unsigned_imp<volatile unsigned int> : public true_type{};
-template <> struct is_unsigned_imp<const volatile unsigned int> : public true_type{};
-template <> struct is_unsigned_imp<unsigned long> : public true_type{};
-template <> struct is_unsigned_imp<const unsigned long> : public true_type{};
-template <> struct is_unsigned_imp<volatile unsigned long> : public true_type{};
-template <> struct is_unsigned_imp<const volatile unsigned long> : public true_type{};
-#ifdef BOOST_HAS_LONG_LONG
-template <> struct is_unsigned_imp<unsigned long long> : public true_type{};
-template <> struct is_unsigned_imp<const unsigned long long> : public true_type{};
-template <> struct is_unsigned_imp<volatile unsigned long long> : public true_type{};
-template <> struct is_unsigned_imp<const volatile unsigned long long> : public true_type{};
-#endif
-#if defined(CHAR_MIN) && (CHAR_MIN == 0)
-template <> struct is_unsigned_imp<char> : public true_type{};
-template <> struct is_unsigned_imp<const char> : public true_type{};
-template <> struct is_unsigned_imp<volatile char> : public true_type{};
-template <> struct is_unsigned_imp<const volatile char> : public true_type{};
-#endif
-#if defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
-template <> struct is_unsigned_imp<wchar_t> : public true_type{};
-template <> struct is_unsigned_imp<const wchar_t> : public true_type{};
-template <> struct is_unsigned_imp<volatile wchar_t> : public true_type{};
-template <> struct is_unsigned_imp<const volatile wchar_t> : public true_type{};
-#endif
+template <class T> struct is_unsigned : public false_type{};
#endif
-}
-
-#endif // !defined( __CODEGEARC__ )
+#else // defined( __CODEGEARC__ )
+template <class T> struct is_unsigned : public integral_constant<bool, __is_unsigned(T)> {};
+#endif
-#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_unsigned,T,__is_unsigned(T))
+template <> struct is_unsigned<unsigned char> : public true_type{};
+template <> struct is_unsigned<const unsigned char> : public true_type{};
+template <> struct is_unsigned<volatile unsigned char> : public true_type{};
+template <> struct is_unsigned<const volatile unsigned char> : public true_type{};
+template <> struct is_unsigned<unsigned short> : public true_type{};
+template <> struct is_unsigned<const unsigned short> : public true_type{};
+template <> struct is_unsigned<volatile unsigned short> : public true_type{};
+template <> struct is_unsigned<const volatile unsigned short> : public true_type{};
+template <> struct is_unsigned<unsigned int> : public true_type{};
+template <> struct is_unsigned<const unsigned int> : public true_type{};
+template <> struct is_unsigned<volatile unsigned int> : public true_type{};
+template <> struct is_unsigned<const volatile unsigned int> : public true_type{};
+template <> struct is_unsigned<unsigned long> : public true_type{};
+template <> struct is_unsigned<const unsigned long> : public true_type{};
+template <> struct is_unsigned<volatile unsigned long> : public true_type{};
+template <> struct is_unsigned<const volatile unsigned long> : public true_type{};
+
+template <> struct is_unsigned<signed char> : public false_type{};
+template <> struct is_unsigned<const signed char> : public false_type{};
+template <> struct is_unsigned<volatile signed char> : public false_type{};
+template <> struct is_unsigned<const volatile signed char> : public false_type{};
+template <> struct is_unsigned< short> : public false_type{};
+template <> struct is_unsigned<const short> : public false_type{};
+template <> struct is_unsigned<volatile short> : public false_type{};
+template <> struct is_unsigned<const volatile short> : public false_type{};
+template <> struct is_unsigned< int> : public false_type{};
+template <> struct is_unsigned<const int> : public false_type{};
+template <> struct is_unsigned<volatile int> : public false_type{};
+template <> struct is_unsigned<const volatile int> : public false_type{};
+template <> struct is_unsigned< long> : public false_type{};
+template <> struct is_unsigned<const long> : public false_type{};
+template <> struct is_unsigned<volatile long> : public false_type{};
+template <> struct is_unsigned<const volatile long> : public false_type{};
+#ifdef BOOST_HAS_LONG_LONG
+template <> struct is_unsigned< ::boost::ulong_long_type> : public true_type{};
+template <> struct is_unsigned<const ::boost::ulong_long_type> : public true_type{};
+template <> struct is_unsigned<volatile ::boost::ulong_long_type> : public true_type{};
+template <> struct is_unsigned<const volatile ::boost::ulong_long_type> : public true_type{};
+
+template <> struct is_unsigned< ::boost::long_long_type> : public false_type{};
+template <> struct is_unsigned<const ::boost::long_long_type> : public false_type{};
+template <> struct is_unsigned<volatile ::boost::long_long_type> : public false_type{};
+template <> struct is_unsigned<const volatile ::boost::long_long_type> : public false_type{};
+#endif
+#if defined(CHAR_MIN)
+#if CHAR_MIN == 0
+template <> struct is_unsigned<char> : public true_type{};
+template <> struct is_unsigned<const char> : public true_type{};
+template <> struct is_unsigned<volatile char> : public true_type{};
+template <> struct is_unsigned<const volatile char> : public true_type{};
#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_unsigned,T,::boost::detail::is_unsigned_imp<T>::value)
+template <> struct is_unsigned<char> : public false_type{};
+template <> struct is_unsigned<const char> : public false_type{};
+template <> struct is_unsigned<volatile char> : public false_type{};
+template <> struct is_unsigned<const volatile char> : public false_type{};
+#endif
+#endif
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) && defined(WCHAR_MIN)
+#if WCHAR_MIN == 0
+template <> struct is_unsigned<wchar_t> : public true_type{};
+template <> struct is_unsigned<const wchar_t> : public true_type{};
+template <> struct is_unsigned<volatile wchar_t> : public true_type{};
+template <> struct is_unsigned<const volatile wchar_t> : public true_type{};
+#else
+template <> struct is_unsigned<wchar_t> : public false_type{};
+template <> struct is_unsigned<const wchar_t> : public false_type{};
+template <> struct is_unsigned<volatile wchar_t> : public false_type{};
+template <> struct is_unsigned<const volatile wchar_t> : public false_type{};
+#endif
#endif
-
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/is_virtual_base_of.hpp b/boost/type_traits/is_virtual_base_of.hpp
index 3daad1b51b..f0052563e3 100644
--- a/boost/type_traits/is_virtual_base_of.hpp
+++ b/boost/type_traits/is_virtual_base_of.hpp
@@ -10,11 +10,6 @@
#include <boost/type_traits/is_base_of.hpp>
#include <boost/type_traits/is_same.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/not.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost {
namespace detail {
@@ -34,7 +29,7 @@ struct is_virtual_base_of_impl
};
template<typename Base, typename Derived>
-struct is_virtual_base_of_impl<Base, Derived, mpl::true_>
+struct is_virtual_base_of_impl<Base, Derived, true_type>
{
union max_align
{
@@ -88,7 +83,7 @@ struct is_virtual_base_of_impl<Base, Derived, mpl::true_>
template<typename Base, typename Derived>
struct is_virtual_base_of_impl2
{
- typedef typename mpl::and_<is_base_of<Base, Derived>, mpl::not_<is_same<Base, Derived> > >::type tag_type;
+ typedef boost::integral_constant<bool, (boost::is_base_of<Base, Derived>::value && ! boost::is_same<Base, Derived>::value)> tag_type;
typedef is_virtual_base_of_impl<Base, Derived, tag_type> imp;
BOOST_STATIC_CONSTANT(bool, value = imp::value);
};
@@ -99,19 +94,12 @@ struct is_virtual_base_of_impl2
} // namespace detail
-BOOST_TT_AUX_BOOL_TRAIT_DEF2(
- is_virtual_base_of
- , Base
- , Derived
- , (::boost::detail::is_virtual_base_of_impl2<Base,Derived>::value)
-)
+template <class Base, class Derived> struct is_virtual_base_of : public integral_constant<bool, (::boost::detail::is_virtual_base_of_impl2<Base, Derived>::value)>{};
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base,Derived&,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived&,false)
+template <class Base, class Derived> struct is_virtual_base_of<Base&, Derived> : public false_type{};
+template <class Base, class Derived> struct is_virtual_base_of<Base, Derived&> : public false_type{};
+template <class Base, class Derived> struct is_virtual_base_of<Base&, Derived&> : public false_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif
diff --git a/boost/type_traits/is_void.hpp b/boost/type_traits/is_void.hpp
index 6f6fbff6d9..183f8abf56 100644
--- a/boost/type_traits/is_void.hpp
+++ b/boost/type_traits/is_void.hpp
@@ -9,30 +9,18 @@
#ifndef BOOST_TT_IS_VOID_HPP_INCLUDED
#define BOOST_TT_IS_VOID_HPP_INCLUDED
-#include <boost/config.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-//* is a type T void - is_void<T>
-#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_void,T,__is_void(T))
-#else
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_void,T,false)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void,true)
-
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void const,true)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void volatile,true)
-BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_void,void const volatile,true)
-#endif
+template <class T>
+struct is_void : public false_type {};
-#endif // non-CodeGear implementation
+template<> struct is_void<void> : public true_type {};
+template<> struct is_void<const void> : public true_type{};
+template<> struct is_void<const volatile void> : public true_type{};
+template<> struct is_void<volatile void> : public true_type{};
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_VOID_HPP_INCLUDED
diff --git a/boost/type_traits/is_volatile.hpp b/boost/type_traits/is_volatile.hpp
index d9839dad3b..cefe987308 100644
--- a/boost/type_traits/is_volatile.hpp
+++ b/boost/type_traits/is_volatile.hpp
@@ -21,64 +21,25 @@
#ifndef BOOST_TT_IS_VOLATILE_HPP_INCLUDED
#define BOOST_TT_IS_VOLATILE_HPP_INCLUDED
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
-# include <boost/type_traits/detail/cv_traits_impl.hpp>
-# if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
-# include <boost/type_traits/remove_bounds.hpp>
-# endif
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
-namespace detail{
-template <class T>
-struct is_volatile_rval_filter
-{
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1400)
- BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<typename boost::remove_bounds<T>::type*>::is_volatile);
-#else
- BOOST_STATIC_CONSTANT(bool, value = ::boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::is_volatile);
-#endif
-};
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-//
-// We can't filter out rvalue_references at the same level as
-// references or we get ambiguities from msvc:
-//
-template <class T>
-struct is_volatile_rval_filter<T&&>
-{
- BOOST_STATIC_CONSTANT(bool, value = false);
-};
-#endif
-}
-
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,__is_volatile(T))
-#else
-//* is a type T declared volatile - is_volatile<T>
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_volatile,T,::boost::detail::is_volatile_rval_filter<T>::value)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T&,false)
+ template <class T>
+ struct is_volatile : public integral_constant<bool, __is_volatile(T)> {};
-#if defined(BOOST_ILLEGAL_CV_REFERENCES)
-// these are illegal specialisations; cv-qualifies applied to
-// references have no effect according to [8.3.2p1],
-// C++ Builder requires them though as it treats cv-qualified
-// references as distinct types...
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& const,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& volatile,false)
-BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_1(typename T,is_volatile,T& const volatile,false)
-#endif
+#else
+
+ template <class T>
+ struct is_volatile : public false_type {};
+ template <class T> struct is_volatile<T volatile> : public true_type{};
+ template <class T, size_t N> struct is_volatile<T volatile[N]> : public true_type{};
+ template <class T> struct is_volatile<T volatile[]> : public true_type{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_IS_VOLATILE_HPP_INCLUDED
diff --git a/boost/type_traits/make_signed.hpp b/boost/type_traits/make_signed.hpp
index 51cdbb0dc8..0d2d5df61a 100644
--- a/boost/type_traits/make_signed.hpp
+++ b/boost/type_traits/make_signed.hpp
@@ -9,7 +9,7 @@
#ifndef BOOST_TT_MAKE_SIGNED_HPP_INCLUDED
#define BOOST_TT_MAKE_SIGNED_HPP_INCLUDED
-#include <boost/mpl/if.hpp>
+#include <boost/type_traits/conditional.hpp>
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_signed.hpp>
#include <boost/type_traits/is_unsigned.hpp>
@@ -20,58 +20,45 @@
#include <boost/type_traits/is_volatile.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/add_volatile.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
#include <boost/static_assert.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
template <class T>
-struct make_signed_imp
+struct make_signed
{
- BOOST_STATIC_ASSERT(
- (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_enum<T>::value>::value));
- BOOST_STATIC_ASSERT(
- (::boost::type_traits::ice_not< ::boost::is_same<
- typename remove_cv<T>::type, bool>::value>::value));
+private:
+ BOOST_STATIC_ASSERT_MSG(( ::boost::is_integral<T>::value || ::boost::is_enum<T>::value), "The template argument to make_signed must be an integer or enum type.");
+ BOOST_STATIC_ASSERT_MSG(!(::boost::is_same<typename remove_cv<T>::type, bool>::value), "The template argument to make_signed must not be the type bool.");
typedef typename remove_cv<T>::type t_no_cv;
- typedef typename mpl::if_c<
- (::boost::type_traits::ice_and<
- ::boost::is_signed<T>::value,
- ::boost::is_integral<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value >::value),
+ typedef typename conditional<
+ (::boost::is_signed<T>::value
+ && ::boost::is_integral<T>::value
+ && ! ::boost::is_same<t_no_cv, char>::value
+ && ! ::boost::is_same<t_no_cv, wchar_t>::value
+ && ! ::boost::is_same<t_no_cv, bool>::value),
T,
- typename mpl::if_c<
- (::boost::type_traits::ice_and<
- ::boost::is_integral<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value>
- ::value),
- typename mpl::if_<
- is_same<t_no_cv, unsigned char>,
+ typename conditional<
+ (::boost::is_integral<T>::value
+ && ! ::boost::is_same<t_no_cv, char>::value
+ && ! ::boost::is_same<t_no_cv, wchar_t>::value
+ && ! ::boost::is_same<t_no_cv, bool>::value),
+ typename conditional<
+ is_same<t_no_cv, unsigned char>::value,
signed char,
- typename mpl::if_<
- is_same<t_no_cv, unsigned short>,
+ typename conditional<
+ is_same<t_no_cv, unsigned short>::value,
signed short,
- typename mpl::if_<
- is_same<t_no_cv, unsigned int>,
+ typename conditional<
+ is_same<t_no_cv, unsigned int>::value,
int,
- typename mpl::if_<
- is_same<t_no_cv, unsigned long>,
+ typename conditional<
+ is_same<t_no_cv, unsigned long>::value,
long,
#if defined(BOOST_HAS_LONG_LONG)
#ifdef BOOST_HAS_INT128
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(boost::long_long_type),
boost::long_long_type,
boost::int128_type
@@ -89,21 +76,21 @@ struct make_signed_imp
>::type
>::type,
// Not a regular integer type:
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned char),
signed char,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned short),
signed short,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned int),
int,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned long),
long,
#if defined(BOOST_HAS_LONG_LONG)
#ifdef BOOST_HAS_INT128
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(boost::long_long_type),
boost::long_long_type,
boost::int128_type
@@ -124,28 +111,21 @@ struct make_signed_imp
>::type base_integer_type;
// Add back any const qualifier:
- typedef typename mpl::if_<
- is_const<T>,
+ typedef typename conditional<
+ is_const<T>::value,
typename add_const<base_integer_type>::type,
base_integer_type
>::type const_base_integer_type;
-
+public:
// Add back any volatile qualifier:
- typedef typename mpl::if_<
- is_volatile<T>,
+ typedef typename conditional<
+ is_volatile<T>::value,
typename add_volatile<const_base_integer_type>::type,
const_base_integer_type
>::type type;
};
-
-} // namespace detail
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_signed,T,typename boost::detail::make_signed_imp<T>::type)
-
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/make_unsigned.hpp b/boost/type_traits/make_unsigned.hpp
index 239153a863..4b21ebaeb2 100644
--- a/boost/type_traits/make_unsigned.hpp
+++ b/boost/type_traits/make_unsigned.hpp
@@ -9,7 +9,7 @@
#ifndef BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED
#define BOOST_TT_MAKE_UNSIGNED_HPP_INCLUDED
-#include <boost/mpl/if.hpp>
+#include <boost/type_traits/conditional.hpp>
#include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_signed.hpp>
#include <boost/type_traits/is_unsigned.hpp>
@@ -20,58 +20,44 @@
#include <boost/type_traits/is_volatile.hpp>
#include <boost/type_traits/add_const.hpp>
#include <boost/type_traits/add_volatile.hpp>
-#include <boost/type_traits/detail/ice_or.hpp>
-#include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/detail/ice_not.hpp>
#include <boost/static_assert.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
template <class T>
-struct make_unsigned_imp
+struct make_unsigned
{
- BOOST_STATIC_ASSERT(
- (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_enum<T>::value>::value));
- BOOST_STATIC_ASSERT(
- (::boost::type_traits::ice_not< ::boost::is_same<
- typename remove_cv<T>::type, bool>::value>::value));
+private:
+ BOOST_STATIC_ASSERT_MSG((::boost::is_integral<T>::value || ::boost::is_enum<T>::value), "The template argument to make_unsigned must be an integer or enum type.");
+ BOOST_STATIC_ASSERT_MSG((! ::boost::is_same<typename remove_cv<T>::type, bool>::value), "The template argument to make_unsigned must not be the type bool");
typedef typename remove_cv<T>::type t_no_cv;
- typedef typename mpl::if_c<
- (::boost::type_traits::ice_and<
- ::boost::is_unsigned<T>::value,
- ::boost::is_integral<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value >::value),
+ typedef typename conditional<
+ (::boost::is_unsigned<T>::value && ::boost::is_integral<T>::value
+ && ! ::boost::is_same<t_no_cv, char>::value
+ && ! ::boost::is_same<t_no_cv, wchar_t>::value
+ && ! ::boost::is_same<t_no_cv, bool>::value),
T,
- typename mpl::if_c<
- (::boost::type_traits::ice_and<
- ::boost::is_integral<T>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, char>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, wchar_t>::value>::value,
- ::boost::type_traits::ice_not< ::boost::is_same<t_no_cv, bool>::value>::value>
- ::value),
- typename mpl::if_<
- is_same<t_no_cv, signed char>,
+ typename conditional<
+ (::boost::is_integral<T>::value
+ && ! ::boost::is_same<t_no_cv, char>::value
+ && ! ::boost::is_same<t_no_cv, wchar_t>::value
+ && ! ::boost::is_same<t_no_cv, bool>::value),
+ typename conditional<
+ is_same<t_no_cv, signed char>::value,
unsigned char,
- typename mpl::if_<
- is_same<t_no_cv, short>,
+ typename conditional<
+ is_same<t_no_cv, short>::value,
unsigned short,
- typename mpl::if_<
- is_same<t_no_cv, int>,
+ typename conditional<
+ is_same<t_no_cv, int>::value,
unsigned int,
- typename mpl::if_<
- is_same<t_no_cv, long>,
+ typename conditional<
+ is_same<t_no_cv, long>::value,
unsigned long,
#if defined(BOOST_HAS_LONG_LONG)
#ifdef BOOST_HAS_INT128
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(boost::ulong_long_type),
boost::ulong_long_type,
boost::uint128_type
@@ -89,21 +75,21 @@ struct make_unsigned_imp
>::type
>::type,
// Not a regular integer type:
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned char),
unsigned char,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned short),
unsigned short,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned int),
unsigned int,
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(unsigned long),
unsigned long,
#if defined(BOOST_HAS_LONG_LONG)
#ifdef BOOST_HAS_INT128
- typename mpl::if_c<
+ typename conditional<
sizeof(t_no_cv) == sizeof(boost::ulong_long_type),
boost::ulong_long_type,
boost::uint128_type
@@ -124,28 +110,21 @@ struct make_unsigned_imp
>::type base_integer_type;
// Add back any const qualifier:
- typedef typename mpl::if_<
- is_const<T>,
+ typedef typename conditional<
+ is_const<T>::value,
typename add_const<base_integer_type>::type,
base_integer_type
>::type const_base_integer_type;
-
+public:
// Add back any volatile qualifier:
- typedef typename mpl::if_<
- is_volatile<T>,
+ typedef typename conditional<
+ is_volatile<T>::value,
typename add_volatile<const_base_integer_type>::type,
const_base_integer_type
>::type type;
};
-
-} // namespace detail
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(make_unsigned,T,typename boost::detail::make_unsigned_imp<T>::type)
-
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/promote.hpp b/boost/type_traits/promote.hpp
index 60f6278bad..587617a287 100644
--- a/boost/type_traits/promote.hpp
+++ b/boost/type_traits/promote.hpp
@@ -10,31 +10,11 @@
#include <boost/type_traits/integral_promotion.hpp>
#include <boost/type_traits/floating_point_promotion.hpp>
-// Should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-namespace detail {
-
-template<class T>
-struct promote_impl
- : public integral_promotion<
- BOOST_DEDUCED_TYPENAME floating_point_promotion<T>::type
- >
-{
-};
+template<class T> struct promote : public integral_promotion<typename floating_point_promotion<T>::type>{};
}
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(
- promote
- , T
- , BOOST_DEDUCED_TYPENAME boost::detail::promote_impl<T>::type
- )
-}
-
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // #ifndef FILE_boost_type_traits_promote_hpp_INCLUDED
diff --git a/boost/type_traits/rank.hpp b/boost/type_traits/rank.hpp
index 33f46c8eb8..3dfc693687 100644
--- a/boost/type_traits/rank.hpp
+++ b/boost/type_traits/rank.hpp
@@ -10,8 +10,7 @@
#ifndef BOOST_TT_RANK_HPP_INCLUDED
#define BOOST_TT_RANK_HPP_INCLUDED
-// should be the last #include
-#include <boost/type_traits/detail/size_t_trait_def.hpp>
+#include <boost/type_traits/integral_constant.hpp>
namespace boost {
@@ -77,13 +76,11 @@ struct rank_imp<T const volatile[], N>
#endif // !defined( __CODEGEARC__ )
#if defined( __CODEGEARC__ )
-BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(rank,T,__array_rank(T))
+template <class T> struct rank : public integral_constant<std::size_t, __array_rank(T)>{};
#else
-BOOST_TT_AUX_SIZE_T_TRAIT_DEF1(rank,T,(::boost::detail::rank_imp<T,0>::value))
+template <class T> struct rank : public integral_constant<std::size_t, (::boost::detail::rank_imp<T, 0>::value)>{};
#endif
} // namespace boost
-#include <boost/type_traits/detail/size_t_trait_undef.hpp>
-
#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/remove_all_extents.hpp b/boost/type_traits/remove_all_extents.hpp
index 1409da12cb..3ccdc98281 100644
--- a/boost/type_traits/remove_all_extents.hpp
+++ b/boost/type_traits/remove_all_extents.hpp
@@ -13,28 +13,23 @@
#include <cstddef>
#include <boost/detail/workaround.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_all_extents,T,T)
+template <class T> struct remove_all_extents{ typedef T type; };
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T[N],typename boost::remove_all_extents<T>::type type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T const[N],typename boost::remove_all_extents<T const>::type type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T volatile[N],typename boost::remove_all_extents<T volatile>::type type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_all_extents,T const volatile[N],typename boost::remove_all_extents<T const volatile>::type type)
+template <class T, std::size_t N> struct remove_all_extents<T[N]> : public remove_all_extents<T>{};
+template <class T, std::size_t N> struct remove_all_extents<T const[N]> : public remove_all_extents<T const>{};
+template <class T, std::size_t N> struct remove_all_extents<T volatile[N]> : public remove_all_extents<T volatile>{};
+template <class T, std::size_t N> struct remove_all_extents<T const volatile[N]> : public remove_all_extents<T const volatile>{};
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T[],typename boost::remove_all_extents<T>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const[],typename boost::remove_all_extents<T const>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T volatile[],typename boost::remove_all_extents<T volatile>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const volatile[],typename boost::remove_all_extents<T const volatile>::type)
+template <class T> struct remove_all_extents<T[]> : public remove_all_extents<T>{};
+template <class T> struct remove_all_extents<T const[]> : public remove_all_extents<T const>{};
+template <class T> struct remove_all_extents<T volatile[]> : public remove_all_extents<T volatile>{};
+template <class T> struct remove_all_extents<T const volatile[]> : public remove_all_extents<T const volatile>{};
#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
diff --git a/boost/type_traits/remove_bounds.hpp b/boost/type_traits/remove_bounds.hpp
index 2d26348c69..56988d24e0 100644
--- a/boost/type_traits/remove_bounds.hpp
+++ b/boost/type_traits/remove_bounds.hpp
@@ -9,32 +9,13 @@
#ifndef BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
#define BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
-#include <boost/config.hpp>
-#include <cstddef>
-#include <boost/detail/workaround.hpp>
+#include <boost/type_traits/remove_extent.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
+namespace boost
+{
-namespace boost {
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_bounds,T,T)
-
-#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T[N],T type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T const[N],T const type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T volatile[N],T volatile type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_bounds,T const volatile[N],T const volatile type)
-#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T[],T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const[],T const)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T volatile[],T volatile)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const volatile[],T const volatile)
-#endif
-#endif
+template <class T> struct remove_bounds : public remove_extent<T> {};
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
diff --git a/boost/type_traits/remove_const.hpp b/boost/type_traits/remove_const.hpp
index 1020781383..b47f851460 100644
--- a/boost/type_traits/remove_const.hpp
+++ b/boost/type_traits/remove_const.hpp
@@ -11,69 +11,23 @@
#ifndef BOOST_TT_REMOVE_CONST_HPP_INCLUDED
#define BOOST_TT_REMOVE_CONST_HPP_INCLUDED
-#include <boost/type_traits/is_volatile.hpp>
-#include <boost/type_traits/detail/cv_traits_impl.hpp>
#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
#include <cstddef>
-
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
+#include <boost/detail/workaround.hpp>
namespace boost {
+ // convert a type T to a non-cv-qualified type - remove_const<T>
+ template <class T> struct remove_const{ typedef T type; };
+ template <class T> struct remove_const<T const>{ typedef T type; };
-namespace detail {
-
-template <typename T, bool is_vol>
-struct remove_const_helper
-{
- typedef T type;
-};
-
-template <typename T>
-struct remove_const_helper<T, true>
-{
- typedef T volatile type;
-};
-
-
-template <typename T>
-struct remove_const_impl
-{
- typedef typename remove_const_helper<
- typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
- , ::boost::is_volatile<T>::value
- >::type type;
-};
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-//
-// We can't filter out rvalue_references at the same level as
-// references or we get ambiguities from msvc:
-//
-template <typename T>
-struct remove_const_impl<T&&>
-{
- typedef T&& type;
-};
-#endif
-
-} // namespace detail
-
-// * convert a type T to non-const type - remove_const<T>
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_const,T,typename boost::detail::remove_const_impl<T>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_const,T&,T&)
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const[N],T type[N])
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const volatile[N],T volatile type[N])
+ template <class T, std::size_t N> struct remove_const<T const[N]>{ typedef T type[N]; };
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+ template <class T> struct remove_const<T const[]>{ typedef T type[]; };
+#endif
#endif
-
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_CONST_HPP_INCLUDED
diff --git a/boost/type_traits/remove_cv.hpp b/boost/type_traits/remove_cv.hpp
index 9ba34a1eff..b50607f2ce 100644
--- a/boost/type_traits/remove_cv.hpp
+++ b/boost/type_traits/remove_cv.hpp
@@ -11,53 +11,30 @@
#ifndef BOOST_TT_REMOVE_CV_HPP_INCLUDED
#define BOOST_TT_REMOVE_CV_HPP_INCLUDED
-#include <boost/type_traits/detail/cv_traits_impl.hpp>
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
-
#include <cstddef>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
+ // convert a type T to a non-cv-qualified type - remove_cv<T>
+template <class T> struct remove_cv{ typedef T type; };
+template <class T> struct remove_cv<T const>{ typedef T type; };
+template <class T> struct remove_cv<T volatile>{ typedef T type; };
+template <class T> struct remove_cv<T const volatile>{ typedef T type; };
-namespace detail{
-
-template <class T>
-struct rvalue_ref_filter_rem_cv
-{
- typedef typename boost::detail::cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type type;
-};
-
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-//
-// We can't filter out rvalue_references at the same level as
-// references or we get ambiguities from msvc:
-//
-template <class T>
-struct rvalue_ref_filter_rem_cv<T&&>
-{
- typedef T&& type;
-};
-#endif
-
-}
-
-
-// convert a type T to a non-cv-qualified type - remove_cv<T>
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_cv,T,typename boost::detail::rvalue_ref_filter_rem_cv<T>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_cv,T&,T&)
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const[N],T type[N])
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T volatile[N],T type[N])
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const volatile[N],T type[N])
+template <class T, std::size_t N> struct remove_cv<T const[N]>{ typedef T type[N]; };
+template <class T, std::size_t N> struct remove_cv<T const volatile[N]>{ typedef T type[N]; };
+template <class T, std::size_t N> struct remove_cv<T volatile[N]>{ typedef T type[N]; };
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+template <class T> struct remove_cv<T const[]>{ typedef T type[]; };
+template <class T> struct remove_cv<T const volatile[]>{ typedef T type[]; };
+template <class T> struct remove_cv<T volatile[]>{ typedef T type[]; };
+#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_CV_HPP_INCLUDED
diff --git a/boost/type_traits/remove_extent.hpp b/boost/type_traits/remove_extent.hpp
index 9c4cdff70b..0b50a07034 100644
--- a/boost/type_traits/remove_extent.hpp
+++ b/boost/type_traits/remove_extent.hpp
@@ -13,28 +13,23 @@
#include <boost/detail/workaround.hpp>
#include <cstddef>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_extent,T,T)
+template <class T> struct remove_extent{ typedef T type; };
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T[N],T type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T const[N],T const type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T volatile[N],T volatile type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_extent,T const volatile[N],T const volatile type)
+template <typename T, std::size_t N> struct remove_extent<T[N]> { typedef T type; };
+template <typename T, std::size_t N> struct remove_extent<T const[N]> { typedef T const type; };
+template <typename T, std::size_t N> struct remove_extent<T volatile [N]> { typedef T volatile type; };
+template <typename T, std::size_t N> struct remove_extent<T const volatile [N]> { typedef T const volatile type; };
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T[],T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const[],T const)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T volatile[],T volatile)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const volatile[],T const volatile)
+template <typename T> struct remove_extent<T[]> { typedef T type; };
+template <typename T> struct remove_extent<T const[]> { typedef T const type; };
+template <typename T> struct remove_extent<T volatile[]> { typedef T volatile type; };
+template <typename T> struct remove_extent<T const volatile[]> { typedef T const volatile type; };
#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED
diff --git a/boost/type_traits/remove_pointer.hpp b/boost/type_traits/remove_pointer.hpp
index fef706860c..fb79e59d22 100644
--- a/boost/type_traits/remove_pointer.hpp
+++ b/boost/type_traits/remove_pointer.hpp
@@ -10,16 +10,12 @@
#define BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
#if defined(BOOST_MSVC)
#include <boost/type_traits/remove_cv.hpp>
#include <boost/type_traits/is_pointer.hpp>
#endif
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
#ifdef BOOST_MSVC
@@ -64,20 +60,18 @@ namespace detail{
};
}
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename boost::detail::remove_pointer_imp2<T>::type)
+template <class T> struct remove_pointer{ typedef typename boost::detail::remove_pointer_imp2<T>::type type; };
#else
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T*,T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const,T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* volatile,T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const volatile,T)
+template <class T> struct remove_pointer{ typedef T type; };
+template <class T> struct remove_pointer<T*>{ typedef T type; };
+template <class T> struct remove_pointer<T*const>{ typedef T type; };
+template <class T> struct remove_pointer<T*volatile>{ typedef T type; };
+template <class T> struct remove_pointer<T*const volatile>{ typedef T type; };
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_POINTER_HPP_INCLUDED
diff --git a/boost/type_traits/remove_reference.hpp b/boost/type_traits/remove_reference.hpp
index c59e7e35f4..f75e67783b 100644
--- a/boost/type_traits/remove_reference.hpp
+++ b/boost/type_traits/remove_reference.hpp
@@ -12,9 +12,6 @@
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
@@ -38,22 +35,20 @@ struct remove_rvalue_ref<T&&>
} // namespace detail
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_reference,T,typename boost::detail::remove_rvalue_ref<T>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T&,T)
+template <class T> struct remove_reference{ typedef typename boost::detail::remove_rvalue_ref<T>::type type; };
+template <class T> struct remove_reference<T&>{ typedef T type; };
#if defined(BOOST_ILLEGAL_CV_REFERENCES)
// these are illegal specialisations; cv-qualifies applied to
// references have no effect according to [8.3.2p1],
// C++ Builder requires them though as it treats cv-qualified
// references as distinct types...
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const,T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& volatile,T)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const volatile,T)
+template <class T> struct remove_reference<T&const>{ typedef T type; };
+template <class T> struct remove_reference<T&volatile>{ typedef T type; };
+template <class T> struct remove_reference<T&const volatile>{ typedef T type; };
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED
diff --git a/boost/type_traits/remove_volatile.hpp b/boost/type_traits/remove_volatile.hpp
index c20277696d..475e39d22c 100644
--- a/boost/type_traits/remove_volatile.hpp
+++ b/boost/type_traits/remove_volatile.hpp
@@ -11,67 +11,24 @@
#ifndef BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED
#define BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED
-#include <boost/type_traits/is_const.hpp>
-#include <boost/type_traits/detail/cv_traits_impl.hpp>
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
-
#include <cstddef>
-// should be the last #include
-#include <boost/type_traits/detail/type_trait_def.hpp>
-
namespace boost {
+ // convert a type T to a non-cv-qualified type - remove_volatile<T>
+ template <class T> struct remove_volatile{ typedef T type; };
+ template <class T> struct remove_volatile<T volatile>{ typedef T type; };
-namespace detail {
-
-template <typename T, bool is_const>
-struct remove_volatile_helper
-{
- typedef T type;
-};
-
-template <typename T>
-struct remove_volatile_helper<T,true>
-{
- typedef T const type;
-};
-
-template <typename T>
-struct remove_volatile_impl
-{
- typedef typename remove_volatile_helper<
- typename cv_traits_imp<BOOST_TT_AUX_CV_TRAITS_IMPL_PARAM(T)>::unqualified_type
- , ::boost::is_const<T>::value
- >::type type;
-};
-
-//
-// We can't filter out rvalue_references at the same level as
-// references or we get ambiguities from msvc:
-//
-#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
-template <typename T>
-struct remove_volatile_impl<T&&>
-{
- typedef T&& type;
-};
-#endif
-} // namespace detail
-
-// * convert a type T to a non-volatile type - remove_volatile<T>
-
-BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_volatile,T,typename boost::detail::remove_volatile_impl<T>::type)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_volatile,T&,T&)
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T volatile[N],T type[N])
-BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T const volatile[N],T const type[N])
+ template <class T, std::size_t N> struct remove_volatile<T volatile[N]>{ typedef T type[N]; };
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))
+ template <class T> struct remove_volatile<T volatile[]>{ typedef T type[]; };
+#endif
#endif
} // namespace boost
-#include <boost/type_traits/detail/type_trait_undef.hpp>
-
#endif // BOOST_TT_REMOVE_VOLATILE_HPP_INCLUDED
diff --git a/boost/type_traits/transform_traits_spec.hpp b/boost/type_traits/transform_traits_spec.hpp
deleted file mode 100644
index b12b5f8e56..0000000000
--- a/boost/type_traits/transform_traits_spec.hpp
+++ /dev/null
@@ -1,14 +0,0 @@
-
-// Copyright 2001 Aleksey Gurtovoy.
-// Use, modification and distribution are subject to the Boost Software License,
-// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt).
-//
-// See http://www.boost.org/libs/type_traits for most recent version including documentation.
-
-#ifndef BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
-#define BOOST_TT_TRANSFORM_TRAITS_HPP_INCLUDED
-
-#include <boost/type_traits/config.hpp>
-
-#endif
diff --git a/boost/type_traits/type_identity.hpp b/boost/type_traits/type_identity.hpp
new file mode 100644
index 0000000000..6d2dd5b4dc
--- /dev/null
+++ b/boost/type_traits/type_identity.hpp
@@ -0,0 +1,22 @@
+#ifndef BOOST_TYPE_TRAITS_TYPE_IDENTITY_HPP_INCLUDED
+#define BOOST_TYPE_TRAITS_TYPE_IDENTITY_HPP_INCLUDED
+
+//
+// Copyright 2015 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+
+namespace boost
+{
+
+template<class T> struct type_identity
+{
+ typedef T type;
+};
+
+} // namespace boost
+
+#endif // #ifndef BOOST_TYPE_TRAITS_TYPE_IDENTITY_HPP_INCLUDED
diff --git a/boost/type_traits/type_with_alignment.hpp b/boost/type_traits/type_with_alignment.hpp
index 7eb66a702f..ffa054a2f1 100644
--- a/boost/type_traits/type_with_alignment.hpp
+++ b/boost/type_traits/type_with_alignment.hpp
@@ -8,175 +8,83 @@
#ifndef BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED
#define BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED
-#include <boost/mpl/if.hpp>
-#include <boost/preprocessor/list/for_each_i.hpp>
-#include <boost/preprocessor/tuple/to_list.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/list/transform.hpp>
-#include <boost/preprocessor/list/append.hpp>
#include <boost/type_traits/alignment_of.hpp>
#include <boost/type_traits/is_pod.hpp>
#include <boost/static_assert.hpp>
#include <boost/config.hpp>
-
-// should be the last #include
-#include <boost/type_traits/detail/bool_trait_def.hpp>
-
#include <cstddef>
+#include <boost/detail/workaround.hpp>
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable: 4121) // alignment is sensitive to packing
#endif
+#ifdef _MSC_VER
+#include <boost/type_traits/conditional.hpp>
+#endif
+
namespace boost {
+ namespace detail{
#ifndef __BORLANDC__
-namespace detail {
-
-class alignment_dummy;
-typedef void (*function_ptr)();
-typedef int (alignment_dummy::*member_ptr);
-typedef int (alignment_dummy::*member_function_ptr)();
-
-#ifdef BOOST_HAS_LONG_LONG
-#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( \
- 12, ( \
- char, short, int, long, ::boost::long_long_type, float, double, long double \
- , void*, function_ptr, member_ptr, member_function_ptr))
-#else
-#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( \
- 11, ( \
- char, short, int, long, float, double, long double \
- , void*, function_ptr, member_ptr, member_function_ptr))
+ union max_align
+ {
+ char c;
+ short s;
+ int i;
+ long l;
+#ifndef BOOST_NO_LONG_LONG
+ boost::long_long_type ll;
#endif
+#ifdef BOOST_HAS_INT128
+ boost::int128_type i128;
+#endif
+ float f;
+ double d;
+ long double ld;
+#ifdef BOOST_HAS_FLOAT128
+ __float128 f128;
+#endif
+ };
-#define BOOST_TT_HAS_ONE_T(D,Data,T) boost::detail::has_one_T< T >
-
-#define BOOST_TT_ALIGNMENT_STRUCT_TYPES \
- BOOST_PP_LIST_TRANSFORM(BOOST_TT_HAS_ONE_T, \
- X, \
- BOOST_TT_ALIGNMENT_BASE_TYPES)
-
-#define BOOST_TT_ALIGNMENT_TYPES \
- BOOST_PP_LIST_APPEND(BOOST_TT_ALIGNMENT_BASE_TYPES, \
- BOOST_TT_ALIGNMENT_STRUCT_TYPES)
-
-//
-// lower_alignment_helper --
-//
-// This template gets instantiated a lot, so use partial
-// specialization when available to reduce the compiler burden.
-//
-template <bool found, std::size_t target, class TestType>
-struct lower_alignment_helper
-{
- typedef char type;
- enum { value = true };
-};
-
-template <std::size_t target, class TestType>
-struct lower_alignment_helper<false,target,TestType>
-{
- enum { value = (alignment_of<TestType>::value == target) };
- typedef typename mpl::if_c<value, TestType, char>::type type;
-};
-
-#define BOOST_TT_CHOOSE_MIN_ALIGNMENT(R,P,I,T) \
- typename lower_alignment_helper< \
- BOOST_PP_CAT(found,I),target,T \
- >::type BOOST_PP_CAT(t,I); \
- enum { \
- BOOST_PP_CAT(found,BOOST_PP_INC(I)) \
- = lower_alignment_helper<BOOST_PP_CAT(found,I),target,T >::value \
- };
-
-#define BOOST_TT_CHOOSE_T(R,P,I,T) T BOOST_PP_CAT(t,I);
-
-template <typename T>
-struct has_one_T
-{
- T data;
-};
-
-template <std::size_t target>
-union lower_alignment
-{
- enum { found0 = false };
-
- BOOST_PP_LIST_FOR_EACH_I(
- BOOST_TT_CHOOSE_MIN_ALIGNMENT
- , ignored
- , BOOST_TT_ALIGNMENT_TYPES
- )
-};
-
-union max_align
-{
- BOOST_PP_LIST_FOR_EACH_I(
- BOOST_TT_CHOOSE_T
- , ignored
- , BOOST_TT_ALIGNMENT_TYPES
- )
-};
-
-#undef BOOST_TT_ALIGNMENT_BASE_TYPES
-#undef BOOST_TT_HAS_ONE_T
-#undef BOOST_TT_ALIGNMENT_STRUCT_TYPES
-#undef BOOST_TT_ALIGNMENT_TYPES
-#undef BOOST_TT_CHOOSE_MIN_ALIGNMENT
-#undef BOOST_TT_CHOOSE_T
-
-template<std::size_t TAlign, std::size_t Align>
-struct is_aligned
-{
- BOOST_STATIC_CONSTANT(bool,
- value = (TAlign >= Align) & (TAlign % Align == 0)
- );
-};
-
+template <std::size_t Target, bool check> struct long_double_alignment{ typedef long double type; };
+template <std::size_t Target> struct long_double_alignment<Target, false>{ typedef boost::detail::max_align type; };
-} // namespace detail
+template <std::size_t Target, bool check> struct double_alignment{ typedef double type; };
+template <std::size_t Target> struct double_alignment<Target, false>{ typedef typename long_double_alignment<Target, boost::alignment_of<long double>::value >= Target>::type type; };
-template<std::size_t Align>
-struct is_pod< ::boost::detail::lower_alignment<Align> >
-{
- BOOST_STATIC_CONSTANT(std::size_t, value = true);
-};
-
-// This alignment method originally due to Brian Parker, implemented by David
-// Abrahams, and then ported here by Doug Gregor.
-namespace detail{
+#ifndef BOOST_NO_LONG_LONG
+template <std::size_t Target, bool check> struct long_long_alignment{ typedef boost::long_long_type type; };
+template <std::size_t Target> struct long_long_alignment<Target, false>{ typedef typename double_alignment<Target, boost::alignment_of<double>::value >= Target>::type type; };
+#endif
-template <std::size_t Align>
-class type_with_alignment_imp
-{
- typedef ::boost::detail::lower_alignment<Align> t1;
- typedef typename mpl::if_c<
- ::boost::detail::is_aligned< ::boost::alignment_of<t1>::value,Align >::value
- , t1
- , ::boost::detail::max_align
- >::type align_t;
+template <std::size_t Target, bool check> struct long_alignment{ typedef long type; };
+#ifndef BOOST_NO_LONG_LONG
+template <std::size_t Target> struct long_alignment<Target, false>{ typedef typename long_long_alignment<Target, boost::alignment_of<boost::long_long_type>::value >= Target>::type type; };
+#else
+template <std::size_t Target> struct long_alignment<Target, false>{ typedef typename double_alignment<Target, boost::alignment_of<double>::value >= Target>::type type; };
+#endif
- BOOST_STATIC_CONSTANT(std::size_t, found = alignment_of<align_t>::value);
+template <std::size_t Target, bool check> struct int_alignment{ typedef int type; };
+template <std::size_t Target> struct int_alignment<Target, false>{ typedef typename long_alignment<Target, boost::alignment_of<long>::value >= Target>::type type; };
- BOOST_STATIC_ASSERT(found >= Align);
- BOOST_STATIC_ASSERT(found % Align == 0);
+template <std::size_t Target, bool check> struct short_alignment{ typedef short type; };
+template <std::size_t Target> struct short_alignment<Target, false>{ typedef typename int_alignment<Target, boost::alignment_of<int>::value >= Target>::type type; };
- public:
- typedef align_t type;
-};
+template <std::size_t Target, bool check> struct char_alignment{ typedef char type; };
+template <std::size_t Target> struct char_alignment<Target, false>{ typedef typename short_alignment<Target, boost::alignment_of<short>::value >= Target>::type type; };
}
template <std::size_t Align>
-class type_with_alignment
- : public ::boost::detail::type_with_alignment_imp<Align>
+struct type_with_alignment
{
+ typedef typename boost::detail::char_alignment<Align, boost::alignment_of<char>::value >= Align>::type type;
};
-#if defined(__GNUC__) || (defined (__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130))
+#if (defined(__GNUC__) || (defined (__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)) || defined(__clang__)) && !defined(BOOST_TT_DISABLE_INTRINSICS)
namespace tt_align_ns {
struct __attribute__((__aligned__(2))) a2 {};
struct __attribute__((__aligned__(4))) a4 {};
@@ -187,26 +95,25 @@ struct __attribute__((__aligned__(64))) a64 {};
struct __attribute__((__aligned__(128))) a128 {};
}
-template<> class type_with_alignment<1> { public: typedef char type; };
-template<> class type_with_alignment<2> { public: typedef tt_align_ns::a2 type; };
-template<> class type_with_alignment<4> { public: typedef tt_align_ns::a4 type; };
-template<> class type_with_alignment<8> { public: typedef tt_align_ns::a8 type; };
-template<> class type_with_alignment<16> { public: typedef tt_align_ns::a16 type; };
-template<> class type_with_alignment<32> { public: typedef tt_align_ns::a32 type; };
-template<> class type_with_alignment<64> { public: typedef tt_align_ns::a64 type; };
-template<> class type_with_alignment<128> { public: typedef tt_align_ns::a128 type; };
+template<> struct type_with_alignment<1> { public: typedef char type; };
+template<> struct type_with_alignment<2> { public: typedef tt_align_ns::a2 type; };
+template<> struct type_with_alignment<4> { public: typedef tt_align_ns::a4 type; };
+template<> struct type_with_alignment<8> { public: typedef tt_align_ns::a8 type; };
+template<> struct type_with_alignment<16> { public: typedef tt_align_ns::a16 type; };
+template<> struct type_with_alignment<32> { public: typedef tt_align_ns::a32 type; };
+template<> struct type_with_alignment<64> { public: typedef tt_align_ns::a64 type; };
+template<> struct type_with_alignment<128> { public: typedef tt_align_ns::a128 type; };
+
+template<> struct is_pod< ::boost::tt_align_ns::a2> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a4> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a8> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a16> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a32> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a64> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a128> : public true_type{};
-namespace detail {
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a2,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a4,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a8,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a16,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a32,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a64,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a128,true)
-}
#endif
-#if defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))
+#if (defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))) && !defined(BOOST_TT_DISABLE_INTRINSICS)
//
// MSVC supports types which have alignments greater than the normal
// maximum: these are used for example in the types __m64 and __m128
@@ -247,57 +154,56 @@ struct __declspec(align(128)) a128 {
};
}
-template<> class type_with_alignment<8>
+template<> struct type_with_alignment<8>
{
- typedef mpl::if_c<
+ typedef boost::conditional<
::boost::alignment_of<boost::detail::max_align>::value < 8,
tt_align_ns::a8,
- boost::detail::type_with_alignment_imp<8> >::type t1;
+ boost::detail::char_alignment<8, false> >::type t1;
public:
typedef t1::type type;
};
-template<> class type_with_alignment<16>
+template<> struct type_with_alignment<16>
{
- typedef mpl::if_c<
+ typedef boost::conditional<
::boost::alignment_of<boost::detail::max_align>::value < 16,
tt_align_ns::a16,
- boost::detail::type_with_alignment_imp<16> >::type t1;
+ boost::detail::char_alignment<16, false> >::type t1;
public:
typedef t1::type type;
};
-template<> class type_with_alignment<32>
+template<> struct type_with_alignment<32>
{
- typedef mpl::if_c<
+ typedef boost::conditional<
::boost::alignment_of<boost::detail::max_align>::value < 32,
tt_align_ns::a32,
- boost::detail::type_with_alignment_imp<32> >::type t1;
+ boost::detail::char_alignment<32, false> >::type t1;
public:
typedef t1::type type;
};
-template<> class type_with_alignment<64> {
- typedef mpl::if_c<
+template<> struct type_with_alignment<64> {
+ typedef boost::conditional<
::boost::alignment_of<boost::detail::max_align>::value < 64,
tt_align_ns::a64,
- boost::detail::type_with_alignment_imp<64> >::type t1;
+ boost::detail::char_alignment<64, false> >::type t1;
public:
typedef t1::type type;
};
-template<> class type_with_alignment<128> {
- typedef mpl::if_c<
+template<> struct type_with_alignment<128> {
+ typedef boost::conditional<
::boost::alignment_of<boost::detail::max_align>::value < 128,
tt_align_ns::a128,
- boost::detail::type_with_alignment_imp<128> >::type t1;
+ boost::detail::char_alignment<128, false> >::type t1;
public:
typedef t1::type type;
};
-namespace detail {
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a8,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a16,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a32,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a64,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a128,true)
-}
+template<> struct is_pod< ::boost::tt_align_ns::a8> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a16> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a32> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a64> : public true_type{};
+template<> struct is_pod< ::boost::tt_align_ns::a128> : public true_type{};
+
#endif
#else
@@ -321,13 +227,13 @@ namespace detail {
typedef ::boost::tt_align_ns::a16 max_align;
+}
//#if ! BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a2,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a4,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a8,true)
-BOOST_TT_AUX_BOOL_TRAIT_IMPL_SPEC1(is_pod,::boost::tt_align_ns::a16,true)
+template <> struct is_pod< ::boost::tt_align_ns::a2> : public true_type{};
+template <> struct is_pod< ::boost::tt_align_ns::a4> : public true_type{};
+template <> struct is_pod< ::boost::tt_align_ns::a8> : public true_type{};
+template <> struct is_pod< ::boost::tt_align_ns::a16> : public true_type{};
//#endif
-}
template <std::size_t N> struct type_with_alignment
{
@@ -350,8 +256,6 @@ template <> struct type_with_alignment<16>{ typedef tt_align_ns::a16 type; };
# pragma warning(pop)
#endif
-#include <boost/type_traits/detail/bool_trait_undef.hpp>
-
#endif // BOOST_TT_TYPE_WITH_ALIGNMENT_INCLUDED
diff --git a/boost/utility/declval.hpp b/boost/utility/declval.hpp
index a4ab2c8cb4..229e9a34a5 100644
--- a/boost/utility/declval.hpp
+++ b/boost/utility/declval.hpp
@@ -8,37 +8,6 @@
#ifndef BOOST_UTILITY_DECLVAL_HPP
#define BOOST_UTILITY_DECLVAL_HPP
-#include <boost/config.hpp>
-
-//----------------------------------------------------------------------------//
-
-#include <boost/type_traits/add_rvalue_reference.hpp>
-
-//----------------------------------------------------------------------------//
-// //
-// C++03 implementation of //
-// 20.2.4 Function template declval [declval] //
-// Written by Vicente J. Botet Escriba //
-// //
-// 1 The library provides the function template declval to simplify the
-// definition of expressions which occur as unevaluated operands.
-// 2 Remarks: If this function is used, the program is ill-formed.
-// 3 Remarks: The template parameter T of declval may be an incomplete type.
-// [ Example:
-//
-// template <class To, class From>
-// decltype(static_cast<To>(declval<From>())) convert(From&&);
-//
-// declares a function template convert which only participates in overloading
-// if the type From can be explicitly converted to type To. For another example
-// see class template common_type (20.9.7.6). -end example ]
-//----------------------------------------------------------------------------//
-
-namespace boost {
-
- template <typename T>
- typename add_rvalue_reference<T>::type declval() BOOST_NOEXCEPT; // as unevaluated operand
-
-} // namespace boost
+#include <boost/type_traits/declval.hpp>
#endif // BOOST_UTILITY_DECLVAL_HPP
diff --git a/boost/utility/string_ref.hpp b/boost/utility/string_ref.hpp
index 90185135a8..8707157c62 100644
--- a/boost/utility/string_ref.hpp
+++ b/boost/utility/string_ref.hpp
@@ -1,5 +1,5 @@
/*
- Copyright (c) Marshall Clow 2012-2012.
+ Copyright (c) Marshall Clow 2012-2015.
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -82,12 +82,12 @@ namespace boost {
#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS
template<typename Allocator>
explicit operator std::basic_string<charT, traits, Allocator>() const {
- return std::basic_string<charT, traits, Allocator> ( ptr_, len_ );
+ return std::basic_string<charT, traits, Allocator> ( begin(), end());
}
#endif
std::basic_string<charT, traits> to_string () const {
- return std::basic_string<charT, traits> ( ptr_, len_ );
+ return std::basic_string<charT, traits> ( begin(), end());
}
// iterators
diff --git a/boost/uuid/detail/config.hpp b/boost/uuid/detail/config.hpp
index 997f882131..602d4ab6af 100644
--- a/boost/uuid/detail/config.hpp
+++ b/boost/uuid/detail/config.hpp
@@ -36,15 +36,23 @@
#define BOOST_UUID_USE_SSE41
#endif
-#elif defined(_MSC_VER) && (defined(_M_X64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))
+#elif defined(_MSC_VER)
-#ifndef BOOST_UUID_USE_SSE2
+#if (defined(_M_X64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2)) && !defined(BOOST_UUID_USE_SSE2)
#define BOOST_UUID_USE_SSE2
#endif
-#elif !defined(BOOST_UUID_USE_SSE41) && !defined(BOOST_UUID_USE_SSE3) && !defined(BOOST_UUID_USE_SSE2)
-
-#define BOOST_UUID_NO_SIMD
+#if defined(__AVX__)
+#if !defined(BOOST_UUID_USE_SSE41)
+#define BOOST_UUID_USE_SSE41
+#endif
+#if !defined(BOOST_UUID_USE_SSE3)
+#define BOOST_UUID_USE_SSE3
+#endif
+#if !defined(BOOST_UUID_USE_SSE2)
+#define BOOST_UUID_USE_SSE2
+#endif
+#endif
#endif
@@ -57,6 +65,10 @@
#define BOOST_UUID_USE_SSE2
#endif
+#if !defined(BOOST_UUID_NO_SIMD) && !defined(BOOST_UUID_USE_SSE41) && !defined(BOOST_UUID_USE_SSE3) && !defined(BOOST_UUID_USE_SSE2)
+#define BOOST_UUID_NO_SIMD
+#endif
+
#endif // !defined(BOOST_UUID_NO_SIMD)
#endif // BOOST_UUID_DETAIL_CONFIG_HPP_INCLUDED_
diff --git a/boost/uuid/detail/uuid_x86.hpp b/boost/uuid/detail/uuid_x86.hpp
index 5b573aac15..5c736708e6 100644
--- a/boost/uuid/detail/uuid_x86.hpp
+++ b/boost/uuid/detail/uuid_x86.hpp
@@ -22,6 +22,23 @@
#include <emmintrin.h>
#endif
+#if defined(BOOST_MSVC) && defined(_M_X64) && !defined(BOOST_UUID_USE_SSE3) && (BOOST_MSVC < 1900 /* Fixed in Visual Studio 2015 */ )
+// At least MSVC 9 (VS2008) and 12 (VS2013) have an optimizer bug that sometimes results in incorrect SIMD code
+// generated in Release x64 mode. In particular, it affects operator==, where the compiler sometimes generates
+// pcmpeqd with a memory opereand instead of movdqu followed by pcmpeqd. The problem is that uuid can be
+// not aligned to 16 bytes and pcmpeqd causes alignment violation in this case. We cannot be sure that other
+// MSVC versions are not affected so we apply the workaround for all versions, except VS2015 on up where
+// the bug has been fixed.
+//
+// https://svn.boost.org/trac/boost/ticket/8509#comment:3
+// https://connect.microsoft.com/VisualStudio/feedbackdetail/view/981648#tabs
+#define BOOST_UUID_DETAIL_MSVC_BUG981648
+#if BOOST_MSVC >= 1600
+extern "C" void _ReadWriteBarrier(void);
+#pragma intrinsic(_ReadWriteBarrier)
+#endif
+#endif
+
namespace boost {
namespace uuids {
namespace detail {
@@ -30,8 +47,16 @@ BOOST_FORCEINLINE __m128i load_unaligned_si128(const uint8_t* p) BOOST_NOEXCEPT
{
#if defined(BOOST_UUID_USE_SSE3)
return _mm_lddqu_si128(reinterpret_cast< const __m128i* >(p));
-#else
+#elif !defined(BOOST_UUID_DETAIL_MSVC_BUG981648)
return _mm_loadu_si128(reinterpret_cast< const __m128i* >(p));
+#elif BOOST_MSVC >= 1600
+ __m128i mm = _mm_loadu_si128(reinterpret_cast< const __m128i* >(p));
+ // Make sure this load doesn't get merged with the subsequent instructions
+ _ReadWriteBarrier();
+ return mm;
+#else
+ // VS2008 x64 doesn't respect _ReadWriteBarrier above, so we have to generate this crippled code to load unaligned data
+ return _mm_unpacklo_epi64(_mm_loadl_epi64(reinterpret_cast< const __m128i* >(p)), _mm_loadl_epi64(reinterpret_cast< const __m128i* >(p + 8)));
#endif
}
@@ -62,8 +87,9 @@ inline bool operator== (uuid const& lhs, uuid const& rhs) BOOST_NOEXCEPT
__m128i mm_right = uuids::detail::load_unaligned_si128(rhs.data);
__m128i mm_cmp = _mm_cmpeq_epi32(mm_left, mm_right);
+
#if defined(BOOST_UUID_USE_SSE41)
- return _mm_test_all_ones(mm_cmp);
+ return _mm_test_all_ones(mm_cmp) != 0;
#else
return _mm_movemask_epi8(mm_cmp) == 0xFFFF;
#endif
diff --git a/boost/uuid/seed_rng.hpp b/boost/uuid/seed_rng.hpp
index 877e4ebb20..5299b04821 100644
--- a/boost/uuid/seed_rng.hpp
+++ b/boost/uuid/seed_rng.hpp
@@ -40,11 +40,14 @@
#if defined(_MSC_VER)
# pragma warning(push) // Save warning settings.
# pragma warning(disable : 4996) // Disable deprecated std::fopen
+# pragma comment(lib, "advapi32.lib")
+#endif
+
+#if defined(BOOST_WINDOWS)
# include <boost/detail/winapi/crypt.hpp> // for CryptAcquireContextA, CryptGenRandom, CryptReleaseContext
# include <boost/detail/winapi/timers.hpp>
# include <boost/detail/winapi/process.hpp>
# include <boost/detail/winapi/thread.hpp>
-# pragma comment(lib, "advapi32.lib")
#else
# include <sys/time.h> // for gettimeofday
# include <sys/types.h> // for pid_t
diff --git a/boost/variant/detail/bool_trait_def.hpp b/boost/variant/detail/bool_trait_def.hpp
deleted file mode 100644
index 823a79a122..0000000000
--- a/boost/variant/detail/bool_trait_def.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-//-----------------------------------------------------------------------------
-// boost/variant/detail/bool_trait_def.hpp header file
-// See http://www.boost.org for updates, documentation, and revision history.
-//-----------------------------------------------------------------------------
-//
-// Copyright (c) 2003
-// Eric Friedman
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// Needed until move-related traits incorporated into type_traits library.
-// no include guards, the header is intended for multiple inclusion!
-
-// should be the last #include
-#include "boost/type_traits/detail/bool_trait_def.hpp"
-
-#define BOOST_VARIANT_TT_AUX_BOOL_TRAIT_DEF1(trait,T,C) \
-template< typename T > struct trait \
- BOOST_TT_AUX_BOOL_C_BASE(C) \
-{ \
- BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(C) \
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,trait,(T)) \
-}; \
-/**/
-
-#define BOOST_VARIANT_TT_AUX_TRAIT_SUFFIX(arity, name) \
-BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(arity, name) \
-/**/
diff --git a/boost/variant/detail/bool_trait_undef.hpp b/boost/variant/detail/bool_trait_undef.hpp
deleted file mode 100644
index 9b8fb541c1..0000000000
--- a/boost/variant/detail/bool_trait_undef.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-//-----------------------------------------------------------------------------
-// boost/variant/detail/bool_trait_undef.hpp header file
-// See http://www.boost.org for updates, documentation, and revision history.
-//-----------------------------------------------------------------------------
-//
-// Copyright (c) 2003
-// Eric Friedman
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-
-// Needed until move-related traits incorporated into type_traits library.
-// no include guards, the header is intended for multiple inclusion!
-
-// should be the last #include
-#include "boost/type_traits/detail/bool_trait_undef.hpp"
-
-
-#undef BOOST_VARIANT_TT_AUX_BOOL_TRAIT_DEF1
-#undef BOOST_VARIANT_TT_AUX_TRAIT_SUFFIX
diff --git a/boost/variant/variant.hpp b/boost/variant/variant.hpp
index c4857edb26..fa09eb5641 100644
--- a/boost/variant/variant.hpp
+++ b/boost/variant/variant.hpp
@@ -1352,7 +1352,10 @@ public: // structors
destroy_content();
}
- variant() BOOST_NOEXCEPT_IF(boost::has_nothrow_constructor<internal_T0>::value)
+ variant()
+#if !(defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x5130))
+ BOOST_NOEXCEPT_IF(boost::has_nothrow_constructor<internal_T0>::value)
+#endif
{
#ifdef _MSC_VER
#pragma warning( push )
diff --git a/boost/version.hpp b/boost/version.hpp
index 7b64aedb1b..fce02ec7ba 100644
--- a/boost/version.hpp
+++ b/boost/version.hpp
@@ -19,7 +19,7 @@
// BOOST_VERSION / 100 % 1000 is the minor version
// BOOST_VERSION / 100000 is the major version
-#define BOOST_VERSION 105900
+#define BOOST_VERSION 106000
//
// BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
@@ -27,6 +27,6 @@
// number, y is the minor version number, and z is the patch level if not 0.
// This is used by <config/auto_link.hpp> to select which library version to link to.
-#define BOOST_LIB_VERSION "1_59"
+#define BOOST_LIB_VERSION "1_60"
#endif
diff --git a/boost/vmd/array.hpp b/boost/vmd/array.hpp
new file mode 100644
index 0000000000..c629b1c1b5
--- /dev/null
+++ b/boost/vmd/array.hpp
@@ -0,0 +1,18 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ARRAY_HPP)
+#define BOOST_VMD_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/array/to_seq.hpp>
+#include <boost/vmd/array/to_tuple.hpp>
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ARRAY_HPP */
diff --git a/boost/vmd/array/to_seq.hpp b/boost/vmd/array/to_seq.hpp
new file mode 100644
index 0000000000..e8d0aad2b5
--- /dev/null
+++ b/boost/vmd/array/to_seq.hpp
@@ -0,0 +1,49 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ARRAY_TO_SEQ_HPP)
+#define BOOST_VMD_ARRAY_TO_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/array/to_seq.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty_array.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ARRAY_TO_SEQ(array)
+
+ \brief converts an array to a seq.
+
+ array = array to be converted.
+
+ If the array is an array of 0 elements it is converted to an empty seq.
+ Otherwise the array is converted to a seq with the same number of elements as the array.
+*/
+
+#define BOOST_VMD_ARRAY_TO_SEQ(array) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY_ARRAY(array), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_ARRAY_TO_SEQ \
+ ) \
+ (array) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ARRAY_TO_SEQ_HPP */
diff --git a/boost/vmd/array/to_tuple.hpp b/boost/vmd/array/to_tuple.hpp
new file mode 100644
index 0000000000..a959a849cc
--- /dev/null
+++ b/boost/vmd/array/to_tuple.hpp
@@ -0,0 +1,49 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ARRAY_TO_TUPLE_HPP)
+#define BOOST_VMD_ARRAY_TO_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/array/to_tuple.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty_array.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ARRAY_TO_TUPLE(array)
+
+ \brief converts an array to a tuple.
+
+ array = array to be converted.
+
+ If the array is an array of 0 elements it is converted to an empty tuple.
+ Otherwise the array is converted to a tuple with the same number of elements as the array.
+*/
+
+#define BOOST_VMD_ARRAY_TO_TUPLE(array) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY_ARRAY(array), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_ARRAY_TO_TUPLE \
+ ) \
+ (array) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ARRAY_TO_TUPLE_HPP */
diff --git a/boost/vmd/assert.hpp b/boost/vmd/assert.hpp
new file mode 100644
index 0000000000..974fd6d0a9
--- /dev/null
+++ b/boost/vmd/assert.hpp
@@ -0,0 +1,58 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_HPP)
+#define BOOST_VMD_ASSERT_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/assert.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT(...)
+
+ \brief Conditionally causes an error to be generated.
+
+ ... = variadic parameters, maximum of 2 will be considered.
+ Any variadic parameters beyond the maximum of 2 are just ignored.
+
+ The first variadic parameter is:
+
+ cond = A condition that determines whether an assertion occurs. Valid values range from 0 to BOOST_PP_LIMIT_MAG.
+
+ The second variadic parameter (optional) is:
+
+ errstr = An error string for generating a compiler error when using the VC++ compiler.
+ The VC++ compiler is incapable of producing a preprocessor error so when the 'cond'
+ is 0, a compiler error is generated by outputting C++ code in the form of:
+
+ typedef char errstr[-1];
+
+ The errstr defaults to BOOST_VMD_ASSERT_ERROR if not supplied.
+ It is only relevant for VC++.
+
+ returns = If cond expands to 0, this macro causes an error. Otherwise, it expands to nothing.
+ For all compilers other than Visual C++ the error is a preprocessing error.
+ For Visual C++ the error is caused by output invalid C++: this error could be
+ masked if the invalid output is ignored by a macro which invokes this macro.
+
+*/
+# define BOOST_VMD_ASSERT(...) \
+ BOOST_VMD_DETAIL_ASSERT(__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_HPP */
diff --git a/boost/vmd/assert_is_array.hpp b/boost/vmd/assert_is_array.hpp
new file mode 100644
index 0000000000..2bb7745983
--- /dev/null
+++ b/boost/vmd/assert_is_array.hpp
@@ -0,0 +1,113 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_ARRAY_HPP)
+#define BOOST_VMD_ASSERT_IS_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_ARRAY(sequence)
+
+ \brief Asserts that the sequence is a Boost PP array.
+
+ The macro checks that the sequence is a Boost PP array.
+ If it is not a Boost PP array, it forces a compiler error.
+
+ The macro normally checks for a Boost PP array only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ sequence = a possible Boost PP array.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP array, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP array the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ Boost PP array.
+
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_ARRAY_D(d,sequence)
+
+ \brief Asserts that the sequence is a Boost PP array. Re-entrant version.
+
+ The macro checks that the sequence is a Boost PP array.
+ If it is not a Boost PP array, it forces a compiler error.
+
+ The macro normally checks for a Boost PP array only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible Boost PP sequence.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP array, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP array the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ Boost PP array.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_ARRAY(sequence)
+#define BOOST_VMD_ASSERT_IS_ARRAY_D(d,sequence)
+
+#else
+
+#include <boost/vmd/is_array.hpp>
+#include <boost/vmd/assert.hpp>
+
+#define BOOST_VMD_ASSERT_IS_ARRAY(sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_ARRAY(sequence), \
+ BOOST_VMD_IS_ARRAY_ASSERT_ERROR \
+ ) \
+/**/
+
+#define BOOST_VMD_ASSERT_IS_ARRAY_D(d,sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_ARRAY_D(d,sequence), \
+ BOOST_VMD_IS_ARRAY_ASSERT_ERROR \
+ ) \
+/**/
+
+#endif /* !BOOST_VMD_ASSERT_DATA */
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_ARRAY_HPP */
diff --git a/boost/vmd/assert_is_empty.hpp b/boost/vmd/assert_is_empty.hpp
new file mode 100644
index 0000000000..712f67fac6
--- /dev/null
+++ b/boost/vmd/assert_is_empty.hpp
@@ -0,0 +1,105 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_EMPTY_HPP)
+#define BOOST_VMD_ASSERT_IS_EMPTY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#if BOOST_VMD_ASSERT_DATA
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+#endif
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_EMPTY(...)
+
+ \brief Asserts that the input is empty.
+
+ The macro checks to see if the input is empty or not.
+ If it is not empty, it forces a compiler error.
+
+ The macro is a variadic macro taking any input.
+ For the VC++8 compiler (VS2005) the macro takes a single parameter of input to check and not variadic data.
+
+ The macro normally checks for emptiness only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ .... = variadic input, for VC++8 this must be a single parameter.
+
+ returns = Normally the macro returns nothing.
+
+ If the input is empty, nothing is output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the input is not empty the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the input is not empty.
+
+ It is recommended to append BOOST_PP_EMPTY() to whatever input
+ is being tested in order to avoid possible warning messages
+ from some compilers about no parameters being passed to the macro
+ when the input is truly empty.
+
+*/
+
+#if BOOST_VMD_MSVC_V8
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_EMPTY(input)
+
+#else
+
+#define BOOST_VMD_ASSERT_IS_EMPTY(input) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_EMPTY(input), \
+ BOOST_VMD_IS_EMPTY_ASSERT_ERROR \
+ ) \
+/**/
+
+#endif // !BOOST_VMD_ASSERT_DATA
+
+#else
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_EMPTY(...)
+
+#else
+
+#define BOOST_VMD_ASSERT_IS_EMPTY(...) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_EMPTY(__VA_ARGS__), \
+ BOOST_VMD_IS_EMPTY_ASSERT_ERROR \
+ ) \
+/**/
+
+#endif // !BOOST_VMD_ASSERT_DATA
+
+#endif /* BOOST_VMD_MSVC_V8 */
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_EMPTY_HPP */
diff --git a/boost/vmd/assert_is_identifier.hpp b/boost/vmd/assert_is_identifier.hpp
new file mode 100644
index 0000000000..88211375eb
--- /dev/null
+++ b/boost/vmd/assert_is_identifier.hpp
@@ -0,0 +1,158 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_IDENTIFIER_HPP)
+#define BOOST_VMD_ASSERT_IS_IDENTIFIER_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_IDENTIFIER(...)
+
+ \brief Asserts that the sequence is an identifier.
+
+ The macro checks that the sequence is an identifier.
+ If it is not an identifier, it forces a compiler error.
+
+ The macro normally checks for an identifier only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ ... = variadic parameters
+
+ The variadic parameters are:
+
+ sequence = A sequence to test as an identifier.
+ ids (optional) = The data may take one of two forms:
+ it is either one or more single identifiers
+ or a single Boost PP tuple of identifiers.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is an identifier, nothing is
+ output. If optional ids are specified, for the
+ sequence to be an identifier it must be an
+ identifier that matches one of the optional
+ ids.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not an identifier the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not an
+ identifier.
+
+ Identifiers are registered in VMD with:
+
+ #define BOOST_VMD_REG_XXX (XXX) where XXX is a v-identifier.
+
+ The identifier must be registered to be found.
+
+ Identifiers are pre-detected in VMD with:
+
+ #define BOOST_VMD_DETECT_XXX_XXX where XXX is an identifier.
+
+ If you specify optional ids and have not specified the detection
+ of an optional id, that id will never match an identifier.
+
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_IDENTIFIER_D(d,...)
+
+ \brief Asserts that the sequence is an identifier. Re-entrant version.
+
+ The macro checks that the sequence is an identifier.
+ If it is not an identifier, it forces a compiler error.
+
+ The macro normally checks for an identifier only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = variadic parameters
+
+ The variadic parameters are:
+
+ sequence = A sequence to test as an identifier.
+ ids (optional) = The data may take one of two forms:
+ it is either one or more single identifiers
+ or a single Boost PP tuple of identifiers.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is an identifier, nothing is
+ output. If optional ids are specified, for the
+ sequence to be an identifier it must be an
+ identifier that matches one of the optional
+ ids.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not an identifier the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not an
+ identifier.
+
+ Identifiers are registered in VMD with:
+
+ #define BOOST_VMD_REG_XXX (XXX) where XXX is a v-identifier.
+
+ The identifier must be registered to be found.
+
+ Identifiers are pre-detected in VMD with:
+
+ #define BOOST_VMD_DETECT_XXX_XXX where XXX is an identifier.
+
+ If you specify optional ids and have not specified the detection
+ of an optional id, that id will never match an identifier.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_IDENTIFIER(...)
+#define BOOST_VMD_ASSERT_IS_IDENTIFIER_D(d,...)
+
+#else
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_identifier.hpp>
+
+#define BOOST_VMD_ASSERT_IS_IDENTIFIER(...) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_IDENTIFIER(__VA_ARGS__), \
+ BOOST_VMD_IDENTIFIER_ASSERT_ERROR \
+ ) \
+/**/
+
+#define BOOST_VMD_ASSERT_IS_IDENTIFIER_D(d,...) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_IDENTIFIER_D(d,__VA_ARGS__), \
+ BOOST_VMD_IDENTIFIER_ASSERT_ERROR \
+ ) \
+/**/
+
+#endif // !BOOST_VMD_ASSERT_DATA
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_IDENTIFIER_HPP */
diff --git a/boost/vmd/assert_is_list.hpp b/boost/vmd/assert_is_list.hpp
new file mode 100644
index 0000000000..6c1b5eaa06
--- /dev/null
+++ b/boost/vmd/assert_is_list.hpp
@@ -0,0 +1,113 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_LIST_HPP)
+#define BOOST_VMD_ASSERT_IS_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_LIST(sequence)
+
+ \brief Asserts that the sequence is a Boost PP list.
+
+ The macro checks that the sequence is a Boost PP list.
+ If it is not a Boost PP list, it forces a compiler error.
+
+ The macro normally checks for a Boost PP list only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ sequence = a possible Boost PP list.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP list, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP list the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the parameter is not a
+ Boost PP list.
+
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_LIST_D(d,sequence)
+
+ \brief Asserts that the sequence is a Boost PP list. Re-entrant version.
+
+ The macro checks that the sequence is a Boost PP list.
+ If it is not a Boost PP list, it forces a compiler error.
+
+ The macro normally checks for a Boost PP list only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible Boost PP list.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP list, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP list the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the parameter is not a
+ Boost PP list.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_LIST(sequence)
+#define BOOST_VMD_ASSERT_IS_LIST_D(d,sequence)
+
+#else
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_list.hpp>
+
+#define BOOST_VMD_ASSERT_IS_LIST(sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_LIST(sequence), \
+ BOOST_VMD_ASSERT_IS_LIST_ERROR \
+ ) \
+/**/
+
+#define BOOST_VMD_ASSERT_IS_LIST_D(d,sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_LIST_D(d,sequence), \
+ BOOST_VMD_ASSERT_IS_LIST_ERROR \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_ASSERT_DATA */
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_LIST_HPP */
diff --git a/boost/vmd/assert_is_number.hpp b/boost/vmd/assert_is_number.hpp
new file mode 100644
index 0000000000..e4eb717d84
--- /dev/null
+++ b/boost/vmd/assert_is_number.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_NUMBER_HPP)
+#define BOOST_VMD_ASSERT_IS_NUMBER_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_NUMBER(sequence)
+
+ \brief Asserts that the sequence is a number.
+
+ The macro checks that the parameter is a number.
+ If it is not a number, it forces a compiler error.
+
+ The macro normally checks for a number only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ sequence = a possible number.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a number, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a number the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ number.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_NUMBER(sequence)
+
+#else
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_number.hpp>
+
+#define BOOST_VMD_ASSERT_IS_NUMBER(sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_NUMBER(sequence), \
+ BOOST_VMD_IS_NUMBER_ASSERT_ERROR \
+ ) \
+/**/
+
+#endif // !BOOST_VMD_ASSERT_DATA
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_NUMBER_HPP */
diff --git a/boost/vmd/assert_is_seq.hpp b/boost/vmd/assert_is_seq.hpp
new file mode 100644
index 0000000000..ba1ce2bd3c
--- /dev/null
+++ b/boost/vmd/assert_is_seq.hpp
@@ -0,0 +1,113 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_SEQ_HPP)
+#define BOOST_VMD_ASSERT_IS_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_SEQ(sequence)
+
+ \brief Asserts that the sequence is a Boost PP seq.
+
+ The macro checks that the sequence is a Boost PP seq.
+ If it is not a Boost PP seq, it forces a compiler error.
+
+ The macro normally checks for a Boost PP seq only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ sequence = a possible Boost PP seq.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP seq, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP seq the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ Boost PP seq.
+
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_SEQ_D(d,sequence)
+
+ \brief Asserts that the sequence is a Boost PP seq. Re-entrant version.
+
+ The macro checks that the sequence is a Boost PP seq.
+ If it is not a Boost PP seq, it forces a compiler error.
+
+ The macro normally checks for a Boost PP seq only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible Boost PP seq.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP seq, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP seq the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ Boost PP seq.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_SEQ(sequence)
+#define BOOST_VMD_ASSERT_IS_SEQ_D(d,sequence)
+
+#else
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_seq.hpp>
+
+#define BOOST_VMD_ASSERT_IS_SEQ(sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_SEQ(sequence), \
+ BOOST_VMD_ASSERT_IS_SEQ_ERROR \
+ ) \
+/**/
+
+#define BOOST_VMD_ASSERT_IS_SEQ_D(d,sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_SEQ_D(d,sequence), \
+ BOOST_VMD_ASSERT_IS_SEQ_ERROR \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_ASSERT_DATA */
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_SEQ_HPP */
diff --git a/boost/vmd/assert_is_tuple.hpp b/boost/vmd/assert_is_tuple.hpp
new file mode 100644
index 0000000000..18a9f145db
--- /dev/null
+++ b/boost/vmd/assert_is_tuple.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_TUPLE_HPP)
+#define BOOST_VMD_ASSERT_IS_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_TUPLE(sequence)
+
+ \brief Asserts that the sequence is a Boost PP tuple.
+
+ The macro checks that the sequence is a Boost PP tuple.
+ If it is not a Boost PP tuple, it forces a compiler error.
+
+ The macro normally checks for a Boost PP tuple only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ sequence = a possible Boost PP tuple.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a Boost PP tuple, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a Boost PP tuple the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ Boost PP tuple.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_TUPLE(sequence)
+
+#else
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_tuple.hpp>
+
+#define BOOST_VMD_ASSERT_IS_TUPLE(sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_TUPLE(sequence), \
+ BOOST_VMD_ASSERT_IS_TUPLE_ERROR \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_ASSERT_DATA */
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_TUPLE_HPP */
diff --git a/boost/vmd/assert_is_type.hpp b/boost/vmd/assert_is_type.hpp
new file mode 100644
index 0000000000..5bf86d1cac
--- /dev/null
+++ b/boost/vmd/assert_is_type.hpp
@@ -0,0 +1,113 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ASSERT_IS_TYPE_HPP)
+#define BOOST_VMD_ASSERT_IS_TYPE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_TYPE(sequence)
+
+ \brief Asserts that the sequence is a VMD type.
+
+ The macro checks that the sequence is a VMD type.
+ If it is not a VMD type, it forces a compiler error.
+
+ The macro normally checks for a VMD type only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ sequence = a possible VMD type.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a VMD type, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a VMD type the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ VMD type.
+
+*/
+
+/** \def BOOST_VMD_ASSERT_IS_TYPE_D(d,sequence)
+
+ \brief Asserts that the sequence is a VMD type. Re-entrant version.
+
+ The macro checks that the sequence is a VMD type.
+ If it is not a VMD type, it forces a compiler error.
+
+ The macro normally checks for a VMD type only in
+ debug mode. However an end-user can force the macro
+ to check or not check by defining the macro
+ BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible VMD type.
+
+ returns = Normally the macro returns nothing.
+
+ If the sequence is a VMD type, nothing is
+ output.
+
+ For VC++, because there is no sure way of forcing
+ a compiler error from within a macro without producing
+ output, if the sequence is not a VMD type the
+ macro forces a compiler error by outputting invalid C++.
+
+ For all other compilers a compiler error is forced
+ without producing output if the sequence is not a
+ VMD type.
+
+*/
+
+#if !BOOST_VMD_ASSERT_DATA
+
+#define BOOST_VMD_ASSERT_IS_TYPE(sequence)
+#define BOOST_VMD_ASSERT_IS_TYPE_D(d,sequence)
+
+#else
+
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/is_type.hpp>
+
+#define BOOST_VMD_ASSERT_IS_TYPE(sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_TYPE(sequence), \
+ BOOST_VMD_IS_TYPE_ASSERT_ERROR \
+ ) \
+/**/
+
+#define BOOST_VMD_ASSERT_IS_TYPE_D(d,sequence) \
+ BOOST_VMD_ASSERT \
+ ( \
+ BOOST_VMD_IS_TYPE_D(d,sequence), \
+ BOOST_VMD_IS_TYPE_ASSERT_ERROR \
+ ) \
+/**/
+
+#endif // !BOOST_VMD_ASSERT_DATA
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ASSERT_IS_TYPE_HPP */
diff --git a/boost/vmd/detail/adjust_tuple_type.hpp b/boost/vmd/detail/adjust_tuple_type.hpp
new file mode 100644
index 0000000000..6523b1a6fa
--- /dev/null
+++ b/boost/vmd/detail/adjust_tuple_type.hpp
@@ -0,0 +1,97 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP)
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+#include <boost/vmd/detail/is_array_common.hpp>
+#include <boost/vmd/detail/is_list.hpp>
+#include <boost/vmd/detail/type_registration.hpp>
+
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY(data,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(data), \
+ BOOST_VMD_TYPE_ARRAY, \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY_D(d,data,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,data), \
+ BOOST_VMD_TYPE_ARRAY, \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST(data,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_WLOOP(data), \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY \
+ ) \
+ (data,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST_D(d,data,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_WLOOP_D(d,data), \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY_D \
+ ) \
+ (d,data,type) \
+ ) \
+/**/
+
+/*
+
+ Input is any VMD data and a VMD type for that data
+
+ If the type is a tuple, checks to see if it is a more specific
+ type and, if it is, returns that type,
+ otherwise returns the type passed as a parameter
+
+*/
+
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(data,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,type), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST, \
+ BOOST_VMD_IDENTITY(type) \
+ ) \
+ (data,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,data,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,type), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST_D, \
+ BOOST_VMD_IDENTITY(type) \
+ ) \
+ (d,data,type) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP */
diff --git a/boost/vmd/detail/array.hpp b/boost/vmd/detail/array.hpp
new file mode 100644
index 0000000000..cedc253d2b
--- /dev/null
+++ b/boost/vmd/detail/array.hpp
@@ -0,0 +1,189 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_ARRAY_HPP)
+#define BOOST_VMD_DETAIL_ARRAY_HPP
+
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/empty_result.hpp>
+#include <boost/vmd/detail/is_array_common.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/tuple.hpp>
+
+#define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ BOOST_VMD_IDENTITY(tuple), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ BOOST_VMD_IDENTITY(tuple), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_PROCESS(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY \
+ ) \
+ (tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_PROCESS_D(d,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D \
+ ) \
+ (d,tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_SPLIT(param) \
+ BOOST_VMD_DETAIL_ARRAY_PROCESS \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE(param,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_SPLIT_D(d,param) \
+ BOOST_VMD_DETAIL_ARRAY_PROCESS_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_TUPLE_D(d,param,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY(tuple) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple), \
+ tuple \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D(d,tuple) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple), \
+ tuple \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY \
+ ) \
+ (tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D(d,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D \
+ ) \
+ (d,tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_BEGIN(param) \
+ BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE(param) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_BEGIN_D(d,param) \
+ BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_TUPLE_D(d,param) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_ARRAY_SPLIT, \
+ BOOST_VMD_DETAIL_ARRAY_BEGIN \
+ ) \
+ (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_ARRAY_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_ARRAY_SPLIT_D, \
+ BOOST_VMD_DETAIL_ARRAY_BEGIN_D \
+ ) \
+ (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_ARRAY_HPP */
diff --git a/boost/vmd/detail/assert.hpp b/boost/vmd/detail/assert.hpp
new file mode 100644
index 0000000000..c772c720fd
--- /dev/null
+++ b/boost/vmd/detail/assert.hpp
@@ -0,0 +1,69 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_ASSERT_HPP)
+#define BOOST_VMD_DETAIL_ASSERT_HPP
+
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+
+#if BOOST_VMD_MSVC
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/variadic/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+#define BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_OUTPUT(errstr) \
+ BOOST_PP_ASSERT(0) \
+ typedef char errstr[-1]; \
+/**/
+
+#define BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_DEFAULT(...) \
+ BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_OUTPUT(BOOST_VMD_ASSERT_ERROR) \
+/**/
+
+#define BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_ERRSTR(...) \
+ BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_OUTPUT(BOOST_PP_VARIADIC_ELEM(1,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_ASSERT_TRUE(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL \
+ ( \
+ BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
+ 1 \
+ ), \
+ BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_DEFAULT, \
+ BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_ERRSTR \
+ ) \
+ (__VA_ARGS__) \
+/**/
+
+#define BOOST_VMD_DETAIL_ASSERT(...) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_ASSERT_TRUE \
+ ) \
+ (__VA_ARGS__) \
+/**/
+
+#else
+
+#define BOOST_VMD_DETAIL_ASSERT_DO(cond) \
+ BOOST_PP_ASSERT(cond) \
+/**/
+
+#define BOOST_VMD_DETAIL_ASSERT(...) \
+ BOOST_VMD_DETAIL_ASSERT_DO(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_MSVC */
+#endif /* BOOST_VMD_DETAIL_ASSERT_HPP */
diff --git a/boost/vmd/detail/data_equal.hpp b/boost/vmd/detail/data_equal.hpp
new file mode 100644
index 0000000000..f7b07cb4dc
--- /dev/null
+++ b/boost/vmd/detail/data_equal.hpp
@@ -0,0 +1,202 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_1.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_2.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_3.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_4.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_5.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_6.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_7.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_8.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_9.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_10.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_11.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_12.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_13.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_14.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_15.hpp>
+#include <boost/vmd/detail/recurse/data_equal/data_equal_16.hpp>
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_HPP */
diff --git a/boost/vmd/detail/data_equal_common.hpp b/boost/vmd/detail/data_equal_common.hpp
new file mode 100644
index 0000000000..edd8a4487b
--- /dev/null
+++ b/boost/vmd/detail/data_equal_common.hpp
@@ -0,0 +1,409 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_COMMON_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_COMMON_HPP
+
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/list/at.hpp>
+#include <boost/preprocessor/list/size.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/pop_front.hpp>
+#include <boost/preprocessor/tuple/push_back.hpp>
+#include <boost/preprocessor/tuple/replace.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/get_type.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(vseq1,vseq2) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq1), \
+ BOOST_PP_IS_BEGIN_PARENS(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_ARRAY(d,index,data) \
+ BOOST_PP_ARRAY_ELEM(index,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_LIST(d,index,data) \
+ BOOST_PP_LIST_AT_D(d,data,index) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_SEQ(d,index,data) \
+ BOOST_PP_SEQ_ELEM(index,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_TUPLE(d,index,data) \
+ BOOST_PP_TUPLE_ELEM(index,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY(data) \
+ BOOST_PP_ARRAY_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST(data) \
+ BOOST_PP_LIST_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ(data) \
+ BOOST_PP_SEQ_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE(data) \
+ BOOST_PP_TUPLE_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY_D(d,data) \
+ BOOST_PP_ARRAY_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST_D(d,data) \
+ BOOST_PP_LIST_SIZE_D(d,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ_D(d,data) \
+ BOOST_PP_SEQ_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE_D(d,data) \
+ BOOST_PP_TUPLE_SIZE(data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM(d,index,data,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_ARRAY, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_LIST, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_SEQ, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_TUPLE \
+ ) \
+ ) \
+ ) \
+ (d,index,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(data,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE \
+ ) \
+ ) \
+ ) \
+ (data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,data,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY_D, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST_D, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE_D \
+ ) \
+ ) \
+ ) \
+ (d,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_RESULT(state) \
+ BOOST_PP_TUPLE_ELEM(0,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_FIRST(state) \
+ BOOST_PP_TUPLE_ELEM(1,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SECOND(state) \
+ BOOST_PP_TUPLE_ELEM(2,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SIZE(state) \
+ BOOST_PP_TUPLE_ELEM(3,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_TYPE(state) \
+ BOOST_PP_TUPLE_ELEM(4,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state) \
+ BOOST_PP_TUPLE_ELEM(5,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state) \
+ BOOST_PP_TUPLE_ELEM(6,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SIZE(state) \
+ ), \
+ BOOST_PP_COMPL(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state) \
+ BOOST_VMD_IS_EMPTY(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_INDEX(state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_ELEM \
+ ) \
+ (0,BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_EMPTY(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 6, \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_REMOVE(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 6, \
+ BOOST_PP_TUPLE_POP_FRONT(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)),1), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_EMPTY, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_REMOVE \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_CREATE(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 6, \
+ (BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state)) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_ADD(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 6, \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_CREATE, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_ADD \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_INDEX(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_INDEX, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX \
+ ) \
+ (state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_INDEX(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_FIRST(state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_TYPE(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_INDEX(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SECOND(state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_TYPE(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_PRED(d,state) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_RESULT(state), \
+ 1 \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_NOT_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SIZE(state) \
+ ), \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS_NCP(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 5, \
+ BOOST_PP_INC(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS_NCP \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_FAILURE(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 0, \
+ 0 \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT(d,state,result) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,result,0), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_FAILURE, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,result,1), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH \
+ ) \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_TYPE(emf,ems,vtype) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_GET_TYPE(emf), \
+ vtype \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_GET_TYPE(ems), \
+ vtype \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_TYPE_D(d,emf,ems,vtype) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_GET_TYPE(emf), \
+ vtype \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_GET_TYPE(ems), \
+ vtype \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_COMMON_HPP */
diff --git a/boost/vmd/detail/empty_result.hpp b/boost/vmd/detail/empty_result.hpp
new file mode 100644
index 0000000000..e393f58d8e
--- /dev/null
+++ b/boost/vmd/detail/empty_result.hpp
@@ -0,0 +1,12 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EMPTY_RESULT_HPP)
+#define BOOST_VMD_DETAIL_EMPTY_RESULT_HPP
+
+#define BOOST_VMD_DETAIL_EMPTY_RESULT(...) (,)
+
+#endif /* BOOST_VMD_DETAIL_EMPTY_RESULT_HPP */
diff --git a/boost/vmd/detail/equal.hpp b/boost/vmd/detail/equal.hpp
new file mode 100644
index 0000000000..ab7e91ecab
--- /dev/null
+++ b/boost/vmd/detail/equal.hpp
@@ -0,0 +1,562 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/detail/auto_rec.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/overload.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+#include <boost/vmd/is_identifier.hpp>
+#include <boost/vmd/is_empty_list.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+
+#include <boost/vmd/detail/recurse/equal/equal_1.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_2.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_3.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_4.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_5.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_6.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_7.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_8.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_9.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_10.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_11.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_12.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_13.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_14.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_15.hpp>
+#include <boost/vmd/detail/recurse/equal/equal_16.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_1(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_1_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_2(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_2_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_3(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_3_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_4(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_4_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_5(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_5_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_6(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_6_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_7(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_7_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_8(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_8_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_9(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_9_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_10(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_10_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_11(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_11_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_12(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_12_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_13(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_13_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_14(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_14_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_15(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_15_D(d,vseq1,vseq2)
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_16(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_16_D(d,vseq1,vseq2)
+
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D(n) \
+ BOOST_VMD_DETAIL_EQUAL_IS_1 \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_ ## n(1,,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_, \
+ BOOST_PP_AUTO_REC(BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D,16) \
+ ) \
+/**/
+
+
+#define BOOST_VMD_DETAIL_EQUAL_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE(vseq1,vtype1,type) \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_ARRAY, \
+ vtype1 \
+ ), \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_LIST, \
+ vtype1 \
+ ), \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_VMD_IS_EMPTY_LIST(vseq1) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D(d,vseq1,vtype1,type) \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_TYPE_ARRAY, \
+ vtype1 \
+ ), \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_TYPE_LIST, \
+ vtype1 \
+ ), \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_VMD_IS_EMPTY_LIST_D(d,vseq1) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER(vseq1,vtype1,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_IDENTIFIER, \
+ type \
+ ), \
+ BOOST_VMD_IS_IDENTIFIER, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D(d,vseq1,vtype1,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_TYPE_IDENTIFIER, \
+ type \
+ ), \
+ BOOST_VMD_IS_IDENTIFIER_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK(vseq1,vtype1,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_TUPLE, \
+ type \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE, \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER \
+ ) \
+ (vseq1,vtype1,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D(d,vseq1,vtype1,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_TYPE_TUPLE, \
+ type \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D, \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D \
+ ) \
+ (d,vseq1,vtype1,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE(vseq1,vtype1,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ type \
+ ), \
+ BOOST_VMD_IDENTITY(1), \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK \
+ ) \
+ (vseq1,vtype1,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D(d,vseq1,vtype1,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ type \
+ ), \
+ BOOST_VMD_IDENTITY(1), \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D \
+ ) \
+ (d,vseq1,vtype1,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_WT_CHECK(vseq1,vseq2,vtype1,vtype2,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(type), \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE, \
+ BOOST_VMD_IDENTITY(1) \
+ ) \
+ (vseq1,vtype1,type) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(type), \
+ BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D, \
+ BOOST_VMD_IDENTITY(1) \
+ ) \
+ (d,vseq1,vtype1,type) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT(vseq1,vseq2,vtype1,vtype2,type) \
+ BOOST_VMD_DETAIL_EQUAL_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
+ BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_WT(vseq1,vseq2,vtype1,vtype2,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_WT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_GTYPE(vseq1,vseq2,type) \
+ BOOST_VMD_DETAIL_EQUAL_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_GTYPE_D(d,vseq1,vseq2,type) \
+ BOOST_VMD_DETAIL_EQUAL_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_EBP(vseq1,vseq2,be1,be2,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_EBP_D(d,vseq1,vseq2,be1,be2,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,type) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_EMPTY(vseq1,vseq2,be1,be2,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_EMPTY_D(d,vseq1,vseq2,be1,be2,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_OV1(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2), \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_OV2(vseq1,vseq2,type) \
+ BOOST_VMD_DETAIL_EQUAL_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_D_OV1(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2), \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_D_OV2(d,vseq1,vseq2,type) \
+ BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2), \
+ type \
+ ) \
+/**/
+
+#if BOOST_VMD_MSVC
+
+#define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
+ BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__),BOOST_PP_EMPTY()) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_D(d,vseq1,...) \
+ BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_D_OV,__VA_ARGS__)(d,vseq1,__VA_ARGS__),BOOST_PP_EMPTY()) \
+/**/
+
+#else
+
+#define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
+ BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_D(d,vseq1,...) \
+ BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_D_OV,__VA_ARGS__)(d,vseq1,__VA_ARGS__) \
+/**/
+
+#endif
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_HPP */
diff --git a/boost/vmd/detail/equal_common.hpp b/boost/vmd/detail/equal_common.hpp
new file mode 100644
index 0000000000..776e099cf4
--- /dev/null
+++ b/boost/vmd/detail/equal_common.hpp
@@ -0,0 +1,153 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_COMMON_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_COMMON_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/not_equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/bitxor.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/get_type.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/match_single_identifier.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_CONCAT_1 (1)
+
+#define BOOST_VMD_DETAIL_EQUAL_IS_1(res) \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CONCAT_, \
+ res \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_MATCH_SINGLE_IDENTIFIER(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(vseq1,vseq2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CNI_SMP(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_NUMBER), \
+ BOOST_PP_EQUAL, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TYPE), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE, \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER \
+ ) \
+ ) \
+ (vseq1,vseq2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_NUMBER), \
+ BOOST_PP_EQUAL_D, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TYPE), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D, \
+ BOOST_VMD_DETAIL_EQUAL_MATCH_SINGLE_IDENTIFIER \
+ ) \
+ ) \
+ (d,vseq1,vseq2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE(vseq1,vseq2) \
+ BOOST_PP_NOT_EQUAL \
+ ( \
+ BOOST_PP_TUPLE_SIZE(vseq1), \
+ BOOST_PP_TUPLE_SIZE(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE_D(d,vseq1,vseq2) \
+ BOOST_PP_NOT_EQUAL_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_SIZE(vseq1), \
+ BOOST_PP_TUPLE_SIZE(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype1,BOOST_VMD_TYPE_TUPLE), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype2,BOOST_VMD_TYPE_TUPLE) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype1,BOOST_VMD_TYPE_TUPLE), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype2,BOOST_VMD_TYPE_TUPLE) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY(...) 1
+
+#define BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(bp1,bp2) \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_PP_BITXOR \
+ ( \
+ bp1, \
+ bp2 \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq1), \
+ BOOST_PP_IS_BEGIN_PARENS(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_CHK_EMPTY_MATCH(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH \
+ ( \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_COMMON_HPP */
diff --git a/boost/vmd/detail/equal_type.hpp b/boost/vmd/detail/equal_type.hpp
new file mode 100644
index 0000000000..504fd00580
--- /dev/null
+++ b/boost/vmd/detail/equal_type.hpp
@@ -0,0 +1,21 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_TYPE_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_TYPE_HPP
+
+#include <boost/vmd/detail/match_single_identifier.hpp>
+#include <boost/vmd/detail/type_registration.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_TYPE(type1,type2) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(type1,type2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,type1,type2) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(type1,type2) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_TYPE_HPP */
diff --git a/boost/vmd/detail/identifier.hpp b/boost/vmd/detail/identifier.hpp
new file mode 100644
index 0000000000..9ebc705c54
--- /dev/null
+++ b/boost/vmd/detail/identifier.hpp
@@ -0,0 +1,429 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IDENTIFIER_HPP)
+#define BOOST_VMD_DETAIL_IDENTIFIER_HPP
+
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/identifier_concat.hpp>
+#include <boost/vmd/detail/is_entire.hpp>
+#include <boost/vmd/detail/match_identifier.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/parens.hpp>
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_SUCCESS(id,rest,keymatch,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,BOOST_PP_DEC(keymatch),mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_FAILURE(id,rest,keymatch,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT(id,rest,keymatch,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(keymatch,0), \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_FAILURE, \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_SUCCESS \
+ ) \
+ (id,rest,keymatch,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT_D(d,id,rest,keymatch,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,keymatch,0), \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_FAILURE, \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_SUCCESS \
+ ) \
+ (id,rest,keymatch,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE(id,rest,keytuple,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT \
+ ( \
+ id, \
+ rest, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER(id,keytuple), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_D(d,id,rest,keytuple,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT_D \
+ ( \
+ d, \
+ id, \
+ rest, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D(d,id,keytuple), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_MAKE_SPLIT(tuple) \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_TUPLE_ELEM(0,tuple) \
+ ), \
+ BOOST_PP_TUPLE_ELEM(1,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT_DATA(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tuple) \
+ ), \
+ BOOST_VMD_IDENTITY(tuple), \
+ BOOST_VMD_DETAIL_IDENTIFIER_MAKE_SPLIT \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT(vcseq) \
+ BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT_DATA \
+ ( \
+ BOOST_VMD_DETAIL_PARENS(vcseq,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_GETID_TID(tid) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tid), \
+ BOOST_VMD_IDENTITY(tid), \
+ BOOST_PP_TUPLE_ELEM \
+ ) \
+ (0,tid) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_GETID_SEQUENCE(vseq) \
+ BOOST_VMD_DETAIL_IDENTIFIER_GETID_TID \
+ ( \
+ BOOST_VMD_DETAIL_PARENS(BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE(vseq) \
+ BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS(id,rest,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE \
+ ( \
+ id, \
+ rest, \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_D(d,id,rest,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_D \
+ ( \
+ d, \
+ id, \
+ rest, \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_JUST(id,rest,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,0,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_JUST_D(d,id,rest,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,0,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS(id,rest,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods) \
+ ), \
+ BOOST_VMD_DETAIL_IDENTIFIER_JUST, \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS \
+ ) \
+ (id,rest,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS_D(d,id,rest,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods) \
+ ), \
+ BOOST_VMD_DETAIL_IDENTIFIER_JUST_D, \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_D \
+ ) \
+ (d,id,rest,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_MKEYS(mods) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(mods), \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,keymatch,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_MKEYS(mods), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
+ (id,rest,keymatch), \
+ (id,keymatch) \
+ ), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
+ (id,rest), \
+ id \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_MKEYS(mods), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
+ (,,), \
+ (,) \
+ ), \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
+ (,) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST(id,rest,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST_D(d,id,rest,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_ID_REST(id,rest,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(id), \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST, \
+ BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS \
+ ) \
+ (id,rest,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_ID_REST_D(d,id,rest,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(id), \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST_D, \
+ BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS_D \
+ ) \
+ (d,id,rest,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA(tuple,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_ID_REST \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tuple), \
+ BOOST_PP_TUPLE_ELEM(1,tuple), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID(id,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(id), \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST, \
+ BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS \
+ ) \
+ (id,,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID_D(d,id,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(id), \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST_D, \
+ BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS_D \
+ ) \
+ (d,id,,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA_D(d,tuple,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_ID_REST_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_ELEM(0,tuple), \
+ BOOST_PP_TUPLE_ELEM(1,tuple), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER(vseq,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE(vseq), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER_D(d,vseq,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE(vseq), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID(vseq,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_GETID_SEQUENCE(vseq), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID_D(d,vseq,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_IDENTIFIER_GETID_SEQUENCE(vseq), \
+ mods \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE(vseq,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
+ BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER, \
+ BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID \
+ ) \
+ (vseq,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_D(d,vseq,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
+ BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER_D, \
+ BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID_D \
+ ) \
+ (d,vseq,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE(vseq,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE_D(d,vseq,mods) \
+ BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_EX(vseq,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_IS_EMPTY(vseq), \
+ BOOST_PP_IS_BEGIN_PARENS(vseq) \
+ ), \
+ BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE, \
+ BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE \
+ ) \
+ (vseq,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_EX_D(d,vseq,mods) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_IS_EMPTY(vseq), \
+ BOOST_PP_IS_BEGIN_PARENS(vseq) \
+ ), \
+ BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE_D, \
+ BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_D \
+ ) \
+ (d,vseq,mods) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER(...) \
+ BOOST_VMD_DETAIL_IDENTIFIER_EX \
+ ( \
+ BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_INDEX,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_D(d,...) \
+ BOOST_VMD_DETAIL_IDENTIFIER_EX_D \
+ ( \
+ d, \
+ BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_INDEX,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE(...) \
+ BOOST_VMD_DETAIL_IS_ENTIRE \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER(__VA_ARGS__,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE_D(d,...) \
+ BOOST_VMD_DETAIL_IS_ENTIRE \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_D(d,__VA_ARGS__,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IDENTIFIER_HPP */
diff --git a/boost/vmd/detail/identifier_concat.hpp b/boost/vmd/detail/identifier_concat.hpp
new file mode 100644
index 0000000000..6fa596db0c
--- /dev/null
+++ b/boost/vmd/detail/identifier_concat.hpp
@@ -0,0 +1,21 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IDENTIFIER_CONCAT_HPP)
+#define BOOST_VMD_DETAIL_IDENTIFIER_CONCAT_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/vmd/detail/idprefix.hpp>
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_REGISTRATION_PREFIX, \
+ vseq \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IDENTIFIER_CONCAT_HPP */
diff --git a/boost/vmd/detail/identifier_type.hpp b/boost/vmd/detail/identifier_type.hpp
new file mode 100644
index 0000000000..ed7e4c1523
--- /dev/null
+++ b/boost/vmd/detail/identifier_type.hpp
@@ -0,0 +1,118 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP)
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_tuple.hpp>
+#include <boost/vmd/detail/idprefix.hpp>
+#include <boost/vmd/detail/number_registration.hpp>
+#include <boost/vmd/detail/type_registration.hpp>
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_SUBTYPE_REGISTRATION_PREFIX, \
+ id \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE(cres) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL \
+ ( \
+ BOOST_PP_TUPLE_SIZE(cres), \
+ 2 \
+ ), \
+ BOOST_PP_TUPLE_ELEM, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
+ ) \
+ (0,cres) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D(d,cres) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_SIZE(cres), \
+ 2 \
+ ), \
+ BOOST_PP_TUPLE_ELEM, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
+ ) \
+ (0,cres) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT(cres) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(cres), \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
+ ) \
+ (cres) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D(d,cres) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(cres), \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
+ ) \
+ (d,cres) \
+ ) \
+/**/
+
+/*
+
+ Determines the type of an identifier.
+
+ The type may be that of an identifier or else
+ it may be a subtype.
+
+ Assumes the 'id' is a valid identifier id
+
+ Expands to the appropriate type
+
+*/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE(id) \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D(d,id) \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP */
diff --git a/boost/vmd/detail/idprefix.hpp b/boost/vmd/detail/idprefix.hpp
new file mode 100644
index 0000000000..e3b1ed6005
--- /dev/null
+++ b/boost/vmd/detail/idprefix.hpp
@@ -0,0 +1,14 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IDPREFIX_HPP)
+#define BOOST_VMD_DETAIL_IDPREFIX_HPP
+
+#define BOOST_VMD_DETAIL_IDENTIFIER_DETECTION_PREFIX BOOST_VMD_DETECT_
+#define BOOST_VMD_DETAIL_IDENTIFIER_REGISTRATION_PREFIX BOOST_VMD_REGISTER_
+#define BOOST_VMD_DETAIL_IDENTIFIER_SUBTYPE_REGISTRATION_PREFIX BOOST_VMD_SUBTYPE_REGISTER_
+
+#endif /* BOOST_VMD_DETAIL_IDPREFIX_HPP */
diff --git a/boost/vmd/detail/is_array.hpp b/boost/vmd/detail/is_array.hpp
new file mode 100644
index 0000000000..83858640c8
--- /dev/null
+++ b/boost/vmd/detail/is_array.hpp
@@ -0,0 +1,41 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_ARRAY_HPP)
+#define BOOST_VMD_DETAIL_IS_ARRAY_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_tuple.hpp>
+#include <boost/vmd/detail/is_array_common.hpp>
+
+#define BOOST_VMD_DETAIL_IS_ARRAY(vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(vseq), \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_D(d,vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(vseq), \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_ARRAY_HPP */
diff --git a/boost/vmd/detail/is_array_common.hpp b/boost/vmd/detail/is_array_common.hpp
new file mode 100644
index 0000000000..77914aa4c7
--- /dev/null
+++ b/boost/vmd/detail/is_array_common.hpp
@@ -0,0 +1,248 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP)
+#define BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_number.hpp>
+#include <boost/vmd/is_tuple.hpp>
+#include <boost/vmd/detail/is_empty_tuple.hpp>
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(2,BOOST_PP_TUPLE_SIZE(tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,2,BOOST_PP_TUPLE_SIZE(tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,tuple) \
+ ) \
+/**/
+
+/*
+
+ Check if the first element of the tuple is equal to the number of tuple elements of the second element
+
+*/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE(x) \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D(d,x) \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY(tuple) \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D(d,tuple) \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH(tuple) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tuple), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE, \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY \
+ ) \
+ (tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D(d,tuple) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tuple), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D, \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D \
+ ) \
+ (d,tuple) \
+/**/
+
+/*
+
+ Check if the first element is numeric
+
+*/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,tuple) \
+ ) \
+/**/
+
+/*
+
+ Check if the second element is a tuple
+
+*/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \
+ BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM(x) BOOST_VMD_IS_EMPTY(BOOST_PP_CAT(BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_, x) BOOST_PP_EMPTY())
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_0
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_1
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_2
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_3
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_4
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_5
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_6
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_7
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_8
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_9
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_10
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_11
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_12
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_13
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_14
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_15
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_16
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_17
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_18
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_19
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_20
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_21
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_22
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_23
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_24
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_25
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_26
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_27
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_28
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_29
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_30
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_31
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_32
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_33
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_34
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_35
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_36
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_37
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_38
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_39
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_40
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_41
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_42
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_43
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_44
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_45
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_46
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_47
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_48
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_49
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_50
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_51
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_52
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_53
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_54
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_55
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_56
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_57
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_58
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_59
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_60
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_61
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_62
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_63
+#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_64
+
+#endif /* BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP */
diff --git a/boost/vmd/detail/is_empty.hpp b/boost/vmd/detail/is_empty.hpp
new file mode 100644
index 0000000000..ddec5acb74
--- /dev/null
+++ b/boost/vmd/detail/is_empty.hpp
@@ -0,0 +1,61 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_EMPTY_HPP)
+#define BOOST_VMD_DETAIL_IS_EMPTY_HPP
+
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+
+#if BOOST_VMD_MSVC
+
+# pragma warning(once:4002)
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_0(t, b) b
+#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_1(t, b) t
+
+#if BOOST_VMD_MSVC_V8
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_PROCESS(param) \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C param () \
+ ) \
+/**/
+
+#else
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_PROCESS(...) \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \
+ ) \
+/**/
+
+#endif
+
+#else
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_0(t, ...) __VA_ARGS__
+#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_1(t, ...) t
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_PROCESS(...) \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_MSVC */
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_PRIMITIVE_CAT(a, b) a ## b
+#define BOOST_VMD_DETAIL_IS_EMPTY_IIF(bit) \
+ BOOST_VMD_DETAIL_IS_EMPTY_PRIMITIVE_CAT(BOOST_VMD_DETAIL_IS_EMPTY_IIF_,bit) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C(...) ()
+#define BOOST_VMD_DETAIL_IS_EMPTY_GEN_ZERO(...) 0
+
+#endif /* BOOST_VMD_DETAIL_IS_EMPTY_HPP */
diff --git a/boost/vmd/detail/is_empty_array.hpp b/boost/vmd/detail/is_empty_array.hpp
new file mode 100644
index 0000000000..d9ff9fdef0
--- /dev/null
+++ b/boost/vmd/detail/is_empty_array.hpp
@@ -0,0 +1,20 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_HPP)
+#define BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_HPP
+
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_SIZE(array) \
+ BOOST_PP_NOT \
+ ( \
+ BOOST_PP_ARRAY_SIZE(array) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_HPP */
diff --git a/boost/vmd/detail/is_empty_tuple.hpp b/boost/vmd/detail/is_empty_tuple.hpp
new file mode 100644
index 0000000000..dc07681653
--- /dev/null
+++ b/boost/vmd/detail/is_empty_tuple.hpp
@@ -0,0 +1,74 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_HPP)
+#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_HPP
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_tuple.hpp>
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_CEM(tuple) \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_CEM, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_CEM, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(tuple), \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_D(d,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(tuple), \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,tuple) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_HPP */
diff --git a/boost/vmd/detail/is_entire.hpp b/boost/vmd/detail/is_entire.hpp
new file mode 100644
index 0000000000..358e7d9e03
--- /dev/null
+++ b/boost/vmd/detail/is_entire.hpp
@@ -0,0 +1,23 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_ENTIRE_HPP)
+#define BOOST_VMD_DETAIL_IS_ENTIRE_HPP
+
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+
+#define BOOST_VMD_DETAIL_IS_ENTIRE(tuple) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_ENTIRE_HPP */
diff --git a/boost/vmd/detail/is_identifier.hpp b/boost/vmd/detail/is_identifier.hpp
new file mode 100644
index 0000000000..92dace090f
--- /dev/null
+++ b/boost/vmd/detail/is_identifier.hpp
@@ -0,0 +1,96 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP)
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/size.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_tuple.hpp>
+#include <boost/vmd/detail/identifier.hpp>
+#include <boost/vmd/detail/identifier_concat.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_MATCH(tup) \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tup) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_TUPLE(ptup) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(ptup), \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_MATCH, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (ptup) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_ID(vseq) \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_IS_EMPTY(vseq), \
+ BOOST_PP_IS_BEGIN_PARENS(vseq) \
+ ), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_ID \
+ ) \
+ (vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(...) \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D(d,...) \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE, \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE \
+ ) \
+ (__VA_ARGS__) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_IDENTIFIER_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D, \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE_D \
+ ) \
+ (d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP */
diff --git a/boost/vmd/detail/is_list.hpp b/boost/vmd/detail/is_list.hpp
new file mode 100644
index 0000000000..0a99499a85
--- /dev/null
+++ b/boost/vmd/detail/is_list.hpp
@@ -0,0 +1,207 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_LIST_HPP)
+#define BOOST_VMD_DETAIL_IS_LIST_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/preprocessor/variadic/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_identifier.hpp>
+#include <boost/vmd/is_tuple.hpp>
+#include <boost/vmd/detail/nil_registration.hpp>
+
+#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE(d,x) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_TUPLE(x), \
+ BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE_SIZE, \
+ BOOST_VMD_DETAIL_IS_LIST_ASSERT \
+ ) \
+ (d,x) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE_SIZE(d,x) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,2,BOOST_PP_TUPLE_SIZE(x)), \
+ BOOST_VMD_DETAIL_IS_LIST_RETURN_SECOND, \
+ BOOST_VMD_DETAIL_IS_LIST_ASSERT \
+ ) \
+ (x) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_PRED(d,state) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(state), \
+ BOOST_VMD_IDENTITY(1), \
+ BOOST_VMD_DETAIL_IS_LIST_NOT_BOOST_PP_NIL \
+ ) \
+ (state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_OP(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(state), \
+ BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE, \
+ BOOST_VMD_DETAIL_IS_LIST_PROCESS_IF_BOOST_PP_NIL \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_IF_BOOST_PP_NIL(d,x) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_BOOST_PP_NIL(x), \
+ BOOST_PP_NIL, \
+ BOOST_VMD_IS_LIST_FAILURE \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_ASSERT(...) \
+ BOOST_VMD_IS_LIST_FAILURE \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_NOT_BOOST_PP_NIL(x) \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_BOOST_PP_NIL(x), \
+ BOOST_VMD_DETAIL_IS_LIST_IS_FAILURE(x) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_BOOST_PP_NIL(x) \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_NIL_HELPER_, \
+ x \
+ ) BOOST_PP_EMPTY() \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_NIL_HELPER_BOOST_PP_NIL
+
+#define BOOST_VMD_DETAIL_IS_LIST_IS_FAILURE(x) \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_CAT(BOOST_VMD_DETAIL_IS_LIST_FHELPER_,x) BOOST_PP_EMPTY() \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_FHELPER_BOOST_VMD_IS_LIST_FAILURE
+
+#define BOOST_VMD_DETAIL_IS_LIST_RETURN_SECOND(x) \
+ BOOST_PP_TUPLE_ELEM(1,x) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_RESULT(x) \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_IS_FAILURE(x) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_WLOOP(list) \
+ BOOST_VMD_DETAIL_IS_LIST_RESULT \
+ ( \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_PRED, \
+ BOOST_VMD_DETAIL_IS_LIST_OP, \
+ list \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_WLOOP_D(d,list) \
+ BOOST_VMD_DETAIL_IS_LIST_RESULT \
+ ( \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_PRED, \
+ BOOST_VMD_DETAIL_IS_LIST_OP, \
+ list \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS(list) \
+ BOOST_VMD_IS_IDENTIFIER(list,BOOST_PP_NIL) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS_D(d,list) \
+ BOOST_VMD_IS_IDENTIFIER_D(d,list,BOOST_PP_NIL) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_PROCESS(param) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(param), \
+ BOOST_VMD_DETAIL_IS_LIST_WLOOP, \
+ BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS \
+ ) \
+ (param) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST(param) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(param), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_IS_LIST_PROCESS \
+ ) \
+ (param) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_D(d,param) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(param), \
+ BOOST_VMD_DETAIL_IS_LIST_WLOOP_D, \
+ BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS_D \
+ ) \
+ (d,param) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_LIST_D(d,param) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(param), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_IS_LIST_PROCESS_D \
+ ) \
+ (d,param) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_LIST_HPP */
diff --git a/boost/vmd/detail/is_number.hpp b/boost/vmd/detail/is_number.hpp
new file mode 100644
index 0000000000..b4a1d81cd8
--- /dev/null
+++ b/boost/vmd/detail/is_number.hpp
@@ -0,0 +1,38 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_NUMBER_HPP)
+#define BOOST_VMD_DETAIL_IS_NUMBER_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+#include <boost/vmd/detail/identifier_type.hpp>
+#include <boost/vmd/detail/is_identifier.hpp>
+#include <boost/vmd/detail/number_registration.hpp>
+
+#define BOOST_VMD_DETAIL_IS_NUMBER_TYPE(vseq) \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_NUMBER, \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE(vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_NUMBER(vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(vseq), \
+ BOOST_VMD_DETAIL_IS_NUMBER_TYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_NUMBER_HPP */
diff --git a/boost/vmd/detail/is_seq.hpp b/boost/vmd/detail/is_seq.hpp
new file mode 100644
index 0000000000..d8c46bffea
--- /dev/null
+++ b/boost/vmd/detail/is_seq.hpp
@@ -0,0 +1,27 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_SEQ_HPP)
+#define BOOST_VMD_DETAIL_IS_SEQ_HPP
+
+#include <boost/vmd/detail/is_entire.hpp>
+#include <boost/vmd/detail/seq.hpp>
+
+#define BOOST_VMD_DETAIL_IS_SEQ(seq) \
+ BOOST_VMD_DETAIL_IS_ENTIRE \
+ ( \
+ BOOST_VMD_DETAIL_SEQ_SPLIT(seq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_SEQ_D(d,seq) \
+ BOOST_VMD_DETAIL_IS_ENTIRE \
+ ( \
+ BOOST_VMD_DETAIL_SEQ_SPLIT_D(d,seq) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_SEQ_HPP */
diff --git a/boost/vmd/detail/is_tuple.hpp b/boost/vmd/detail/is_tuple.hpp
new file mode 100644
index 0000000000..98bf8ecacb
--- /dev/null
+++ b/boost/vmd/detail/is_tuple.hpp
@@ -0,0 +1,20 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_TUPLE_HPP)
+#define BOOST_VMD_DETAIL_IS_TUPLE_HPP
+
+#include <boost/vmd/detail/is_entire.hpp>
+#include <boost/vmd/detail/parens_split.hpp>
+
+#define BOOST_VMD_DETAIL_IS_TUPLE(vseq) \
+ BOOST_VMD_DETAIL_IS_ENTIRE \
+ ( \
+ BOOST_VMD_DETAIL_PARENS_SPLIT(vseq) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_TUPLE_HPP */
diff --git a/boost/vmd/detail/is_type.hpp b/boost/vmd/detail/is_type.hpp
new file mode 100644
index 0000000000..067f684e8b
--- /dev/null
+++ b/boost/vmd/detail/is_type.hpp
@@ -0,0 +1,57 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_TYPE_HPP)
+#define BOOST_VMD_DETAIL_IS_TYPE_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/detail/identifier_type.hpp>
+#include <boost/vmd/detail/is_type_type.hpp>
+#include <boost/vmd/detail/is_identifier.hpp>
+#include <boost/vmd/detail/type_registration.hpp>
+
+#define BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE(vseq) \
+ BOOST_VMD_DETAIL_IS_TYPE_TYPE \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE(vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE_D(d,vseq) \
+ BOOST_VMD_DETAIL_IS_TYPE_TYPE \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D(d,vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_TYPE(vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(vseq), \
+ BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_TYPE_D(d,vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D(d,vseq), \
+ BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_TYPE_HPP */
diff --git a/boost/vmd/detail/is_type_type.hpp b/boost/vmd/detail/is_type_type.hpp
new file mode 100644
index 0000000000..0b8ed6cce0
--- /dev/null
+++ b/boost/vmd/detail/is_type_type.hpp
@@ -0,0 +1,25 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_TYPE_TYPE_HPP)
+#define BOOST_VMD_DETAIL_IS_TYPE_TYPE_HPP
+
+#include <boost/vmd/detail/type_registration.hpp>
+#include <boost/vmd/detail/match_single_identifier.hpp>
+
+/*
+
+ Check to see if the 'id' is BOOST_VMD_TYPE_TYPE
+
+ Returns 1 if it is, else 0
+
+*/
+
+#define BOOST_VMD_DETAIL_IS_TYPE_TYPE(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_TYPE_TYPE) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_IS_TYPE_TYPE_HPP */
diff --git a/boost/vmd/detail/list.hpp b/boost/vmd/detail/list.hpp
new file mode 100644
index 0000000000..815471ba3c
--- /dev/null
+++ b/boost/vmd/detail/list.hpp
@@ -0,0 +1,212 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_LIST_HPP)
+#define BOOST_VMD_DETAIL_LIST_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/pop_back.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/empty_result.hpp>
+#include <boost/vmd/detail/identifier.hpp>
+#include <boost/vmd/detail/is_list.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/parens.hpp>
+
+#define BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ tuple, \
+ (,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST_D(d,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ tuple, \
+ (,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_CHECK_RETURN(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST \
+ ) \
+ (tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_CHECK_RETURN_D(d,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ tuple \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST_D \
+ ) \
+ (d,tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_EMPTY_LIST(list) \
+ BOOST_VMD_DETAIL_IDENTIFIER(list,BOOST_PP_NIL,BOOST_VMD_RETURN_AFTER,BOOST_VMD_RETURN_INDEX) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_EMPTY_LIST_D(d,list) \
+ BOOST_VMD_DETAIL_IDENTIFIER_D(d,list,BOOST_PP_NIL,BOOST_VMD_RETURN_AFTER,BOOST_VMD_RETURN_INDEX) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_TUPLE(param) \
+ BOOST_VMD_DETAIL_LIST_CHECK_RETURN \
+ ( \
+ BOOST_VMD_DETAIL_PARENS(param,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_TUPLE_D(d,param) \
+ BOOST_VMD_DETAIL_LIST_CHECK_RETURN_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_PARENS_D(d,param,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_EMPTY_PROCESS(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tuple) \
+ ), \
+ (,), \
+ tuple \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_EMPTY(list) \
+ BOOST_VMD_DETAIL_LIST_EMPTY_PROCESS \
+ ( \
+ BOOST_VMD_DETAIL_LIST_EMPTY_LIST(list) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_EMPTY_D(d,list) \
+ BOOST_VMD_DETAIL_LIST_EMPTY_PROCESS \
+ ( \
+ BOOST_VMD_DETAIL_LIST_EMPTY_LIST_D(d,list) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_PROCESS(list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(list), \
+ BOOST_VMD_DETAIL_LIST_TUPLE, \
+ BOOST_VMD_DETAIL_LIST_EMPTY \
+ ) \
+ (list) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_SPLIT(list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(list), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_LIST_PROCESS \
+ ) \
+ (list) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_BEGIN(list) \
+ BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_LIST_SPLIT(list)) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_PROCESS_D(d,list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(list), \
+ BOOST_VMD_DETAIL_LIST_TUPLE_D, \
+ BOOST_VMD_DETAIL_LIST_EMPTY_D \
+ ) \
+ (d,list) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_SPLIT_D(d,list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(list), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_LIST_PROCESS_D \
+ ) \
+ (d,list) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_BEGIN_D(d,list) \
+ BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_LIST_SPLIT_D(d,list)) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_LIST_SPLIT_D, \
+ BOOST_VMD_DETAIL_LIST_BEGIN_D \
+ ) \
+ (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_LIST(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_LIST_SPLIT, \
+ BOOST_VMD_DETAIL_LIST_BEGIN \
+ ) \
+ (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_LIST_HPP */
diff --git a/boost/vmd/detail/match_identifier.hpp b/boost/vmd/detail/match_identifier.hpp
new file mode 100644
index 0000000000..0b234b2d5f
--- /dev/null
+++ b/boost/vmd/detail/match_identifier.hpp
@@ -0,0 +1,160 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_MATCH_IDENTIFIER_HPP)
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_HPP
+
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/not_equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/replace.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/idprefix.hpp>
+#include <boost/vmd/detail/match_identifier_common.hpp>
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_ID(state) \
+ BOOST_PP_TUPLE_ELEM(0,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE(state) \
+ BOOST_PP_TUPLE_ELEM(1,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE_SIZE(state) \
+ BOOST_PP_TUPLE_ELEM(2,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_CURRENT(state) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state), \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state) \
+ BOOST_PP_TUPLE_ELEM(3,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_RESULT(state) \
+ BOOST_PP_TUPLE_ELEM(4,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_PRED(d,state) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_RESULT(state), \
+ 0 \
+ ), \
+ BOOST_PP_NOT_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state), \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE_SIZE(state) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_FOUND(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 4, \
+ BOOST_PP_INC \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CONTINUE(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ 3, \
+ BOOST_PP_INC \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CMP_IDS \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_ID(state), \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_CURRENT(state) \
+ ), \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_FOUND, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CONTINUE \
+ ) \
+ (d,state) \
+/**/
+
+/*
+
+ Return index starting with 1 of the tuple id the identifier matches, or 0 if there are no matches.
+
+*/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER(id,keytuple) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 4, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_PRED, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP, \
+ ( \
+ id, \
+ keytuple, \
+ BOOST_PP_TUPLE_SIZE(keytuple), \
+ 0, \
+ 0 \
+ ) \
+ ) \
+ ) \
+/**/
+
+/*
+
+ Return index starting with 1 of the tuple id the identifier matches, or 0 if there are no matches.
+
+*/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D(d,id,keytuple) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 4, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_PRED, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP, \
+ ( \
+ id, \
+ keytuple, \
+ BOOST_PP_TUPLE_SIZE(keytuple), \
+ 0, \
+ 0 \
+ ) \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_MATCH_IDENTIFIER_HPP */
diff --git a/boost/vmd/detail/match_identifier_common.hpp b/boost/vmd/detail/match_identifier_common.hpp
new file mode 100644
index 0000000000..18e7a578d0
--- /dev/null
+++ b/boost/vmd/detail/match_identifier_common.hpp
@@ -0,0 +1,37 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_MATCH_IDENTIFIER_COMMON_HPP)
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_COMMON_HPP
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/idprefix.hpp>
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CREATE_ID_RESULT(id,keyid) \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_IDENTIFIER_DETECTION_PREFIX, \
+ BOOST_PP_CAT \
+ ( \
+ keyid, \
+ BOOST_PP_CAT \
+ ( \
+ _, \
+ id \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CMP_IDS(id,keyid) \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CREATE_ID_RESULT(id,keyid) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_MATCH_IDENTIFIER_COMMON_HPP */
diff --git a/boost/vmd/detail/match_single_identifier.hpp b/boost/vmd/detail/match_single_identifier.hpp
new file mode 100644
index 0000000000..0913d9f3f6
--- /dev/null
+++ b/boost/vmd/detail/match_single_identifier.hpp
@@ -0,0 +1,16 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER_HPP)
+#define BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER_HPP
+
+#include <boost/vmd/detail/match_identifier_common.hpp>
+
+#define BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,key) \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CMP_IDS(id,key) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER_HPP */
diff --git a/boost/vmd/detail/modifiers.hpp b/boost/vmd/detail/modifiers.hpp
new file mode 100644
index 0000000000..c5d46c0a37
--- /dev/null
+++ b/boost/vmd/detail/modifiers.hpp
@@ -0,0 +1,104 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_MODIFIERS_HPP)
+#define BOOST_VMD_DETAIL_MODIFIERS_HPP
+
+#include <boost/vmd/detail/match_single_identifier.hpp>
+
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_NO_TYPE (BOOST_VMD_RETURN_NO_TYPE)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE (BOOST_VMD_RETURN_TYPE)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE_TUPLE (BOOST_VMD_RETURN_TYPE_TUPLE)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE_ARRAY (BOOST_VMD_RETURN_TYPE_ARRAY)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE_LIST (BOOST_VMD_RETURN_TYPE_LIST)
+
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_AFTER (BOOST_VMD_RETURN_AFTER)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_NO_AFTER (BOOST_VMD_RETURN_NO_AFTER)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_ONLY_AFTER (BOOST_VMD_RETURN_ONLY_AFTER)
+
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_INDEX (BOOST_VMD_RETURN_INDEX)
+#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_NO_INDEX (BOOST_VMD_RETURN_NO_INDEX)
+
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_NO_TYPE_BOOST_VMD_RETURN_NO_TYPE
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_BOOST_VMD_RETURN_TYPE
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_TUPLE_BOOST_VMD_RETURN_TYPE_TUPLE
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_ARRAY_BOOST_VMD_RETURN_TYPE_ARRAY
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_LIST_BOOST_VMD_RETURN_TYPE_LIST
+
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_AFTER_BOOST_VMD_RETURN_AFTER
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_NO_AFTER_BOOST_VMD_RETURN_NO_AFTER
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_ONLY_AFTER_BOOST_VMD_RETURN_ONLY_AFTER
+
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_INDEX_BOOST_VMD_RETURN_INDEX
+#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_NO_INDEX_BOOST_VMD_RETURN_NO_INDEX
+
+#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_ALL (BOOST_VMD_ALLOW_ALL)
+#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_RETURN (BOOST_VMD_ALLOW_RETURN)
+#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_AFTER (BOOST_VMD_ALLOW_AFTER)
+#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_INDEX (BOOST_VMD_ALLOW_INDEX)
+
+#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_ALL_BOOST_VMD_ALLOW_ALL
+#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_RETURN_BOOST_VMD_ALLOW_RETURN
+#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_AFTER_BOOST_VMD_ALLOW_AFTER
+#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_INDEX_BOOST_VMD_ALLOW_INDEX
+
+#define BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE_TUPLE) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE_ARRAY) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE_LIST) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_TYPE(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_NO_TYPE) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_AFTER(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_AFTER) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_ONLY_AFTER) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_NO_AFTER) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_INDEX(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_INDEX) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_NO_INDEX) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ALLOW_ALL(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_ALL) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ALLOW_RETURN(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_RETURN) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ALLOW_AFTER(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_AFTER) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_ALLOW_INDEX(id) \
+ BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_INDEX) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_MODIFIERS_HPP */
diff --git a/boost/vmd/detail/mods.hpp b/boost/vmd/detail/mods.hpp
new file mode 100644
index 0000000000..84173f4846
--- /dev/null
+++ b/boost/vmd/detail/mods.hpp
@@ -0,0 +1,707 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_MODS_HPP)
+#define BOOST_VMD_DETAIL_MODS_HPP
+
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/pop_front.hpp>
+#include <boost/preprocessor/tuple/push_back.hpp>
+#include <boost/preprocessor/tuple/replace.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/preprocessor/variadic/to_tuple.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_type.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+
+#define BOOST_VMD_DETAIL_MODS_NO_RETURN 0
+#define BOOST_VMD_DETAIL_MODS_RETURN 1
+#define BOOST_VMD_DETAIL_MODS_RETURN_TUPLE 2
+#define BOOST_VMD_DETAIL_MODS_RETURN_ARRAY 3
+#define BOOST_VMD_DETAIL_MODS_RETURN_LIST 4
+#define BOOST_VMD_DETAIL_MODS_NO_AFTER 0
+#define BOOST_VMD_DETAIL_MODS_RETURN_AFTER 1
+#define BOOST_VMD_DETAIL_MODS_NO_INDEX 0
+#define BOOST_VMD_DETAIL_MODS_RETURN_INDEX 1
+#define BOOST_VMD_DETAIL_MODS_NO_ONLY_AFTER 0
+#define BOOST_VMD_DETAIL_MODS_RETURN_ONLY_AFTER 1
+
+#define BOOST_VMD_DETAIL_MODS_TUPLE_RETURN 0
+#define BOOST_VMD_DETAIL_MODS_TUPLE_AFTER 1
+#define BOOST_VMD_DETAIL_MODS_TUPLE_INDEX 2
+#define BOOST_VMD_DETAIL_MODS_TUPLE_OTHER 3
+#define BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER 4
+#define BOOST_VMD_DETAIL_MODS_TUPLE_TYPE 5
+
+#define BOOST_VMD_DETAIL_MODS_DATA_INPUT 0
+#define BOOST_VMD_DETAIL_MODS_DATA_INDEX 1
+#define BOOST_VMD_DETAIL_MODS_DATA_SIZE 2
+#define BOOST_VMD_DETAIL_MODS_DATA_RESULT 3
+#define BOOST_VMD_DETAIL_MODS_DATA_ALLOW 4
+
+#define BOOST_VMD_DETAIL_MODS_STATE_INPUT(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INPUT,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_INDEX(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INDEX,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_SIZE(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_SIZE,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_RESULT(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_RESULT,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_ALLOW,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state) \
+ BOOST_VMD_DETAIL_IS_ALLOW_ALL(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state) \
+ BOOST_VMD_DETAIL_IS_ALLOW_RETURN(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state) \
+ BOOST_VMD_DETAIL_IS_ALLOW_AFTER(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state) \
+ BOOST_VMD_DETAIL_IS_ALLOW_INDEX(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state),BOOST_VMD_DETAIL_MODS_STATE_INPUT(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_TYPE(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_AFTER(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_ONLY_AFTER(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_STATE_TINDEX(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE(result) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,result) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(result) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,result) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(result) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,result) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(result) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,result) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_RESULT_OTHER(result) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_OTHER,result) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_RESULT_TYPE(result) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_TYPE,result) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_PRED(d,state) \
+ BOOST_PP_GREATER_D(d,BOOST_VMD_DETAIL_MODS_STATE_SIZE(state),BOOST_VMD_DETAIL_MODS_STATE_INDEX(state))
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,number) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
+ number \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
+ 1 \
+ ), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
+ 1 \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,number) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_INDEX, \
+ number \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_LIST) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_NO_RETURN) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
+ BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
+ 0 \
+ ), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
+ BOOST_VMD_DETAIL_MODS_NO_AFTER \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_RETURN_INDEX) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_NO_INDEX) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE(d,state,id) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
+ BOOST_PP_VARIADIC_TO_TUPLE(id) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD(d,state,id) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)), \
+ id \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
+ ), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_MODS_RETURN_ARRAY, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_LIST), \
+ BOOST_VMD_DETAIL_MODS_RETURN_LIST, \
+ BOOST_VMD_DETAIL_MODS_RETURN_TUPLE \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE(d,state,id) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_TYPE, \
+ id \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
+ BOOST_VMD_IS_TYPE_D(d,id) \
+ ), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE \
+ ) \
+ (d,state,id) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_INDEX, \
+ BOOST_PP_INC(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
+ ) \
+ ) \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
+ ) \
+ ) \
+ ) \
+ ) \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE \
+ ) \
+ ) \
+ ) \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE(d,state,id) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
+ id \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,id) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(id), \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE, \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID \
+ ) \
+ (d,state,id) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_OP(d,state) \
+ BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state)) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_LOOP(allow,tuple) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 3, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_MODS_PRED, \
+ BOOST_VMD_DETAIL_MODS_OP, \
+ ( \
+ tuple, \
+ 0, \
+ BOOST_PP_TUPLE_SIZE(tuple), \
+ (0,0,0,,0,), \
+ allow \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_MODS_LOOP_D(d,allow,tuple) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 3, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_MODS_PRED, \
+ BOOST_VMD_DETAIL_MODS_OP, \
+ ( \
+ tuple, \
+ 0, \
+ BOOST_PP_TUPLE_SIZE(tuple), \
+ (0,0,0,,0,), \
+ allow \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_NEW_MODS_VAR(allow,tuple) \
+ BOOST_VMD_DETAIL_MODS_LOOP \
+ ( \
+ allow, \
+ BOOST_PP_TUPLE_POP_FRONT(tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_NEW_MODS_VAR_D(d,allow,tuple) \
+ BOOST_VMD_DETAIL_MODS_LOOP_D \
+ ( \
+ d, \
+ allow, \
+ BOOST_PP_TUPLE_POP_FRONT(tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_NEW_MODS_IR(allow,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_IDENTITY((0,0,0,,0,)), \
+ BOOST_VMD_DETAIL_NEW_MODS_VAR \
+ ) \
+ (allow,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_IDENTITY((0,0,0,,0,)), \
+ BOOST_VMD_DETAIL_NEW_MODS_VAR_D \
+ ) \
+ (d,allow,tuple) \
+ ) \
+/**/
+
+/*
+
+ Returns a six-element tuple:
+
+ First tuple element = 0 No type return
+ 1 Exact type return
+ 2 General tuple type return
+ 3 Array return
+ 4 List return
+
+ Second tuple element = 0 No after return
+ 1 After return
+
+ Third tuple element = 0 No identifier index
+ 1 Identifier Index
+
+ Fourth tuple element = Tuple of other identifiers
+
+ Fifth tuple element = 0 No after only return
+ 1 After only return
+
+ Sixth tuple element = Type identifier
+
+ Input = allow, either
+ BOOST_VMD_ALLOW_ALL
+ BOOST_VMD_ALLOW_RETURN
+ BOOST_VMD_ALLOW_AFTER
+ BOOST_VMD_ALLOW_INDEX
+
+ ..., modifiers, first variadic is discarded
+ Possible modifiers are:
+
+ BOOST_VMD_RETURN_NO_TYPE = (0,0)
+ BOOST_VMD_RETURN_TYPE = (1,0)
+ BOOST_VMD_RETURN_TYPE_TUPLE = (2,0)
+ BOOST_VMD_RETURN_TYPE_ARRAY = (3,0)
+ BOOST_VMD_RETURN_TYPE_LIST = (4,0)
+
+ BOOST_VMD_RETURN_NO_AFTER = (0,0)
+ BOOST_VMD_RETURN_AFTER = (0,1)
+
+*/
+
+#define BOOST_VMD_DETAIL_NEW_MODS(allow,...) \
+ BOOST_VMD_DETAIL_NEW_MODS_IR(allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,...) \
+ BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_MODS_HPP */
diff --git a/boost/vmd/detail/nil_registration.hpp b/boost/vmd/detail/nil_registration.hpp
new file mode 100644
index 0000000000..4a4bdc6283
--- /dev/null
+++ b/boost/vmd/detail/nil_registration.hpp
@@ -0,0 +1,13 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_NIL_REGISTRATION_HPP)
+#define BOOST_VMD_DETAIL_NIL_REGISTRATION_HPP
+
+#define BOOST_VMD_REGISTER_BOOST_PP_NIL (BOOST_PP_NIL)
+#define BOOST_VMD_DETECT_BOOST_PP_NIL_BOOST_PP_NIL
+
+#endif /* BOOST_VMD_DETAIL_NIL_REGISTRATION_HPP */
diff --git a/boost/vmd/detail/not_empty.hpp b/boost/vmd/detail/not_empty.hpp
new file mode 100644
index 0000000000..f6dfb66d75
--- /dev/null
+++ b/boost/vmd/detail/not_empty.hpp
@@ -0,0 +1,20 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_NOT_EMPTY_HPP)
+#define BOOST_VMD_DETAIL_NOT_EMPTY_HPP
+
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+#define BOOST_VMD_DETAIL_NOT_EMPTY(par) \
+ BOOST_PP_COMPL \
+ ( \
+ BOOST_VMD_IS_EMPTY(par) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_NOT_EMPTY_HPP */
diff --git a/boost/vmd/detail/number_registration.hpp b/boost/vmd/detail/number_registration.hpp
new file mode 100644
index 0000000000..d0110d7e1c
--- /dev/null
+++ b/boost/vmd/detail/number_registration.hpp
@@ -0,0 +1,784 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_NUMBER_REGISTRATION_HPP)
+#define BOOST_VMD_DETAIL_IS_NUMBER_REGISTRATION_HPP
+
+#define BOOST_VMD_REGISTER_0 (0)
+#define BOOST_VMD_REGISTER_1 (1)
+#define BOOST_VMD_REGISTER_2 (2)
+#define BOOST_VMD_REGISTER_3 (3)
+#define BOOST_VMD_REGISTER_4 (4)
+#define BOOST_VMD_REGISTER_5 (5)
+#define BOOST_VMD_REGISTER_6 (6)
+#define BOOST_VMD_REGISTER_7 (7)
+#define BOOST_VMD_REGISTER_8 (8)
+#define BOOST_VMD_REGISTER_9 (9)
+#define BOOST_VMD_REGISTER_10 (10)
+#define BOOST_VMD_REGISTER_11 (11)
+#define BOOST_VMD_REGISTER_12 (12)
+#define BOOST_VMD_REGISTER_13 (13)
+#define BOOST_VMD_REGISTER_14 (14)
+#define BOOST_VMD_REGISTER_15 (15)
+#define BOOST_VMD_REGISTER_16 (16)
+#define BOOST_VMD_REGISTER_17 (17)
+#define BOOST_VMD_REGISTER_18 (18)
+#define BOOST_VMD_REGISTER_19 (19)
+#define BOOST_VMD_REGISTER_20 (20)
+#define BOOST_VMD_REGISTER_21 (21)
+#define BOOST_VMD_REGISTER_22 (22)
+#define BOOST_VMD_REGISTER_23 (23)
+#define BOOST_VMD_REGISTER_24 (24)
+#define BOOST_VMD_REGISTER_25 (25)
+#define BOOST_VMD_REGISTER_26 (26)
+#define BOOST_VMD_REGISTER_27 (27)
+#define BOOST_VMD_REGISTER_28 (28)
+#define BOOST_VMD_REGISTER_29 (29)
+#define BOOST_VMD_REGISTER_30 (30)
+#define BOOST_VMD_REGISTER_31 (31)
+#define BOOST_VMD_REGISTER_32 (32)
+#define BOOST_VMD_REGISTER_33 (33)
+#define BOOST_VMD_REGISTER_34 (34)
+#define BOOST_VMD_REGISTER_35 (35)
+#define BOOST_VMD_REGISTER_36 (36)
+#define BOOST_VMD_REGISTER_37 (37)
+#define BOOST_VMD_REGISTER_38 (38)
+#define BOOST_VMD_REGISTER_39 (39)
+#define BOOST_VMD_REGISTER_40 (40)
+#define BOOST_VMD_REGISTER_41 (41)
+#define BOOST_VMD_REGISTER_42 (42)
+#define BOOST_VMD_REGISTER_43 (43)
+#define BOOST_VMD_REGISTER_44 (44)
+#define BOOST_VMD_REGISTER_45 (45)
+#define BOOST_VMD_REGISTER_46 (46)
+#define BOOST_VMD_REGISTER_47 (47)
+#define BOOST_VMD_REGISTER_48 (48)
+#define BOOST_VMD_REGISTER_49 (49)
+#define BOOST_VMD_REGISTER_50 (50)
+#define BOOST_VMD_REGISTER_51 (51)
+#define BOOST_VMD_REGISTER_52 (52)
+#define BOOST_VMD_REGISTER_53 (53)
+#define BOOST_VMD_REGISTER_54 (54)
+#define BOOST_VMD_REGISTER_55 (55)
+#define BOOST_VMD_REGISTER_56 (56)
+#define BOOST_VMD_REGISTER_57 (57)
+#define BOOST_VMD_REGISTER_58 (58)
+#define BOOST_VMD_REGISTER_59 (59)
+#define BOOST_VMD_REGISTER_60 (60)
+#define BOOST_VMD_REGISTER_61 (61)
+#define BOOST_VMD_REGISTER_62 (62)
+#define BOOST_VMD_REGISTER_63 (63)
+#define BOOST_VMD_REGISTER_64 (64)
+#define BOOST_VMD_REGISTER_65 (65)
+#define BOOST_VMD_REGISTER_66 (66)
+#define BOOST_VMD_REGISTER_67 (67)
+#define BOOST_VMD_REGISTER_68 (68)
+#define BOOST_VMD_REGISTER_69 (69)
+#define BOOST_VMD_REGISTER_70 (70)
+#define BOOST_VMD_REGISTER_71 (71)
+#define BOOST_VMD_REGISTER_72 (72)
+#define BOOST_VMD_REGISTER_73 (73)
+#define BOOST_VMD_REGISTER_74 (74)
+#define BOOST_VMD_REGISTER_75 (75)
+#define BOOST_VMD_REGISTER_76 (76)
+#define BOOST_VMD_REGISTER_77 (77)
+#define BOOST_VMD_REGISTER_78 (78)
+#define BOOST_VMD_REGISTER_79 (79)
+#define BOOST_VMD_REGISTER_80 (80)
+#define BOOST_VMD_REGISTER_81 (81)
+#define BOOST_VMD_REGISTER_82 (82)
+#define BOOST_VMD_REGISTER_83 (83)
+#define BOOST_VMD_REGISTER_84 (84)
+#define BOOST_VMD_REGISTER_85 (85)
+#define BOOST_VMD_REGISTER_86 (86)
+#define BOOST_VMD_REGISTER_87 (87)
+#define BOOST_VMD_REGISTER_88 (88)
+#define BOOST_VMD_REGISTER_89 (89)
+#define BOOST_VMD_REGISTER_90 (90)
+#define BOOST_VMD_REGISTER_91 (91)
+#define BOOST_VMD_REGISTER_92 (92)
+#define BOOST_VMD_REGISTER_93 (93)
+#define BOOST_VMD_REGISTER_94 (94)
+#define BOOST_VMD_REGISTER_95 (95)
+#define BOOST_VMD_REGISTER_96 (96)
+#define BOOST_VMD_REGISTER_97 (97)
+#define BOOST_VMD_REGISTER_98 (98)
+#define BOOST_VMD_REGISTER_99 (99)
+#define BOOST_VMD_REGISTER_100 (100)
+#define BOOST_VMD_REGISTER_101 (101)
+#define BOOST_VMD_REGISTER_102 (102)
+#define BOOST_VMD_REGISTER_103 (103)
+#define BOOST_VMD_REGISTER_104 (104)
+#define BOOST_VMD_REGISTER_105 (105)
+#define BOOST_VMD_REGISTER_106 (106)
+#define BOOST_VMD_REGISTER_107 (107)
+#define BOOST_VMD_REGISTER_108 (108)
+#define BOOST_VMD_REGISTER_109 (109)
+#define BOOST_VMD_REGISTER_110 (110)
+#define BOOST_VMD_REGISTER_111 (111)
+#define BOOST_VMD_REGISTER_112 (112)
+#define BOOST_VMD_REGISTER_113 (113)
+#define BOOST_VMD_REGISTER_114 (114)
+#define BOOST_VMD_REGISTER_115 (115)
+#define BOOST_VMD_REGISTER_116 (116)
+#define BOOST_VMD_REGISTER_117 (117)
+#define BOOST_VMD_REGISTER_118 (118)
+#define BOOST_VMD_REGISTER_119 (119)
+#define BOOST_VMD_REGISTER_120 (120)
+#define BOOST_VMD_REGISTER_121 (121)
+#define BOOST_VMD_REGISTER_122 (122)
+#define BOOST_VMD_REGISTER_123 (123)
+#define BOOST_VMD_REGISTER_124 (124)
+#define BOOST_VMD_REGISTER_125 (125)
+#define BOOST_VMD_REGISTER_126 (126)
+#define BOOST_VMD_REGISTER_127 (127)
+#define BOOST_VMD_REGISTER_128 (128)
+#define BOOST_VMD_REGISTER_129 (129)
+#define BOOST_VMD_REGISTER_130 (130)
+#define BOOST_VMD_REGISTER_131 (131)
+#define BOOST_VMD_REGISTER_132 (132)
+#define BOOST_VMD_REGISTER_133 (133)
+#define BOOST_VMD_REGISTER_134 (134)
+#define BOOST_VMD_REGISTER_135 (135)
+#define BOOST_VMD_REGISTER_136 (136)
+#define BOOST_VMD_REGISTER_137 (137)
+#define BOOST_VMD_REGISTER_138 (138)
+#define BOOST_VMD_REGISTER_139 (139)
+#define BOOST_VMD_REGISTER_140 (140)
+#define BOOST_VMD_REGISTER_141 (141)
+#define BOOST_VMD_REGISTER_142 (142)
+#define BOOST_VMD_REGISTER_143 (143)
+#define BOOST_VMD_REGISTER_144 (144)
+#define BOOST_VMD_REGISTER_145 (145)
+#define BOOST_VMD_REGISTER_146 (146)
+#define BOOST_VMD_REGISTER_147 (147)
+#define BOOST_VMD_REGISTER_148 (148)
+#define BOOST_VMD_REGISTER_149 (149)
+#define BOOST_VMD_REGISTER_150 (150)
+#define BOOST_VMD_REGISTER_151 (151)
+#define BOOST_VMD_REGISTER_152 (152)
+#define BOOST_VMD_REGISTER_153 (153)
+#define BOOST_VMD_REGISTER_154 (154)
+#define BOOST_VMD_REGISTER_155 (155)
+#define BOOST_VMD_REGISTER_156 (156)
+#define BOOST_VMD_REGISTER_157 (157)
+#define BOOST_VMD_REGISTER_158 (158)
+#define BOOST_VMD_REGISTER_159 (159)
+#define BOOST_VMD_REGISTER_160 (160)
+#define BOOST_VMD_REGISTER_161 (161)
+#define BOOST_VMD_REGISTER_162 (162)
+#define BOOST_VMD_REGISTER_163 (163)
+#define BOOST_VMD_REGISTER_164 (164)
+#define BOOST_VMD_REGISTER_165 (165)
+#define BOOST_VMD_REGISTER_166 (166)
+#define BOOST_VMD_REGISTER_167 (167)
+#define BOOST_VMD_REGISTER_168 (168)
+#define BOOST_VMD_REGISTER_169 (169)
+#define BOOST_VMD_REGISTER_170 (170)
+#define BOOST_VMD_REGISTER_171 (171)
+#define BOOST_VMD_REGISTER_172 (172)
+#define BOOST_VMD_REGISTER_173 (173)
+#define BOOST_VMD_REGISTER_174 (174)
+#define BOOST_VMD_REGISTER_175 (175)
+#define BOOST_VMD_REGISTER_176 (176)
+#define BOOST_VMD_REGISTER_177 (177)
+#define BOOST_VMD_REGISTER_178 (178)
+#define BOOST_VMD_REGISTER_179 (179)
+#define BOOST_VMD_REGISTER_180 (180)
+#define BOOST_VMD_REGISTER_181 (181)
+#define BOOST_VMD_REGISTER_182 (182)
+#define BOOST_VMD_REGISTER_183 (183)
+#define BOOST_VMD_REGISTER_184 (184)
+#define BOOST_VMD_REGISTER_185 (185)
+#define BOOST_VMD_REGISTER_186 (186)
+#define BOOST_VMD_REGISTER_187 (187)
+#define BOOST_VMD_REGISTER_188 (188)
+#define BOOST_VMD_REGISTER_189 (189)
+#define BOOST_VMD_REGISTER_190 (190)
+#define BOOST_VMD_REGISTER_191 (191)
+#define BOOST_VMD_REGISTER_192 (192)
+#define BOOST_VMD_REGISTER_193 (193)
+#define BOOST_VMD_REGISTER_194 (194)
+#define BOOST_VMD_REGISTER_195 (195)
+#define BOOST_VMD_REGISTER_196 (196)
+#define BOOST_VMD_REGISTER_197 (197)
+#define BOOST_VMD_REGISTER_198 (198)
+#define BOOST_VMD_REGISTER_199 (199)
+#define BOOST_VMD_REGISTER_200 (200)
+#define BOOST_VMD_REGISTER_201 (201)
+#define BOOST_VMD_REGISTER_202 (202)
+#define BOOST_VMD_REGISTER_203 (203)
+#define BOOST_VMD_REGISTER_204 (204)
+#define BOOST_VMD_REGISTER_205 (205)
+#define BOOST_VMD_REGISTER_206 (206)
+#define BOOST_VMD_REGISTER_207 (207)
+#define BOOST_VMD_REGISTER_208 (208)
+#define BOOST_VMD_REGISTER_209 (209)
+#define BOOST_VMD_REGISTER_210 (210)
+#define BOOST_VMD_REGISTER_211 (211)
+#define BOOST_VMD_REGISTER_212 (212)
+#define BOOST_VMD_REGISTER_213 (213)
+#define BOOST_VMD_REGISTER_214 (214)
+#define BOOST_VMD_REGISTER_215 (215)
+#define BOOST_VMD_REGISTER_216 (216)
+#define BOOST_VMD_REGISTER_217 (217)
+#define BOOST_VMD_REGISTER_218 (218)
+#define BOOST_VMD_REGISTER_219 (219)
+#define BOOST_VMD_REGISTER_220 (220)
+#define BOOST_VMD_REGISTER_221 (221)
+#define BOOST_VMD_REGISTER_222 (222)
+#define BOOST_VMD_REGISTER_223 (223)
+#define BOOST_VMD_REGISTER_224 (224)
+#define BOOST_VMD_REGISTER_225 (225)
+#define BOOST_VMD_REGISTER_226 (226)
+#define BOOST_VMD_REGISTER_227 (227)
+#define BOOST_VMD_REGISTER_228 (228)
+#define BOOST_VMD_REGISTER_229 (229)
+#define BOOST_VMD_REGISTER_230 (230)
+#define BOOST_VMD_REGISTER_231 (231)
+#define BOOST_VMD_REGISTER_232 (232)
+#define BOOST_VMD_REGISTER_233 (233)
+#define BOOST_VMD_REGISTER_234 (234)
+#define BOOST_VMD_REGISTER_235 (235)
+#define BOOST_VMD_REGISTER_236 (236)
+#define BOOST_VMD_REGISTER_237 (237)
+#define BOOST_VMD_REGISTER_238 (238)
+#define BOOST_VMD_REGISTER_239 (239)
+#define BOOST_VMD_REGISTER_240 (240)
+#define BOOST_VMD_REGISTER_241 (241)
+#define BOOST_VMD_REGISTER_242 (242)
+#define BOOST_VMD_REGISTER_243 (243)
+#define BOOST_VMD_REGISTER_244 (244)
+#define BOOST_VMD_REGISTER_245 (245)
+#define BOOST_VMD_REGISTER_246 (246)
+#define BOOST_VMD_REGISTER_247 (247)
+#define BOOST_VMD_REGISTER_248 (248)
+#define BOOST_VMD_REGISTER_249 (249)
+#define BOOST_VMD_REGISTER_250 (250)
+#define BOOST_VMD_REGISTER_251 (251)
+#define BOOST_VMD_REGISTER_252 (252)
+#define BOOST_VMD_REGISTER_253 (253)
+#define BOOST_VMD_REGISTER_254 (254)
+#define BOOST_VMD_REGISTER_255 (255)
+#define BOOST_VMD_REGISTER_256 (256)
+
+#define BOOST_VMD_DETECT_0_0
+#define BOOST_VMD_DETECT_1_1
+#define BOOST_VMD_DETECT_2_2
+#define BOOST_VMD_DETECT_3_3
+#define BOOST_VMD_DETECT_4_4
+#define BOOST_VMD_DETECT_5_5
+#define BOOST_VMD_DETECT_6_6
+#define BOOST_VMD_DETECT_7_7
+#define BOOST_VMD_DETECT_8_8
+#define BOOST_VMD_DETECT_9_9
+#define BOOST_VMD_DETECT_10_10
+#define BOOST_VMD_DETECT_11_11
+#define BOOST_VMD_DETECT_12_12
+#define BOOST_VMD_DETECT_13_13
+#define BOOST_VMD_DETECT_14_14
+#define BOOST_VMD_DETECT_15_15
+#define BOOST_VMD_DETECT_16_16
+#define BOOST_VMD_DETECT_17_17
+#define BOOST_VMD_DETECT_18_18
+#define BOOST_VMD_DETECT_19_19
+#define BOOST_VMD_DETECT_20_20
+#define BOOST_VMD_DETECT_21_21
+#define BOOST_VMD_DETECT_22_22
+#define BOOST_VMD_DETECT_23_23
+#define BOOST_VMD_DETECT_24_24
+#define BOOST_VMD_DETECT_25_25
+#define BOOST_VMD_DETECT_26_26
+#define BOOST_VMD_DETECT_27_27
+#define BOOST_VMD_DETECT_28_28
+#define BOOST_VMD_DETECT_29_29
+#define BOOST_VMD_DETECT_30_30
+#define BOOST_VMD_DETECT_31_31
+#define BOOST_VMD_DETECT_32_32
+#define BOOST_VMD_DETECT_33_33
+#define BOOST_VMD_DETECT_34_34
+#define BOOST_VMD_DETECT_35_35
+#define BOOST_VMD_DETECT_36_36
+#define BOOST_VMD_DETECT_37_37
+#define BOOST_VMD_DETECT_38_38
+#define BOOST_VMD_DETECT_39_39
+#define BOOST_VMD_DETECT_40_40
+#define BOOST_VMD_DETECT_41_41
+#define BOOST_VMD_DETECT_42_42
+#define BOOST_VMD_DETECT_43_43
+#define BOOST_VMD_DETECT_44_44
+#define BOOST_VMD_DETECT_45_45
+#define BOOST_VMD_DETECT_46_46
+#define BOOST_VMD_DETECT_47_47
+#define BOOST_VMD_DETECT_48_48
+#define BOOST_VMD_DETECT_49_49
+#define BOOST_VMD_DETECT_50_50
+#define BOOST_VMD_DETECT_51_51
+#define BOOST_VMD_DETECT_52_52
+#define BOOST_VMD_DETECT_53_53
+#define BOOST_VMD_DETECT_54_54
+#define BOOST_VMD_DETECT_55_55
+#define BOOST_VMD_DETECT_56_56
+#define BOOST_VMD_DETECT_57_57
+#define BOOST_VMD_DETECT_58_58
+#define BOOST_VMD_DETECT_59_59
+#define BOOST_VMD_DETECT_60_60
+#define BOOST_VMD_DETECT_61_61
+#define BOOST_VMD_DETECT_62_62
+#define BOOST_VMD_DETECT_63_63
+#define BOOST_VMD_DETECT_64_64
+#define BOOST_VMD_DETECT_65_65
+#define BOOST_VMD_DETECT_66_66
+#define BOOST_VMD_DETECT_67_67
+#define BOOST_VMD_DETECT_68_68
+#define BOOST_VMD_DETECT_69_69
+#define BOOST_VMD_DETECT_70_70
+#define BOOST_VMD_DETECT_71_71
+#define BOOST_VMD_DETECT_72_72
+#define BOOST_VMD_DETECT_73_73
+#define BOOST_VMD_DETECT_74_74
+#define BOOST_VMD_DETECT_75_75
+#define BOOST_VMD_DETECT_76_76
+#define BOOST_VMD_DETECT_77_77
+#define BOOST_VMD_DETECT_78_78
+#define BOOST_VMD_DETECT_79_79
+#define BOOST_VMD_DETECT_80_80
+#define BOOST_VMD_DETECT_81_81
+#define BOOST_VMD_DETECT_82_82
+#define BOOST_VMD_DETECT_83_83
+#define BOOST_VMD_DETECT_84_84
+#define BOOST_VMD_DETECT_85_85
+#define BOOST_VMD_DETECT_86_86
+#define BOOST_VMD_DETECT_87_87
+#define BOOST_VMD_DETECT_88_88
+#define BOOST_VMD_DETECT_89_89
+#define BOOST_VMD_DETECT_90_90
+#define BOOST_VMD_DETECT_91_91
+#define BOOST_VMD_DETECT_92_92
+#define BOOST_VMD_DETECT_93_93
+#define BOOST_VMD_DETECT_94_94
+#define BOOST_VMD_DETECT_95_95
+#define BOOST_VMD_DETECT_96_96
+#define BOOST_VMD_DETECT_97_97
+#define BOOST_VMD_DETECT_98_98
+#define BOOST_VMD_DETECT_99_99
+#define BOOST_VMD_DETECT_100_100
+#define BOOST_VMD_DETECT_101_101
+#define BOOST_VMD_DETECT_102_102
+#define BOOST_VMD_DETECT_103_103
+#define BOOST_VMD_DETECT_104_104
+#define BOOST_VMD_DETECT_105_105
+#define BOOST_VMD_DETECT_106_106
+#define BOOST_VMD_DETECT_107_107
+#define BOOST_VMD_DETECT_108_108
+#define BOOST_VMD_DETECT_109_109
+#define BOOST_VMD_DETECT_110_110
+#define BOOST_VMD_DETECT_111_111
+#define BOOST_VMD_DETECT_112_112
+#define BOOST_VMD_DETECT_113_113
+#define BOOST_VMD_DETECT_114_114
+#define BOOST_VMD_DETECT_115_115
+#define BOOST_VMD_DETECT_116_116
+#define BOOST_VMD_DETECT_117_117
+#define BOOST_VMD_DETECT_118_118
+#define BOOST_VMD_DETECT_119_119
+#define BOOST_VMD_DETECT_120_120
+#define BOOST_VMD_DETECT_121_121
+#define BOOST_VMD_DETECT_122_122
+#define BOOST_VMD_DETECT_123_123
+#define BOOST_VMD_DETECT_124_124
+#define BOOST_VMD_DETECT_125_125
+#define BOOST_VMD_DETECT_126_126
+#define BOOST_VMD_DETECT_127_127
+#define BOOST_VMD_DETECT_128_128
+#define BOOST_VMD_DETECT_129_129
+#define BOOST_VMD_DETECT_130_130
+#define BOOST_VMD_DETECT_131_131
+#define BOOST_VMD_DETECT_132_132
+#define BOOST_VMD_DETECT_133_133
+#define BOOST_VMD_DETECT_134_134
+#define BOOST_VMD_DETECT_135_135
+#define BOOST_VMD_DETECT_136_136
+#define BOOST_VMD_DETECT_137_137
+#define BOOST_VMD_DETECT_138_138
+#define BOOST_VMD_DETECT_139_139
+#define BOOST_VMD_DETECT_140_140
+#define BOOST_VMD_DETECT_141_141
+#define BOOST_VMD_DETECT_142_142
+#define BOOST_VMD_DETECT_143_143
+#define BOOST_VMD_DETECT_144_144
+#define BOOST_VMD_DETECT_145_145
+#define BOOST_VMD_DETECT_146_146
+#define BOOST_VMD_DETECT_147_147
+#define BOOST_VMD_DETECT_148_148
+#define BOOST_VMD_DETECT_149_149
+#define BOOST_VMD_DETECT_150_150
+#define BOOST_VMD_DETECT_151_151
+#define BOOST_VMD_DETECT_152_152
+#define BOOST_VMD_DETECT_153_153
+#define BOOST_VMD_DETECT_154_154
+#define BOOST_VMD_DETECT_155_155
+#define BOOST_VMD_DETECT_156_156
+#define BOOST_VMD_DETECT_157_157
+#define BOOST_VMD_DETECT_158_158
+#define BOOST_VMD_DETECT_159_159
+#define BOOST_VMD_DETECT_160_160
+#define BOOST_VMD_DETECT_161_161
+#define BOOST_VMD_DETECT_162_162
+#define BOOST_VMD_DETECT_163_163
+#define BOOST_VMD_DETECT_164_164
+#define BOOST_VMD_DETECT_165_165
+#define BOOST_VMD_DETECT_166_166
+#define BOOST_VMD_DETECT_167_167
+#define BOOST_VMD_DETECT_168_168
+#define BOOST_VMD_DETECT_169_169
+#define BOOST_VMD_DETECT_170_170
+#define BOOST_VMD_DETECT_171_171
+#define BOOST_VMD_DETECT_172_172
+#define BOOST_VMD_DETECT_173_173
+#define BOOST_VMD_DETECT_174_174
+#define BOOST_VMD_DETECT_175_175
+#define BOOST_VMD_DETECT_176_176
+#define BOOST_VMD_DETECT_177_177
+#define BOOST_VMD_DETECT_178_178
+#define BOOST_VMD_DETECT_179_179
+#define BOOST_VMD_DETECT_180_180
+#define BOOST_VMD_DETECT_181_181
+#define BOOST_VMD_DETECT_182_182
+#define BOOST_VMD_DETECT_183_183
+#define BOOST_VMD_DETECT_184_184
+#define BOOST_VMD_DETECT_185_185
+#define BOOST_VMD_DETECT_186_186
+#define BOOST_VMD_DETECT_187_187
+#define BOOST_VMD_DETECT_188_188
+#define BOOST_VMD_DETECT_189_189
+#define BOOST_VMD_DETECT_190_190
+#define BOOST_VMD_DETECT_191_191
+#define BOOST_VMD_DETECT_192_192
+#define BOOST_VMD_DETECT_193_193
+#define BOOST_VMD_DETECT_194_194
+#define BOOST_VMD_DETECT_195_195
+#define BOOST_VMD_DETECT_196_196
+#define BOOST_VMD_DETECT_197_197
+#define BOOST_VMD_DETECT_198_198
+#define BOOST_VMD_DETECT_199_199
+#define BOOST_VMD_DETECT_200_200
+#define BOOST_VMD_DETECT_201_201
+#define BOOST_VMD_DETECT_202_202
+#define BOOST_VMD_DETECT_203_203
+#define BOOST_VMD_DETECT_204_204
+#define BOOST_VMD_DETECT_205_205
+#define BOOST_VMD_DETECT_206_206
+#define BOOST_VMD_DETECT_207_207
+#define BOOST_VMD_DETECT_208_208
+#define BOOST_VMD_DETECT_209_209
+#define BOOST_VMD_DETECT_210_210
+#define BOOST_VMD_DETECT_211_211
+#define BOOST_VMD_DETECT_212_212
+#define BOOST_VMD_DETECT_213_213
+#define BOOST_VMD_DETECT_214_214
+#define BOOST_VMD_DETECT_215_215
+#define BOOST_VMD_DETECT_216_216
+#define BOOST_VMD_DETECT_217_217
+#define BOOST_VMD_DETECT_218_218
+#define BOOST_VMD_DETECT_219_219
+#define BOOST_VMD_DETECT_220_220
+#define BOOST_VMD_DETECT_221_221
+#define BOOST_VMD_DETECT_222_222
+#define BOOST_VMD_DETECT_223_223
+#define BOOST_VMD_DETECT_224_224
+#define BOOST_VMD_DETECT_225_225
+#define BOOST_VMD_DETECT_226_226
+#define BOOST_VMD_DETECT_227_227
+#define BOOST_VMD_DETECT_228_228
+#define BOOST_VMD_DETECT_229_229
+#define BOOST_VMD_DETECT_230_230
+#define BOOST_VMD_DETECT_231_231
+#define BOOST_VMD_DETECT_232_232
+#define BOOST_VMD_DETECT_233_233
+#define BOOST_VMD_DETECT_234_234
+#define BOOST_VMD_DETECT_235_235
+#define BOOST_VMD_DETECT_236_236
+#define BOOST_VMD_DETECT_237_237
+#define BOOST_VMD_DETECT_238_238
+#define BOOST_VMD_DETECT_239_239
+#define BOOST_VMD_DETECT_240_240
+#define BOOST_VMD_DETECT_241_241
+#define BOOST_VMD_DETECT_242_242
+#define BOOST_VMD_DETECT_243_243
+#define BOOST_VMD_DETECT_244_244
+#define BOOST_VMD_DETECT_245_245
+#define BOOST_VMD_DETECT_246_246
+#define BOOST_VMD_DETECT_247_247
+#define BOOST_VMD_DETECT_248_248
+#define BOOST_VMD_DETECT_249_249
+#define BOOST_VMD_DETECT_250_250
+#define BOOST_VMD_DETECT_251_251
+#define BOOST_VMD_DETECT_252_252
+#define BOOST_VMD_DETECT_253_253
+#define BOOST_VMD_DETECT_254_254
+#define BOOST_VMD_DETECT_255_255
+#define BOOST_VMD_DETECT_256_256
+
+#define BOOST_VMD_SUBTYPE_REGISTER_0 (BOOST_VMD_TYPE_NUMBER,0)
+#define BOOST_VMD_SUBTYPE_REGISTER_1 (BOOST_VMD_TYPE_NUMBER,1)
+#define BOOST_VMD_SUBTYPE_REGISTER_2 (BOOST_VMD_TYPE_NUMBER,2)
+#define BOOST_VMD_SUBTYPE_REGISTER_3 (BOOST_VMD_TYPE_NUMBER,3)
+#define BOOST_VMD_SUBTYPE_REGISTER_4 (BOOST_VMD_TYPE_NUMBER,4)
+#define BOOST_VMD_SUBTYPE_REGISTER_5 (BOOST_VMD_TYPE_NUMBER,5)
+#define BOOST_VMD_SUBTYPE_REGISTER_6 (BOOST_VMD_TYPE_NUMBER,6)
+#define BOOST_VMD_SUBTYPE_REGISTER_7 (BOOST_VMD_TYPE_NUMBER,7)
+#define BOOST_VMD_SUBTYPE_REGISTER_8 (BOOST_VMD_TYPE_NUMBER,8)
+#define BOOST_VMD_SUBTYPE_REGISTER_9 (BOOST_VMD_TYPE_NUMBER,9)
+#define BOOST_VMD_SUBTYPE_REGISTER_10 (BOOST_VMD_TYPE_NUMBER,10)
+#define BOOST_VMD_SUBTYPE_REGISTER_11 (BOOST_VMD_TYPE_NUMBER,11)
+#define BOOST_VMD_SUBTYPE_REGISTER_12 (BOOST_VMD_TYPE_NUMBER,12)
+#define BOOST_VMD_SUBTYPE_REGISTER_13 (BOOST_VMD_TYPE_NUMBER,13)
+#define BOOST_VMD_SUBTYPE_REGISTER_14 (BOOST_VMD_TYPE_NUMBER,14)
+#define BOOST_VMD_SUBTYPE_REGISTER_15 (BOOST_VMD_TYPE_NUMBER,15)
+#define BOOST_VMD_SUBTYPE_REGISTER_16 (BOOST_VMD_TYPE_NUMBER,16)
+#define BOOST_VMD_SUBTYPE_REGISTER_17 (BOOST_VMD_TYPE_NUMBER,17)
+#define BOOST_VMD_SUBTYPE_REGISTER_18 (BOOST_VMD_TYPE_NUMBER,18)
+#define BOOST_VMD_SUBTYPE_REGISTER_19 (BOOST_VMD_TYPE_NUMBER,19)
+#define BOOST_VMD_SUBTYPE_REGISTER_20 (BOOST_VMD_TYPE_NUMBER,20)
+#define BOOST_VMD_SUBTYPE_REGISTER_21 (BOOST_VMD_TYPE_NUMBER,21)
+#define BOOST_VMD_SUBTYPE_REGISTER_22 (BOOST_VMD_TYPE_NUMBER,22)
+#define BOOST_VMD_SUBTYPE_REGISTER_23 (BOOST_VMD_TYPE_NUMBER,23)
+#define BOOST_VMD_SUBTYPE_REGISTER_24 (BOOST_VMD_TYPE_NUMBER,24)
+#define BOOST_VMD_SUBTYPE_REGISTER_25 (BOOST_VMD_TYPE_NUMBER,25)
+#define BOOST_VMD_SUBTYPE_REGISTER_26 (BOOST_VMD_TYPE_NUMBER,26)
+#define BOOST_VMD_SUBTYPE_REGISTER_27 (BOOST_VMD_TYPE_NUMBER,27)
+#define BOOST_VMD_SUBTYPE_REGISTER_28 (BOOST_VMD_TYPE_NUMBER,28)
+#define BOOST_VMD_SUBTYPE_REGISTER_29 (BOOST_VMD_TYPE_NUMBER,29)
+#define BOOST_VMD_SUBTYPE_REGISTER_30 (BOOST_VMD_TYPE_NUMBER,30)
+#define BOOST_VMD_SUBTYPE_REGISTER_31 (BOOST_VMD_TYPE_NUMBER,31)
+#define BOOST_VMD_SUBTYPE_REGISTER_32 (BOOST_VMD_TYPE_NUMBER,32)
+#define BOOST_VMD_SUBTYPE_REGISTER_33 (BOOST_VMD_TYPE_NUMBER,33)
+#define BOOST_VMD_SUBTYPE_REGISTER_34 (BOOST_VMD_TYPE_NUMBER,34)
+#define BOOST_VMD_SUBTYPE_REGISTER_35 (BOOST_VMD_TYPE_NUMBER,35)
+#define BOOST_VMD_SUBTYPE_REGISTER_36 (BOOST_VMD_TYPE_NUMBER,36)
+#define BOOST_VMD_SUBTYPE_REGISTER_37 (BOOST_VMD_TYPE_NUMBER,37)
+#define BOOST_VMD_SUBTYPE_REGISTER_38 (BOOST_VMD_TYPE_NUMBER,38)
+#define BOOST_VMD_SUBTYPE_REGISTER_39 (BOOST_VMD_TYPE_NUMBER,39)
+#define BOOST_VMD_SUBTYPE_REGISTER_40 (BOOST_VMD_TYPE_NUMBER,40)
+#define BOOST_VMD_SUBTYPE_REGISTER_41 (BOOST_VMD_TYPE_NUMBER,41)
+#define BOOST_VMD_SUBTYPE_REGISTER_42 (BOOST_VMD_TYPE_NUMBER,42)
+#define BOOST_VMD_SUBTYPE_REGISTER_43 (BOOST_VMD_TYPE_NUMBER,43)
+#define BOOST_VMD_SUBTYPE_REGISTER_44 (BOOST_VMD_TYPE_NUMBER,44)
+#define BOOST_VMD_SUBTYPE_REGISTER_45 (BOOST_VMD_TYPE_NUMBER,45)
+#define BOOST_VMD_SUBTYPE_REGISTER_46 (BOOST_VMD_TYPE_NUMBER,46)
+#define BOOST_VMD_SUBTYPE_REGISTER_47 (BOOST_VMD_TYPE_NUMBER,47)
+#define BOOST_VMD_SUBTYPE_REGISTER_48 (BOOST_VMD_TYPE_NUMBER,48)
+#define BOOST_VMD_SUBTYPE_REGISTER_49 (BOOST_VMD_TYPE_NUMBER,49)
+#define BOOST_VMD_SUBTYPE_REGISTER_50 (BOOST_VMD_TYPE_NUMBER,50)
+#define BOOST_VMD_SUBTYPE_REGISTER_51 (BOOST_VMD_TYPE_NUMBER,51)
+#define BOOST_VMD_SUBTYPE_REGISTER_52 (BOOST_VMD_TYPE_NUMBER,52)
+#define BOOST_VMD_SUBTYPE_REGISTER_53 (BOOST_VMD_TYPE_NUMBER,53)
+#define BOOST_VMD_SUBTYPE_REGISTER_54 (BOOST_VMD_TYPE_NUMBER,54)
+#define BOOST_VMD_SUBTYPE_REGISTER_55 (BOOST_VMD_TYPE_NUMBER,55)
+#define BOOST_VMD_SUBTYPE_REGISTER_56 (BOOST_VMD_TYPE_NUMBER,56)
+#define BOOST_VMD_SUBTYPE_REGISTER_57 (BOOST_VMD_TYPE_NUMBER,57)
+#define BOOST_VMD_SUBTYPE_REGISTER_58 (BOOST_VMD_TYPE_NUMBER,58)
+#define BOOST_VMD_SUBTYPE_REGISTER_59 (BOOST_VMD_TYPE_NUMBER,59)
+#define BOOST_VMD_SUBTYPE_REGISTER_60 (BOOST_VMD_TYPE_NUMBER,60)
+#define BOOST_VMD_SUBTYPE_REGISTER_61 (BOOST_VMD_TYPE_NUMBER,61)
+#define BOOST_VMD_SUBTYPE_REGISTER_62 (BOOST_VMD_TYPE_NUMBER,62)
+#define BOOST_VMD_SUBTYPE_REGISTER_63 (BOOST_VMD_TYPE_NUMBER,63)
+#define BOOST_VMD_SUBTYPE_REGISTER_64 (BOOST_VMD_TYPE_NUMBER,64)
+#define BOOST_VMD_SUBTYPE_REGISTER_65 (BOOST_VMD_TYPE_NUMBER,65)
+#define BOOST_VMD_SUBTYPE_REGISTER_66 (BOOST_VMD_TYPE_NUMBER,66)
+#define BOOST_VMD_SUBTYPE_REGISTER_67 (BOOST_VMD_TYPE_NUMBER,67)
+#define BOOST_VMD_SUBTYPE_REGISTER_68 (BOOST_VMD_TYPE_NUMBER,68)
+#define BOOST_VMD_SUBTYPE_REGISTER_69 (BOOST_VMD_TYPE_NUMBER,69)
+#define BOOST_VMD_SUBTYPE_REGISTER_70 (BOOST_VMD_TYPE_NUMBER,70)
+#define BOOST_VMD_SUBTYPE_REGISTER_71 (BOOST_VMD_TYPE_NUMBER,71)
+#define BOOST_VMD_SUBTYPE_REGISTER_72 (BOOST_VMD_TYPE_NUMBER,72)
+#define BOOST_VMD_SUBTYPE_REGISTER_73 (BOOST_VMD_TYPE_NUMBER,73)
+#define BOOST_VMD_SUBTYPE_REGISTER_74 (BOOST_VMD_TYPE_NUMBER,74)
+#define BOOST_VMD_SUBTYPE_REGISTER_75 (BOOST_VMD_TYPE_NUMBER,75)
+#define BOOST_VMD_SUBTYPE_REGISTER_76 (BOOST_VMD_TYPE_NUMBER,76)
+#define BOOST_VMD_SUBTYPE_REGISTER_77 (BOOST_VMD_TYPE_NUMBER,77)
+#define BOOST_VMD_SUBTYPE_REGISTER_78 (BOOST_VMD_TYPE_NUMBER,78)
+#define BOOST_VMD_SUBTYPE_REGISTER_79 (BOOST_VMD_TYPE_NUMBER,79)
+#define BOOST_VMD_SUBTYPE_REGISTER_80 (BOOST_VMD_TYPE_NUMBER,80)
+#define BOOST_VMD_SUBTYPE_REGISTER_81 (BOOST_VMD_TYPE_NUMBER,81)
+#define BOOST_VMD_SUBTYPE_REGISTER_82 (BOOST_VMD_TYPE_NUMBER,82)
+#define BOOST_VMD_SUBTYPE_REGISTER_83 (BOOST_VMD_TYPE_NUMBER,83)
+#define BOOST_VMD_SUBTYPE_REGISTER_84 (BOOST_VMD_TYPE_NUMBER,84)
+#define BOOST_VMD_SUBTYPE_REGISTER_85 (BOOST_VMD_TYPE_NUMBER,85)
+#define BOOST_VMD_SUBTYPE_REGISTER_86 (BOOST_VMD_TYPE_NUMBER,86)
+#define BOOST_VMD_SUBTYPE_REGISTER_87 (BOOST_VMD_TYPE_NUMBER,87)
+#define BOOST_VMD_SUBTYPE_REGISTER_88 (BOOST_VMD_TYPE_NUMBER,88)
+#define BOOST_VMD_SUBTYPE_REGISTER_89 (BOOST_VMD_TYPE_NUMBER,89)
+#define BOOST_VMD_SUBTYPE_REGISTER_90 (BOOST_VMD_TYPE_NUMBER,90)
+#define BOOST_VMD_SUBTYPE_REGISTER_91 (BOOST_VMD_TYPE_NUMBER,91)
+#define BOOST_VMD_SUBTYPE_REGISTER_92 (BOOST_VMD_TYPE_NUMBER,92)
+#define BOOST_VMD_SUBTYPE_REGISTER_93 (BOOST_VMD_TYPE_NUMBER,93)
+#define BOOST_VMD_SUBTYPE_REGISTER_94 (BOOST_VMD_TYPE_NUMBER,94)
+#define BOOST_VMD_SUBTYPE_REGISTER_95 (BOOST_VMD_TYPE_NUMBER,95)
+#define BOOST_VMD_SUBTYPE_REGISTER_96 (BOOST_VMD_TYPE_NUMBER,96)
+#define BOOST_VMD_SUBTYPE_REGISTER_97 (BOOST_VMD_TYPE_NUMBER,97)
+#define BOOST_VMD_SUBTYPE_REGISTER_98 (BOOST_VMD_TYPE_NUMBER,98)
+#define BOOST_VMD_SUBTYPE_REGISTER_99 (BOOST_VMD_TYPE_NUMBER,99)
+#define BOOST_VMD_SUBTYPE_REGISTER_100 (BOOST_VMD_TYPE_NUMBER,100)
+#define BOOST_VMD_SUBTYPE_REGISTER_101 (BOOST_VMD_TYPE_NUMBER,101)
+#define BOOST_VMD_SUBTYPE_REGISTER_102 (BOOST_VMD_TYPE_NUMBER,102)
+#define BOOST_VMD_SUBTYPE_REGISTER_103 (BOOST_VMD_TYPE_NUMBER,103)
+#define BOOST_VMD_SUBTYPE_REGISTER_104 (BOOST_VMD_TYPE_NUMBER,104)
+#define BOOST_VMD_SUBTYPE_REGISTER_105 (BOOST_VMD_TYPE_NUMBER,105)
+#define BOOST_VMD_SUBTYPE_REGISTER_106 (BOOST_VMD_TYPE_NUMBER,106)
+#define BOOST_VMD_SUBTYPE_REGISTER_107 (BOOST_VMD_TYPE_NUMBER,107)
+#define BOOST_VMD_SUBTYPE_REGISTER_108 (BOOST_VMD_TYPE_NUMBER,108)
+#define BOOST_VMD_SUBTYPE_REGISTER_109 (BOOST_VMD_TYPE_NUMBER,109)
+#define BOOST_VMD_SUBTYPE_REGISTER_110 (BOOST_VMD_TYPE_NUMBER,110)
+#define BOOST_VMD_SUBTYPE_REGISTER_111 (BOOST_VMD_TYPE_NUMBER,111)
+#define BOOST_VMD_SUBTYPE_REGISTER_112 (BOOST_VMD_TYPE_NUMBER,112)
+#define BOOST_VMD_SUBTYPE_REGISTER_113 (BOOST_VMD_TYPE_NUMBER,113)
+#define BOOST_VMD_SUBTYPE_REGISTER_114 (BOOST_VMD_TYPE_NUMBER,114)
+#define BOOST_VMD_SUBTYPE_REGISTER_115 (BOOST_VMD_TYPE_NUMBER,115)
+#define BOOST_VMD_SUBTYPE_REGISTER_116 (BOOST_VMD_TYPE_NUMBER,116)
+#define BOOST_VMD_SUBTYPE_REGISTER_117 (BOOST_VMD_TYPE_NUMBER,117)
+#define BOOST_VMD_SUBTYPE_REGISTER_118 (BOOST_VMD_TYPE_NUMBER,118)
+#define BOOST_VMD_SUBTYPE_REGISTER_119 (BOOST_VMD_TYPE_NUMBER,119)
+#define BOOST_VMD_SUBTYPE_REGISTER_120 (BOOST_VMD_TYPE_NUMBER,120)
+#define BOOST_VMD_SUBTYPE_REGISTER_121 (BOOST_VMD_TYPE_NUMBER,121)
+#define BOOST_VMD_SUBTYPE_REGISTER_122 (BOOST_VMD_TYPE_NUMBER,122)
+#define BOOST_VMD_SUBTYPE_REGISTER_123 (BOOST_VMD_TYPE_NUMBER,123)
+#define BOOST_VMD_SUBTYPE_REGISTER_124 (BOOST_VMD_TYPE_NUMBER,124)
+#define BOOST_VMD_SUBTYPE_REGISTER_125 (BOOST_VMD_TYPE_NUMBER,125)
+#define BOOST_VMD_SUBTYPE_REGISTER_126 (BOOST_VMD_TYPE_NUMBER,126)
+#define BOOST_VMD_SUBTYPE_REGISTER_127 (BOOST_VMD_TYPE_NUMBER,127)
+#define BOOST_VMD_SUBTYPE_REGISTER_128 (BOOST_VMD_TYPE_NUMBER,128)
+#define BOOST_VMD_SUBTYPE_REGISTER_129 (BOOST_VMD_TYPE_NUMBER,129)
+#define BOOST_VMD_SUBTYPE_REGISTER_130 (BOOST_VMD_TYPE_NUMBER,130)
+#define BOOST_VMD_SUBTYPE_REGISTER_131 (BOOST_VMD_TYPE_NUMBER,131)
+#define BOOST_VMD_SUBTYPE_REGISTER_132 (BOOST_VMD_TYPE_NUMBER,132)
+#define BOOST_VMD_SUBTYPE_REGISTER_133 (BOOST_VMD_TYPE_NUMBER,133)
+#define BOOST_VMD_SUBTYPE_REGISTER_134 (BOOST_VMD_TYPE_NUMBER,134)
+#define BOOST_VMD_SUBTYPE_REGISTER_135 (BOOST_VMD_TYPE_NUMBER,135)
+#define BOOST_VMD_SUBTYPE_REGISTER_136 (BOOST_VMD_TYPE_NUMBER,136)
+#define BOOST_VMD_SUBTYPE_REGISTER_137 (BOOST_VMD_TYPE_NUMBER,137)
+#define BOOST_VMD_SUBTYPE_REGISTER_138 (BOOST_VMD_TYPE_NUMBER,138)
+#define BOOST_VMD_SUBTYPE_REGISTER_139 (BOOST_VMD_TYPE_NUMBER,139)
+#define BOOST_VMD_SUBTYPE_REGISTER_140 (BOOST_VMD_TYPE_NUMBER,140)
+#define BOOST_VMD_SUBTYPE_REGISTER_141 (BOOST_VMD_TYPE_NUMBER,141)
+#define BOOST_VMD_SUBTYPE_REGISTER_142 (BOOST_VMD_TYPE_NUMBER,142)
+#define BOOST_VMD_SUBTYPE_REGISTER_143 (BOOST_VMD_TYPE_NUMBER,143)
+#define BOOST_VMD_SUBTYPE_REGISTER_144 (BOOST_VMD_TYPE_NUMBER,144)
+#define BOOST_VMD_SUBTYPE_REGISTER_145 (BOOST_VMD_TYPE_NUMBER,145)
+#define BOOST_VMD_SUBTYPE_REGISTER_146 (BOOST_VMD_TYPE_NUMBER,146)
+#define BOOST_VMD_SUBTYPE_REGISTER_147 (BOOST_VMD_TYPE_NUMBER,147)
+#define BOOST_VMD_SUBTYPE_REGISTER_148 (BOOST_VMD_TYPE_NUMBER,148)
+#define BOOST_VMD_SUBTYPE_REGISTER_149 (BOOST_VMD_TYPE_NUMBER,149)
+#define BOOST_VMD_SUBTYPE_REGISTER_150 (BOOST_VMD_TYPE_NUMBER,150)
+#define BOOST_VMD_SUBTYPE_REGISTER_151 (BOOST_VMD_TYPE_NUMBER,151)
+#define BOOST_VMD_SUBTYPE_REGISTER_152 (BOOST_VMD_TYPE_NUMBER,152)
+#define BOOST_VMD_SUBTYPE_REGISTER_153 (BOOST_VMD_TYPE_NUMBER,153)
+#define BOOST_VMD_SUBTYPE_REGISTER_154 (BOOST_VMD_TYPE_NUMBER,154)
+#define BOOST_VMD_SUBTYPE_REGISTER_155 (BOOST_VMD_TYPE_NUMBER,155)
+#define BOOST_VMD_SUBTYPE_REGISTER_156 (BOOST_VMD_TYPE_NUMBER,156)
+#define BOOST_VMD_SUBTYPE_REGISTER_157 (BOOST_VMD_TYPE_NUMBER,157)
+#define BOOST_VMD_SUBTYPE_REGISTER_158 (BOOST_VMD_TYPE_NUMBER,158)
+#define BOOST_VMD_SUBTYPE_REGISTER_159 (BOOST_VMD_TYPE_NUMBER,159)
+#define BOOST_VMD_SUBTYPE_REGISTER_160 (BOOST_VMD_TYPE_NUMBER,160)
+#define BOOST_VMD_SUBTYPE_REGISTER_161 (BOOST_VMD_TYPE_NUMBER,161)
+#define BOOST_VMD_SUBTYPE_REGISTER_162 (BOOST_VMD_TYPE_NUMBER,162)
+#define BOOST_VMD_SUBTYPE_REGISTER_163 (BOOST_VMD_TYPE_NUMBER,163)
+#define BOOST_VMD_SUBTYPE_REGISTER_164 (BOOST_VMD_TYPE_NUMBER,164)
+#define BOOST_VMD_SUBTYPE_REGISTER_165 (BOOST_VMD_TYPE_NUMBER,165)
+#define BOOST_VMD_SUBTYPE_REGISTER_166 (BOOST_VMD_TYPE_NUMBER,166)
+#define BOOST_VMD_SUBTYPE_REGISTER_167 (BOOST_VMD_TYPE_NUMBER,167)
+#define BOOST_VMD_SUBTYPE_REGISTER_168 (BOOST_VMD_TYPE_NUMBER,168)
+#define BOOST_VMD_SUBTYPE_REGISTER_169 (BOOST_VMD_TYPE_NUMBER,169)
+#define BOOST_VMD_SUBTYPE_REGISTER_170 (BOOST_VMD_TYPE_NUMBER,170)
+#define BOOST_VMD_SUBTYPE_REGISTER_171 (BOOST_VMD_TYPE_NUMBER,171)
+#define BOOST_VMD_SUBTYPE_REGISTER_172 (BOOST_VMD_TYPE_NUMBER,172)
+#define BOOST_VMD_SUBTYPE_REGISTER_173 (BOOST_VMD_TYPE_NUMBER,173)
+#define BOOST_VMD_SUBTYPE_REGISTER_174 (BOOST_VMD_TYPE_NUMBER,174)
+#define BOOST_VMD_SUBTYPE_REGISTER_175 (BOOST_VMD_TYPE_NUMBER,175)
+#define BOOST_VMD_SUBTYPE_REGISTER_176 (BOOST_VMD_TYPE_NUMBER,176)
+#define BOOST_VMD_SUBTYPE_REGISTER_177 (BOOST_VMD_TYPE_NUMBER,177)
+#define BOOST_VMD_SUBTYPE_REGISTER_178 (BOOST_VMD_TYPE_NUMBER,178)
+#define BOOST_VMD_SUBTYPE_REGISTER_179 (BOOST_VMD_TYPE_NUMBER,179)
+#define BOOST_VMD_SUBTYPE_REGISTER_180 (BOOST_VMD_TYPE_NUMBER,180)
+#define BOOST_VMD_SUBTYPE_REGISTER_181 (BOOST_VMD_TYPE_NUMBER,181)
+#define BOOST_VMD_SUBTYPE_REGISTER_182 (BOOST_VMD_TYPE_NUMBER,182)
+#define BOOST_VMD_SUBTYPE_REGISTER_183 (BOOST_VMD_TYPE_NUMBER,183)
+#define BOOST_VMD_SUBTYPE_REGISTER_184 (BOOST_VMD_TYPE_NUMBER,184)
+#define BOOST_VMD_SUBTYPE_REGISTER_185 (BOOST_VMD_TYPE_NUMBER,185)
+#define BOOST_VMD_SUBTYPE_REGISTER_186 (BOOST_VMD_TYPE_NUMBER,186)
+#define BOOST_VMD_SUBTYPE_REGISTER_187 (BOOST_VMD_TYPE_NUMBER,187)
+#define BOOST_VMD_SUBTYPE_REGISTER_188 (BOOST_VMD_TYPE_NUMBER,188)
+#define BOOST_VMD_SUBTYPE_REGISTER_189 (BOOST_VMD_TYPE_NUMBER,189)
+#define BOOST_VMD_SUBTYPE_REGISTER_190 (BOOST_VMD_TYPE_NUMBER,190)
+#define BOOST_VMD_SUBTYPE_REGISTER_191 (BOOST_VMD_TYPE_NUMBER,191)
+#define BOOST_VMD_SUBTYPE_REGISTER_192 (BOOST_VMD_TYPE_NUMBER,192)
+#define BOOST_VMD_SUBTYPE_REGISTER_193 (BOOST_VMD_TYPE_NUMBER,193)
+#define BOOST_VMD_SUBTYPE_REGISTER_194 (BOOST_VMD_TYPE_NUMBER,194)
+#define BOOST_VMD_SUBTYPE_REGISTER_195 (BOOST_VMD_TYPE_NUMBER,195)
+#define BOOST_VMD_SUBTYPE_REGISTER_196 (BOOST_VMD_TYPE_NUMBER,196)
+#define BOOST_VMD_SUBTYPE_REGISTER_197 (BOOST_VMD_TYPE_NUMBER,197)
+#define BOOST_VMD_SUBTYPE_REGISTER_198 (BOOST_VMD_TYPE_NUMBER,198)
+#define BOOST_VMD_SUBTYPE_REGISTER_199 (BOOST_VMD_TYPE_NUMBER,199)
+#define BOOST_VMD_SUBTYPE_REGISTER_200 (BOOST_VMD_TYPE_NUMBER,200)
+#define BOOST_VMD_SUBTYPE_REGISTER_201 (BOOST_VMD_TYPE_NUMBER,201)
+#define BOOST_VMD_SUBTYPE_REGISTER_202 (BOOST_VMD_TYPE_NUMBER,202)
+#define BOOST_VMD_SUBTYPE_REGISTER_203 (BOOST_VMD_TYPE_NUMBER,203)
+#define BOOST_VMD_SUBTYPE_REGISTER_204 (BOOST_VMD_TYPE_NUMBER,204)
+#define BOOST_VMD_SUBTYPE_REGISTER_205 (BOOST_VMD_TYPE_NUMBER,205)
+#define BOOST_VMD_SUBTYPE_REGISTER_206 (BOOST_VMD_TYPE_NUMBER,206)
+#define BOOST_VMD_SUBTYPE_REGISTER_207 (BOOST_VMD_TYPE_NUMBER,207)
+#define BOOST_VMD_SUBTYPE_REGISTER_208 (BOOST_VMD_TYPE_NUMBER,208)
+#define BOOST_VMD_SUBTYPE_REGISTER_209 (BOOST_VMD_TYPE_NUMBER,209)
+#define BOOST_VMD_SUBTYPE_REGISTER_210 (BOOST_VMD_TYPE_NUMBER,210)
+#define BOOST_VMD_SUBTYPE_REGISTER_211 (BOOST_VMD_TYPE_NUMBER,211)
+#define BOOST_VMD_SUBTYPE_REGISTER_212 (BOOST_VMD_TYPE_NUMBER,212)
+#define BOOST_VMD_SUBTYPE_REGISTER_213 (BOOST_VMD_TYPE_NUMBER,213)
+#define BOOST_VMD_SUBTYPE_REGISTER_214 (BOOST_VMD_TYPE_NUMBER,214)
+#define BOOST_VMD_SUBTYPE_REGISTER_215 (BOOST_VMD_TYPE_NUMBER,215)
+#define BOOST_VMD_SUBTYPE_REGISTER_216 (BOOST_VMD_TYPE_NUMBER,216)
+#define BOOST_VMD_SUBTYPE_REGISTER_217 (BOOST_VMD_TYPE_NUMBER,217)
+#define BOOST_VMD_SUBTYPE_REGISTER_218 (BOOST_VMD_TYPE_NUMBER,218)
+#define BOOST_VMD_SUBTYPE_REGISTER_219 (BOOST_VMD_TYPE_NUMBER,219)
+#define BOOST_VMD_SUBTYPE_REGISTER_220 (BOOST_VMD_TYPE_NUMBER,220)
+#define BOOST_VMD_SUBTYPE_REGISTER_221 (BOOST_VMD_TYPE_NUMBER,221)
+#define BOOST_VMD_SUBTYPE_REGISTER_222 (BOOST_VMD_TYPE_NUMBER,222)
+#define BOOST_VMD_SUBTYPE_REGISTER_223 (BOOST_VMD_TYPE_NUMBER,223)
+#define BOOST_VMD_SUBTYPE_REGISTER_224 (BOOST_VMD_TYPE_NUMBER,224)
+#define BOOST_VMD_SUBTYPE_REGISTER_225 (BOOST_VMD_TYPE_NUMBER,225)
+#define BOOST_VMD_SUBTYPE_REGISTER_226 (BOOST_VMD_TYPE_NUMBER,226)
+#define BOOST_VMD_SUBTYPE_REGISTER_227 (BOOST_VMD_TYPE_NUMBER,227)
+#define BOOST_VMD_SUBTYPE_REGISTER_228 (BOOST_VMD_TYPE_NUMBER,228)
+#define BOOST_VMD_SUBTYPE_REGISTER_229 (BOOST_VMD_TYPE_NUMBER,229)
+#define BOOST_VMD_SUBTYPE_REGISTER_230 (BOOST_VMD_TYPE_NUMBER,230)
+#define BOOST_VMD_SUBTYPE_REGISTER_231 (BOOST_VMD_TYPE_NUMBER,231)
+#define BOOST_VMD_SUBTYPE_REGISTER_232 (BOOST_VMD_TYPE_NUMBER,232)
+#define BOOST_VMD_SUBTYPE_REGISTER_233 (BOOST_VMD_TYPE_NUMBER,233)
+#define BOOST_VMD_SUBTYPE_REGISTER_234 (BOOST_VMD_TYPE_NUMBER,234)
+#define BOOST_VMD_SUBTYPE_REGISTER_235 (BOOST_VMD_TYPE_NUMBER,235)
+#define BOOST_VMD_SUBTYPE_REGISTER_236 (BOOST_VMD_TYPE_NUMBER,236)
+#define BOOST_VMD_SUBTYPE_REGISTER_237 (BOOST_VMD_TYPE_NUMBER,237)
+#define BOOST_VMD_SUBTYPE_REGISTER_238 (BOOST_VMD_TYPE_NUMBER,238)
+#define BOOST_VMD_SUBTYPE_REGISTER_239 (BOOST_VMD_TYPE_NUMBER,239)
+#define BOOST_VMD_SUBTYPE_REGISTER_240 (BOOST_VMD_TYPE_NUMBER,240)
+#define BOOST_VMD_SUBTYPE_REGISTER_241 (BOOST_VMD_TYPE_NUMBER,241)
+#define BOOST_VMD_SUBTYPE_REGISTER_242 (BOOST_VMD_TYPE_NUMBER,242)
+#define BOOST_VMD_SUBTYPE_REGISTER_243 (BOOST_VMD_TYPE_NUMBER,243)
+#define BOOST_VMD_SUBTYPE_REGISTER_244 (BOOST_VMD_TYPE_NUMBER,244)
+#define BOOST_VMD_SUBTYPE_REGISTER_245 (BOOST_VMD_TYPE_NUMBER,245)
+#define BOOST_VMD_SUBTYPE_REGISTER_246 (BOOST_VMD_TYPE_NUMBER,246)
+#define BOOST_VMD_SUBTYPE_REGISTER_247 (BOOST_VMD_TYPE_NUMBER,247)
+#define BOOST_VMD_SUBTYPE_REGISTER_248 (BOOST_VMD_TYPE_NUMBER,248)
+#define BOOST_VMD_SUBTYPE_REGISTER_249 (BOOST_VMD_TYPE_NUMBER,249)
+#define BOOST_VMD_SUBTYPE_REGISTER_250 (BOOST_VMD_TYPE_NUMBER,250)
+#define BOOST_VMD_SUBTYPE_REGISTER_251 (BOOST_VMD_TYPE_NUMBER,251)
+#define BOOST_VMD_SUBTYPE_REGISTER_252 (BOOST_VMD_TYPE_NUMBER,252)
+#define BOOST_VMD_SUBTYPE_REGISTER_253 (BOOST_VMD_TYPE_NUMBER,253)
+#define BOOST_VMD_SUBTYPE_REGISTER_254 (BOOST_VMD_TYPE_NUMBER,254)
+#define BOOST_VMD_SUBTYPE_REGISTER_255 (BOOST_VMD_TYPE_NUMBER,255)
+#define BOOST_VMD_SUBTYPE_REGISTER_256 (BOOST_VMD_TYPE_NUMBER,256)
+
+#endif /* BOOST_VMD_DETAIL_IS_NUMBER_REGISTRATION_HPP */
diff --git a/boost/vmd/detail/only_after.hpp b/boost/vmd/detail/only_after.hpp
new file mode 100644
index 0000000000..c00d60c400
--- /dev/null
+++ b/boost/vmd/detail/only_after.hpp
@@ -0,0 +1,37 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_ONLY_AFTER_HPP)
+#define BOOST_VMD_DETAIL_ONLY_AFTER_HPP
+
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+
+/*
+
+ Determines whether or not the BOOST_VMD_RETURN_ONLY_AFTER modifiers has been passed
+ as a variadic parameter.
+
+ Returns 1 = BOOST_VMD_RETURN_ONLY_AFTER has been passed
+ 0 = BOOST_VMD_RETURN_ONLY_AFTER has not been passed
+
+*/
+
+#define BOOST_VMD_DETAIL_ONLY_AFTER(...) \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_ONLY_AFTER_D(d,...) \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_ONLY_AFTER_HPP */
diff --git a/boost/vmd/detail/parens.hpp b/boost/vmd/detail/parens.hpp
new file mode 100644
index 0000000000..669b136d77
--- /dev/null
+++ b/boost/vmd/detail/parens.hpp
@@ -0,0 +1,54 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_PARENS_HPP)
+#define BOOST_VMD_DETAIL_PARENS_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/parens_split.hpp>
+#include <boost/vmd/detail/parens_common.hpp>
+
+#define BOOST_VMD_DETAIL_PARENS_PROCESS(vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_BEGIN_PARENS, \
+ BOOST_VMD_EMPTY \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_PARENS(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_PARENS_SPLIT, \
+ BOOST_VMD_DETAIL_PARENS_PROCESS \
+ ) \
+ (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_PARENS_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_PARENS_SPLIT, \
+ BOOST_VMD_DETAIL_PARENS_PROCESS \
+ ) \
+ (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_PARENS_HPP */
diff --git a/boost/vmd/detail/parens_common.hpp b/boost/vmd/detail/parens_common.hpp
new file mode 100644
index 0000000000..3a323ed432
--- /dev/null
+++ b/boost/vmd/detail/parens_common.hpp
@@ -0,0 +1,21 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_PARENS_COMMON_HPP)
+#define BOOST_VMD_DETAIL_PARENS_COMMON_HPP
+
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/punctuation/paren.hpp>
+#include <boost/vmd/empty.hpp>
+
+#define BOOST_VMD_DETAIL_BEGIN_PARENS_EXP2(...) ( __VA_ARGS__ ) BOOST_VMD_EMPTY BOOST_PP_LPAREN()
+#define BOOST_VMD_DETAIL_BEGIN_PARENS_EXP1(vseq) BOOST_VMD_DETAIL_BEGIN_PARENS_EXP2 vseq BOOST_PP_RPAREN()
+#define BOOST_VMD_DETAIL_BEGIN_PARENS(vseq) BOOST_PP_EXPAND(BOOST_VMD_DETAIL_BEGIN_PARENS_EXP1(vseq))
+
+#define BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq) BOOST_VMD_EMPTY vseq
+#define BOOST_VMD_DETAIL_SPLIT_PARENS(vseq) (BOOST_VMD_DETAIL_BEGIN_PARENS(vseq),BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq))
+
+#endif /* BOOST_VMD_DETAIL_PARENS_COMMON_HPP */
diff --git a/boost/vmd/detail/parens_split.hpp b/boost/vmd/detail/parens_split.hpp
new file mode 100644
index 0000000000..ed90cdf4c6
--- /dev/null
+++ b/boost/vmd/detail/parens_split.hpp
@@ -0,0 +1,24 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_PARENS_SPLIT_HPP)
+#define BOOST_VMD_DETAIL_PARENS_SPLIT_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/vmd/detail/empty_result.hpp>
+#include <boost/vmd/detail/parens_common.hpp>
+
+#define BOOST_VMD_DETAIL_PARENS_SPLIT(vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_SPLIT_PARENS, \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (vseq) \
+/**/
+#endif /* BOOST_VMD_DETAIL_PARENS_SPLIT_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_1.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_1.hpp
new file mode 100644
index 0000000000..3ff4c11227
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_1.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_1_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_1_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_1_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_10.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_10.hpp
new file mode 100644
index 0000000000..3c36ea94d6
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_10.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_10_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_10_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_10_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_11.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_11.hpp
new file mode 100644
index 0000000000..b5a8fabde7
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_11.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_11_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_11_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_11_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_12.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_12.hpp
new file mode 100644
index 0000000000..12872c95e8
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_12.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_12_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_12_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_12_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_13.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_13.hpp
new file mode 100644
index 0000000000..d92f95aeb4
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_13.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_13_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_13_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_13_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_14.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_14.hpp
new file mode 100644
index 0000000000..9133718f98
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_14.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_14_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_14_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_14_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_15.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_15.hpp
new file mode 100644
index 0000000000..21cbb00b69
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_15.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_15_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_15_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_15_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_16.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_16.hpp
new file mode 100644
index 0000000000..4ae286ef4d
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_16.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_16_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_2.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_2.hpp
new file mode 100644
index 0000000000..4fa02f5e73
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_2.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_2_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_2_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_2_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_3.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_3.hpp
new file mode 100644
index 0000000000..35ae21f021
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_3.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_3_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_3_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_3_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_4.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_4.hpp
new file mode 100644
index 0000000000..c08e3071b7
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_4.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_4_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_4_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_4_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_5.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_5.hpp
new file mode 100644
index 0000000000..bcf11038f3
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_5.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_5_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_5_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_5_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_6.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_6.hpp
new file mode 100644
index 0000000000..ea4d826066
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_6.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_6_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_6_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_6_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_7.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_7.hpp
new file mode 100644
index 0000000000..36e141cee7
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_7.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_7_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_7_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_7_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_8.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_8.hpp
new file mode 100644
index 0000000000..612f6d7b30
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_8.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_8_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_8_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_8_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_9.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_9.hpp
new file mode 100644
index 0000000000..e7853f42b0
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_9.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_9_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_9_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_9_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp
new file mode 100644
index 0000000000..19796a4c69
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp
@@ -0,0 +1,22 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_HEADERS_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_HEADERS_HPP
+
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/list/size.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/equal.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/detail/data_equal_common.hpp>
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_HEADERS_HPP */
diff --git a/boost/vmd/detail/recurse/data_equal/data_equal_specific.hpp b/boost/vmd/detail/recurse/data_equal/data_equal_specific.hpp
new file mode 100644
index 0000000000..d0169899bf
--- /dev/null
+++ b/boost/vmd/detail/recurse/data_equal/data_equal_specific.hpp
@@ -0,0 +1,185 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_HPP)
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_HPP
+
+#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
+ BOOST_VMD_IDENTITY(2), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
+ ) \
+ (d,em1,em2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_D(d,state,em1,em2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
+ BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS_D \
+ ) \
+ (d,em1,em2) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_D \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_D(d,state) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_D(d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP(dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP_D(d,dataf,datas,sz,vtype) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_D, \
+ ( \
+ 1, \
+ dataf, \
+ datas, \
+ sz, \
+ vtype, \
+ 0, \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ(dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ_D(d,dataf,datas,szf,szs,vtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,szf,szs), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,dataf,datas,szf,vtype) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC(dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ \
+ ( \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_D(d,dataf,datas,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ_D \
+ ( \
+ d, \
+ dataf, \
+ datas, \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
+ vtype \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_1.hpp b/boost/vmd/detail/recurse/equal/equal_1.hpp
new file mode 100644
index 0000000000..26e9a25137
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_1.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_1_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_1_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_1_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_1_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_1_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_1_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_1_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_1_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_1_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_1_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_1_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_1_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_1_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_1_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_1_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_1_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_1_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_10.hpp b/boost/vmd/detail/recurse/equal/equal_10.hpp
new file mode 100644
index 0000000000..77c832ee09
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_10.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_10_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_10_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_10_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_10_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_10_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_10_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_10_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_10_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_10_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_10_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_10_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_10_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_10_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_10_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_10_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_10_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_10_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_11.hpp b/boost/vmd/detail/recurse/equal/equal_11.hpp
new file mode 100644
index 0000000000..96add5fc82
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_11.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_11_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_11_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_11_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_11_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_11_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_11_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_11_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_11_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_11_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_11_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_11_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_11_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_11_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_11_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_11_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_11_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_11_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_12.hpp b/boost/vmd/detail/recurse/equal/equal_12.hpp
new file mode 100644
index 0000000000..d3fa1c8e80
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_12.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_12_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_12_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_12_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_12_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_12_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_12_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_12_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_12_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_12_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_12_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_12_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_12_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_12_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_12_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_12_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_12_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_12_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_13.hpp b/boost/vmd/detail/recurse/equal/equal_13.hpp
new file mode 100644
index 0000000000..8dfa0ff1c7
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_13.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_13_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_13_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_13_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_13_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_13_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_13_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_13_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_13_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_13_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_13_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_13_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_13_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_13_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_13_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_13_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_13_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_13_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_14.hpp b/boost/vmd/detail/recurse/equal/equal_14.hpp
new file mode 100644
index 0000000000..9e6c444a84
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_14.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_14_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_14_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_14_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_14_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_14_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_14_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_14_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_14_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_14_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_14_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_14_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_14_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_14_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_14_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_14_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_14_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_14_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_15.hpp b/boost/vmd/detail/recurse/equal/equal_15.hpp
new file mode 100644
index 0000000000..f6a733c176
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_15.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_15_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_15_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_15_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_15_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_15_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_15_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_15_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_15_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_15_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_15_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_15_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_15_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_15_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_15_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_15_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_15_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_15_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_16.hpp b/boost/vmd/detail/recurse/equal/equal_16.hpp
new file mode 100644
index 0000000000..031105e55f
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_16.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_16_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_16_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_16_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_16_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_16_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_16_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_16_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_16_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_16_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_16_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_16_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_16_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_16_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_16_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_16_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_16_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_16_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_2.hpp b/boost/vmd/detail/recurse/equal/equal_2.hpp
new file mode 100644
index 0000000000..0b2cadb1d0
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_2.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_2_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_2_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_2_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_2_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_2_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_2_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_2_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_2_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_2_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_2_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_2_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_2_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_2_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_2_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_2_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_2_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_2_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_3.hpp b/boost/vmd/detail/recurse/equal/equal_3.hpp
new file mode 100644
index 0000000000..6f4e6241f5
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_3.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_3_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_3_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_3_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_3_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_3_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_3_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_3_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_3_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_3_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_3_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_3_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_3_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_3_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_3_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_3_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_3_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_3_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_4.hpp b/boost/vmd/detail/recurse/equal/equal_4.hpp
new file mode 100644
index 0000000000..aa5d438e5a
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_4.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_4_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_4_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_4_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_4_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_4_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_4_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_4_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_4_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_4_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_4_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_4_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_4_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_4_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_4_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_4_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_4_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_4_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_5.hpp b/boost/vmd/detail/recurse/equal/equal_5.hpp
new file mode 100644
index 0000000000..ab580b8b07
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_5.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_5_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_5_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_5_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_5_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_5_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_5_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_5_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_5_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_5_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_5_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_5_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_5_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_5_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_5_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_5_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_5_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_5_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_6.hpp b/boost/vmd/detail/recurse/equal/equal_6.hpp
new file mode 100644
index 0000000000..85212c005f
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_6.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_6_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_6_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_6_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_6_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_6_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_6_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_6_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_6_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_6_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_6_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_6_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_6_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_6_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_6_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_6_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_6_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_6_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_7.hpp b/boost/vmd/detail/recurse/equal/equal_7.hpp
new file mode 100644
index 0000000000..6ce81630c9
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_7.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_7_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_7_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_7_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_7_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_7_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_7_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_7_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_7_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_7_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_7_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_7_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_7_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_7_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_7_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_7_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_7_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_7_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_8.hpp b/boost/vmd/detail/recurse/equal/equal_8.hpp
new file mode 100644
index 0000000000..bedee9c50a
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_8.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_8_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_8_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_8_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_8_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_8_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_8_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_8_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_8_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_8_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_8_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_8_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_8_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_8_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_8_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_8_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_8_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_8_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_9.hpp b/boost/vmd/detail/recurse/equal/equal_9.hpp
new file mode 100644
index 0000000000..bf91c229ef
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_9.hpp
@@ -0,0 +1,282 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_9_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_9_HPP
+
+#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
+
+#define BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
+ ), \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_D, \
+ BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_VSEQ(vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9 \
+ ( \
+ BOOST_VMD_TO_SEQ(vseq1), \
+ BOOST_VMD_TO_SEQ(vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_VSEQ_D(d,vseq1,vseq2,vtype) \
+ BOOST_VMD_DETAIL_DATA_EQUAL_9_D \
+ ( \
+ d, \
+ BOOST_VMD_TO_SEQ_D(d,vseq1), \
+ BOOST_VMD_TO_SEQ_D(d,vseq2), \
+ BOOST_VMD_TYPE_SEQ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_CNI(vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_9_VSEQ, \
+ BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK \
+ ) \
+ (vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_CNI_D(d,vseq1,vseq2,vtype) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype, \
+ BOOST_VMD_TYPE_SEQUENCE \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_9_VSEQ_D, \
+ BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK_D \
+ ) \
+ (d,vseq1,vseq2,vtype) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_9_CNI, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ vtype1, \
+ vtype2 \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_9_CNI_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2,vtype1) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
+ BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_WT(vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT \
+ ) \
+ (vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT_D \
+ ) \
+ (d,vseq1,vseq2,vtype1,vtype2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_GTYPE(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_9_WT \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_GTYPE_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_9_WT_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
+ BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_EBP(vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_9_GTYPE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_EBP_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
+ ), \
+ BOOST_VMD_DETAIL_EQUAL_9_GTYPE_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq1,vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_EMPTY(vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_9_EBP \
+ ) \
+ (vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_EMPTY_D(d,vseq1,vseq2,be1,be2) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND(be1,be2), \
+ BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
+ BOOST_VMD_DETAIL_EQUAL_9_EBP_D \
+ ) \
+ (d,vseq1,vseq2,be1,be2) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9(vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_9_EMPTY \
+ ( \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_EQUAL_9_D(d,vseq1,vseq2) \
+ BOOST_VMD_DETAIL_EQUAL_9_EMPTY_D \
+ ( \
+ d, \
+ vseq1, \
+ vseq2, \
+ BOOST_VMD_IS_EMPTY(vseq1), \
+ BOOST_VMD_IS_EMPTY(vseq2) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_9_HPP */
diff --git a/boost/vmd/detail/recurse/equal/equal_headers.hpp b/boost/vmd/detail/recurse/equal/equal_headers.hpp
new file mode 100644
index 0000000000..7b15cbe533
--- /dev/null
+++ b/boost/vmd/detail/recurse/equal/equal_headers.hpp
@@ -0,0 +1,23 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_EQUAL_HEADERS_HPP)
+#define BOOST_VMD_DETAIL_EQUAL_HEADERS_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/vmd/to_seq.hpp>
+#include <boost/vmd/get_type.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/adjust_tuple_type.hpp>
+#include <boost/vmd/detail/data_equal.hpp>
+#include <boost/vmd/detail/equal_common.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+
+#endif /* BOOST_VMD_DETAIL_EQUAL_HEADERS_HPP */
diff --git a/boost/vmd/detail/seq.hpp b/boost/vmd/detail/seq.hpp
new file mode 100644
index 0000000000..5021f76147
--- /dev/null
+++ b/boost/vmd/detail/seq.hpp
@@ -0,0 +1,236 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQ_HPP)
+#define BOOST_VMD_DETAIL_SEQ_HPP
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/seq/push_back.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/push_back.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/empty_result.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/parens.hpp>
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_INIT(seq) \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_VMD_DETAIL_PARENS(seq,BOOST_VMD_RETURN_AFTER), \
+ BOOST_PP_EMPTY() \
+ ), \
+ BOOST_PP_EMPTY() \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_INIT_D(d,seq) \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_VMD_DETAIL_PARENS_D(d,seq,BOOST_VMD_RETURN_AFTER), \
+ BOOST_PP_EMPTY() \
+ ), \
+ BOOST_PP_EMPTY() \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_PRED(d,state) \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_FAILURE(d,state) \
+ ( \
+ BOOST_PP_EMPTY(), \
+ BOOST_PP_EMPTY(), \
+ BOOST_PP_TUPLE_ELEM(2,state), \
+ BOOST_PP_TUPLE_ELEM(3,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP_MAKE_SEQ(d,state) \
+ BOOST_PP_TUPLE_ELEM(0,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP_UPGRADE_SEQ(d,state) \
+ BOOST_PP_SEQ_PUSH_BACK \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2,state), \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_TUPLE_ELEM(0,state) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_SUCCESS(d,state) \
+ ( \
+ BOOST_PP_EMPTY(), \
+ BOOST_PP_EMPTY(), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2,state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_MAKE_SEQ, \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_UPGRADE_SEQ \
+ ) \
+ (d,state), \
+ BOOST_PP_EMPTY() \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_CONTINUE(d,state) \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_VMD_DETAIL_PARENS_D(d,BOOST_PP_TUPLE_ELEM(1,state),BOOST_VMD_RETURN_AFTER), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2,state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_MAKE_SEQ, \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_UPGRADE_SEQ \
+ ) \
+ (d,state) \
+ ), \
+ BOOST_PP_TUPLE_ELEM(1,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP_CHECK_REST(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(1,state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_SUCCESS, \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_CONTINUE \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_OP(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ 1, \
+ BOOST_PP_TUPLE_SIZE \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,state) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_CHECK_REST, \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_FAILURE \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_STATE_RESULT(state) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(2,state), \
+ BOOST_PP_TUPLE_ELEM(3,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_PROCESS(seq) \
+ BOOST_VMD_DETAIL_SEQ_STATE_RESULT \
+ ( \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_SEQ_STATE_PRED, \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP, \
+ BOOST_VMD_DETAIL_SEQ_STATE_INIT(seq) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_SPLIT(seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_SEQ_PROCESS \
+ ) \
+ (seq) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_BEGIN(seq) \
+ BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_SEQ_SPLIT(seq)) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_PROCESS_D(d,seq) \
+ BOOST_VMD_DETAIL_SEQ_STATE_RESULT \
+ ( \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_SEQ_STATE_PRED, \
+ BOOST_VMD_DETAIL_SEQ_STATE_OP, \
+ BOOST_VMD_DETAIL_SEQ_STATE_INIT_D(d,seq) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_SPLIT_D(d,seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_SEQ_PROCESS_D \
+ ) \
+ (d,seq) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_BEGIN_D(d,seq) \
+ BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_SEQ_SPLIT_D(d,seq)) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_SEQ_SPLIT_D, \
+ BOOST_VMD_DETAIL_SEQ_BEGIN_D \
+ ) \
+ (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQ(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_SEQ_SPLIT, \
+ BOOST_VMD_DETAIL_SEQ_BEGIN \
+ ) \
+ (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQ_HPP */
diff --git a/boost/vmd/detail/sequence_arity.hpp b/boost/vmd/detail/sequence_arity.hpp
new file mode 100644
index 0000000000..14a8ad04ad
--- /dev/null
+++ b/boost/vmd/detail/sequence_arity.hpp
@@ -0,0 +1,66 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_ARITY_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_ARITY_HPP
+
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitnor.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+#define BOOST_VMD_DETAIL_IS_MULTI_TUPLE(tuple) \
+ BOOST_PP_BITNOR \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_UNARY_TUPLE(tuple) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)) \
+ ) \
+/**/
+
+// UNARY
+
+#define BOOST_VMD_DETAIL_IS_UNARY(vseq) \
+ BOOST_VMD_DETAIL_IS_UNARY_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM(BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_UNARY_D(d,vseq) \
+ BOOST_VMD_DETAIL_IS_UNARY_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+// MULTI
+
+#define BOOST_VMD_DETAIL_IS_MULTI(vseq) \
+ BOOST_VMD_DETAIL_IS_MULTI_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM(BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_IS_MULTI_D(d,vseq) \
+ BOOST_VMD_DETAIL_IS_MULTI_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_ARITY_HPP */
diff --git a/boost/vmd/detail/sequence_common.hpp b/boost/vmd/detail/sequence_common.hpp
new file mode 100644
index 0000000000..62a925b8bc
--- /dev/null
+++ b/boost/vmd/detail/sequence_common.hpp
@@ -0,0 +1,766 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_COMMON_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_COMMON_HPP
+
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/array/push_back.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/less_equal.hpp>
+#include <boost/preprocessor/comparison/not_equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/list/append.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/seq/push_back.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/push_back.hpp>
+#include <boost/preprocessor/tuple/replace.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_empty_list.hpp>
+#include <boost/vmd/detail/array.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+#include <boost/vmd/detail/identifier.hpp>
+#include <boost/vmd/detail/identifier_type.hpp>
+#include <boost/vmd/detail/list.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/seq.hpp>
+#include <boost/vmd/detail/tuple.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT_ELEM 0
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ELEM 1
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM_ELEM 2
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE_ELEM 3
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM_ELEM 4
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES_ELEM 5
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX_ELEM 6
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,number) \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_ELEM(0,from), \
+ number \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_NO_RETURN(d,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_NO_RETURN) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_EXACT_RETURN(d,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_GENERAL_RETURN(d,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_ARRAY_RETURN(d,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_LIST_RETURN(d,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN_LIST) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(from) \
+ BOOST_PP_EQUAL \
+ ( \
+ BOOST_PP_TUPLE_ELEM(1,from), \
+ BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,from) \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_ELEM(1,from), \
+ BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state) \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX_ELEM,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_IS_EMPTY(state) \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_FROM_EMPTY(state,data) \
+ (data) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_SEQ(state,data) \
+ BOOST_PP_SEQ_PUSH_BACK(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),data) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_TUPLE(state,data) \
+ BOOST_PP_TUPLE_PUSH_BACK(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),data) \
+/**/
+
+// Array
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_ARRAY(d,state,data) \
+ BOOST_PP_ARRAY_PUSH_BACK(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),data) \
+/**/
+
+// List
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_LIST(d,state,data) \
+ BOOST_PP_LIST_APPEND_D(d,BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),(data,BOOST_PP_NIL)) \
+/**/
+
+// Seq
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_SEQ(d,state,data) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_IS_EMPTY(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_FROM_EMPTY, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_SEQ \
+ ) \
+ (state,data) \
+/**/
+
+// Tuple
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_TUPLE(d,state,data) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_IS_EMPTY(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_FROM_EMPTY, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_TUPLE \
+ ) \
+ (state,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_NAME(state) \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_PROCESS(d,name,state,data) \
+ name(d,state,data) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_DATA(d,state,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_NO_RETURN \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ ), \
+ BOOST_PP_TUPLE_ELEM, \
+ BOOST_VMD_IDENTITY(tuple) \
+ ) \
+ (1,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD(d,state,ttuple) \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_PROCESS \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_NAME(state), \
+ state, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_DATA(d,state,ttuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM_CHECK(d,state) \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_PP_SEQ_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state)), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM(d,state) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state)), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM_CHECK \
+ ) \
+ (d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state),BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE_REENTRANT(state) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 1, \
+ BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state),BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_UNKNOWN(d,state) \
+ ( \
+ , \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD(d,state,(BOOST_VMD_TYPE_UNKNOWN,BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state))), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state), \
+ BOOST_PP_INC(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state)) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE_CHECK_ID(d,type,id) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,type,BOOST_VMD_TYPE_IDENTIFIER), \
+ BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D, \
+ BOOST_VMD_IDENTITY(type) \
+ ) \
+ (d,id) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE(d,state,tuple) \
+ BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE_CHECK_ID \
+ ( \
+ d, \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_TYPE_, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state) \
+ ), \
+ BOOST_PP_TUPLE_ELEM(0,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_PROCESS(d,state,tuple) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(1,tuple), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD \
+ ( \
+ d, \
+ state, \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE(d,state,tuple), \
+ BOOST_PP_TUPLE_ELEM(0,tuple) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state), \
+ BOOST_PP_INC(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state))) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ_SINGLE(d,tuple) \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,tuple)),1) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ(d,state,tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE(d,state,tuple), \
+ BOOST_VMD_TYPE_SEQ \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ_SINGLE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,tuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND(d,state,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ(d,state,tuple), \
+ BOOST_VMD_DETAIL_SEQUENCE_INCREMENT_INDEX, \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_PROCESS \
+ ) \
+ (d,state,tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INCREMENT_INDEX(d,state,tuple) \
+ BOOST_PP_TUPLE_REPLACE_D(d,state,BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX_ELEM,BOOST_PP_INC(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state))) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_TUPLE(d,state,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,tuple) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_INCREMENT_INDEX, \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND \
+ ) \
+ (d,state,tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE(d,call,state) \
+ BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_TUPLE \
+ ( \
+ d, \
+ state, \
+ call(BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state),BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_D(d,call,state) \
+ BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_TUPLE \
+ ( \
+ d, \
+ state, \
+ call(d,BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state),BOOST_VMD_RETURN_AFTER) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_GCLRT(state) \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_, \
+ BOOST_PP_CAT(BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state),_D) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_GCLPL(state) \
+ BOOST_PP_CAT \
+ ( \
+ BOOST_VMD_DETAIL_, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_GCL(state,rflag) \
+ BOOST_PP_IIF \
+ ( \
+ rflag, \
+ BOOST_VMD_DETAIL_SEQUENCE_GCLRT, \
+ BOOST_VMD_DETAIL_SEQUENCE_GCLPL \
+ ) \
+ (state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT_CALL(d,call,state,rflag) \
+ BOOST_PP_IIF \
+ ( \
+ rflag, \
+ BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE \
+ ) \
+ (d,call,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT(d,state,rflag) \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT_CALL \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_GCL(state,rflag), \
+ state, \
+ rflag \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST(d,state) \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT \
+ ( \
+ d, \
+ state, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE_REENTRANT(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state), \
+ BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state)) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_UNKNOWN, \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_INNER_PRED(d,state) \
+ BOOST_PP_NOT_EQUAL_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state), \
+ BOOST_PP_INC(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state))) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM_FROM(d,from) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_GENERAL_RETURN(d,from), \
+ ((SEQ,1),(TUPLE,1)), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_EXACT_RETURN(d,from), \
+ ((SEQ,1),(LIST,1),(ARRAY,1),(TUPLE,1)), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_ARRAY_RETURN(d,from), \
+ ((SEQ,1),(ARRAY,1),(TUPLE,1)), \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_LIST_RETURN(d,from), \
+ ((SEQ,1),(LIST,1),(TUPLE,1)), \
+ ((SEQ,1),(TUPLE,1)) \
+ ) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM(d,state) \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM_FROM \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ANY(d,state) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM, \
+ BOOST_VMD_IDENTITY(((SEQ,1),(TUPLE,1))) \
+ ) \
+ (d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM(d,state), \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM, \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ANY \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN(d,state) \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_PRED, \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP, \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ( \
+ state, \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES(d,state) \
+ ), \
+ 0 \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_ID_LOOP(d,state) \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_PRED, \
+ BOOST_VMD_DETAIL_SEQUENCE_INNER_OP, \
+ BOOST_PP_TUPLE_PUSH_BACK(BOOST_PP_TUPLE_PUSH_BACK(state,((IDENTIFIER,1))),0) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_ID_EL(d,state) \
+ ( \
+ BOOST_PP_TUPLE_ELEM(1,BOOST_VMD_DETAIL_LIST_D(d,BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state),BOOST_VMD_RETURN_AFTER)), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD(d,state,(BOOST_VMD_TYPE_LIST,BOOST_PP_NIL)), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_ID(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY_LIST_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_IDENTIFIER_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
+ ) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_ID_EL, \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_ID_LOOP \
+ ) \
+ (d,state) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP_REDUCE_STATE(state) \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_OP(d,state) \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_REDUCE_STATE \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN, \
+ BOOST_VMD_DETAIL_SEQUENCE_OP_ID \
+ ) \
+ (d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM_SZ(d,state) \
+ BOOST_PP_LESS_EQUAL_D \
+ ( \
+ d, \
+ BOOST_PP_SEQ_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state)), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM(d,state) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
+ ), \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
+ ) \
+ ), \
+ BOOST_VMD_IDENTITY(1), \
+ BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM_SZ \
+ ) \
+ (d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_PRED(d,state) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
+ ), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM \
+ ) \
+ (d,state) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK(output) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(output,BOOST_VMD_TYPE_ARRAY), \
+ (0,()), \
+ BOOST_PP_NIL \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK_D(d,output) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,output,BOOST_VMD_TYPE_ARRAY), \
+ (0,()), \
+ BOOST_PP_NIL \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE(output) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(output,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(output,BOOST_VMD_TYPE_TUPLE) \
+ ), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK \
+ ) \
+ (output) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_D(d,output) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITOR \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,output,BOOST_VMD_TYPE_SEQ), \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,output,BOOST_VMD_TYPE_TUPLE) \
+ ), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK_D \
+ ) \
+ (d,output) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET(state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ ), \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
+ )
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET_D(d,state) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
+ ), \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
+ )
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE(vseq,elem,output,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET \
+ ( \
+ BOOST_PP_WHILE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_PRED, \
+ BOOST_VMD_DETAIL_SEQUENCE_OP, \
+ ( \
+ vseq, \
+ BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE \
+ ( \
+ output \
+ ), \
+ elem, \
+ output, \
+ from \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D(d,vseq,elem,output,from) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET_D \
+ ( \
+ d, \
+ BOOST_PP_WHILE_ ## d \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_PRED, \
+ BOOST_VMD_DETAIL_SEQUENCE_OP, \
+ ( \
+ vseq, \
+ BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_D \
+ ( \
+ d, \
+ output \
+ ), \
+ elem, \
+ output, \
+ from \
+ ) \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_COMMON_HPP */
diff --git a/boost/vmd/detail/sequence_elem.hpp b/boost/vmd/detail/sequence_elem.hpp
new file mode 100644
index 0000000000..541b1a5028
--- /dev/null
+++ b/boost/vmd/detail/sequence_elem.hpp
@@ -0,0 +1,985 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP
+
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/push_back.hpp>
+#include <boost/preprocessor/tuple/replace.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_identifier.hpp>
+#include <boost/vmd/detail/empty_result.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+#include <boost/vmd/detail/match_identifier.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/only_after.hpp>
+#include <boost/vmd/detail/sequence_common.hpp>
+
+/*
+
+ Given modifications and the requested type,
+ determine whether or not we should be checking for specific identifiers
+
+ 1 = check for specific identifiers
+ 0 = do no check for specific identifiers
+
+*/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ type, \
+ BOOST_VMD_TYPE_IDENTIFIER \
+ ), \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ type, \
+ BOOST_VMD_TYPE_IDENTIFIER \
+ ), \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+/**/
+
+/*
+
+ Given modifications, determine whether or not an index should be part of the result
+
+ 1 = index should be part of the result
+ 0 = index should not be part of the result
+
+*/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
+ BOOST_VMD_TYPE_IDENTIFIER \
+ ), \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm) \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
+ BOOST_VMD_TYPE_IDENTIFIER \
+ ), \
+ BOOST_VMD_DETAIL_NOT_EMPTY \
+ ( \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX(nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
+ (,,), \
+ (,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX(nm) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
+ (,) \
+ ) \
+/**/
+
+/*
+
+ Returns a failure result given the modifications
+
+*/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX \
+ ) \
+ (nm),nm, \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX \
+ ) \
+ (nm),nm, \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE(res) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 0, \
+ BOOST_PP_TUPLE_ELEM(0,res) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY(res) \
+ BOOST_PP_TUPLE_ELEM(0,res) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE(res) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 1, \
+ BOOST_PP_TUPLE_ELEM(0,res) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY(res) \
+ BOOST_PP_TUPLE_ELEM(1,res) \
+/**/
+
+/*
+
+ Gets the 'data' of the result given the result and modifications
+
+*/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY \
+ ) \
+ (res) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY \
+ ) \
+ (res) \
+/**/
+
+/*
+
+ Gets the 'type' of the result given the result and modifications
+
+*/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY \
+ ) \
+ (res) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY \
+ ) \
+ (res) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE(res) \
+ BOOST_VMD_IS_EMPTY \
+ ( \
+ BOOST_PP_TUPLE_ELEM(0,res) \
+ ) \
+/**/
+
+/*
+
+ Determines whether the result from the element access has failed or not
+
+ returns 1 if it has failed, otherwise 0.
+
+*/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
+ BOOST_VMD_IS_EMPTY \
+ ) \
+ (res) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
+ BOOST_VMD_IS_EMPTY \
+ ) \
+ (res) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM(seq,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(seq),elem), \
+ BOOST_PP_SEQ_ELEM, \
+ BOOST_VMD_EMPTY \
+ ) \
+ (elem,seq) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D(d,seq,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(seq),elem), \
+ BOOST_PP_SEQ_ELEM, \
+ BOOST_VMD_EMPTY \
+ ) \
+ (elem,seq) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES(data,elem) \
+ ( \
+ BOOST_PP_SEQ_ELEM(elem,BOOST_PP_TUPLE_ELEM(0,data)), \
+ BOOST_PP_TUPLE_ELEM(1,data) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM(data,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,data)),elem), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES, \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (data,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D(d,data,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,data)),elem), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES, \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (data,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY(seq,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM \
+ ) \
+ (seq,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D(d,seq,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D \
+ ) \
+ (d,seq,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER(data,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,data)), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM \
+ ) \
+ (data,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D(d,data,elem) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,data)), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D \
+ ) \
+ (d,data,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ(seq,elem,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY \
+ ) \
+ (seq,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D(d,seq,elem,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D \
+ ) \
+ (d,seq,elem) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(...) \
+ BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS(elem,vseq,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
+ ( \
+ vseq, \
+ elem, \
+ BOOST_VMD_TYPE_SEQ, \
+ nm \
+ ), \
+ elem, \
+ nm \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D(d,elem,vseq,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
+ ( \
+ d, \
+ vseq, \
+ elem, \
+ BOOST_VMD_TYPE_SEQ, \
+ nm \
+ ), \
+ elem, \
+ nm \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY(elem,vseq,nm) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
+ (,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D(d,elem,vseq,nm) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
+ (,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY \
+ ) \
+ (elem,vseq,nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D \
+ ) \
+ (d,elem,vseq,nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
+ BOOST_PP_TUPLE_ELEM, \
+ BOOST_VMD_IDENTITY(res) \
+ ) \
+ (1,res) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES(data,index) \
+ BOOST_PP_IF \
+ ( \
+ index, \
+ (data,BOOST_PP_DEC(index)), \
+ (,) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES(data,index) \
+ BOOST_PP_EXPR_IF \
+ ( \
+ index, \
+ data \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH(data,nm,index) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES \
+ ) \
+ (data,index) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP(data,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
+ ( \
+ data, \
+ nm, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
+ ( \
+ data, \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP_D(d,data,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
+ ( \
+ data, \
+ nm, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
+ ( \
+ d, \
+ data, \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID(data,nm,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP, \
+ BOOST_VMD_IDENTITY(data) \
+ ) \
+ (data,nm) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D(d,data,nm,type) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP_D, \
+ BOOST_VMD_IDENTITY(data) \
+ ) \
+ (d,data,nm) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY(res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID \
+ ( \
+ BOOST_PP_TUPLE_ELEM(1,res), \
+ nm, \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_ELEM(1,res), \
+ nm, \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE(res,nm,type) \
+ BOOST_PP_TUPLE_REPLACE \
+ ( \
+ res, \
+ 0, \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 1, \
+ BOOST_PP_TUPLE_ELEM(0,res) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D(d,res,nm,type) \
+ BOOST_PP_TUPLE_REPLACE_D \
+ ( \
+ d, \
+ res, \
+ 0, \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 1, \
+ BOOST_PP_TUPLE_ELEM(0,res) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS(res,nm,type,index) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER \
+ ( \
+ BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
+ nm, \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS_D(d,res,nm,type,index) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D \
+ ( \
+ d, \
+ BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
+ nm, \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE(res,nm,type,index) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE_D(d,res,nm,type,index) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES(res,nm,type,index) \
+ BOOST_PP_IF \
+ ( \
+ index, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE \
+ ) \
+ (res,nm,type,index) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D(d,res,nm,type,index) \
+ BOOST_PP_IF \
+ ( \
+ index, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE_D \
+ ) \
+ (d,res,nm,type,index) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE(res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES(res,nm,type,index) \
+ BOOST_PP_IF \
+ ( \
+ index, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D(d,res,nm,type,index) \
+ BOOST_PP_IF \
+ ( \
+ index, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES(res,nm,type,index) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES \
+ ) \
+ (res,nm,type,index) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D(d,res,nm,type,index) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D \
+ ) \
+ (d,res,nm,type,index) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID(res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES \
+ ( \
+ res, \
+ nm, \
+ type, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm), \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D \
+ ( \
+ d, \
+ res, \
+ nm, \
+ type, \
+ BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm), \
+ BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED(res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID(res,nm,type) \
+ BOOST_VMD_IS_IDENTIFIER \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D(d,res,nm,type) \
+ BOOST_VMD_IS_IDENTIFIER_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER(res,nm,type) \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm), \
+ type \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_IDENTIFIER, \
+ type \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_TYPE_IDENTIFIER, \
+ type \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(type), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED(res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED_D(d,res,nm,type) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE(res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF \
+ ) \
+ (res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D(d,res,nm,type) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED_D, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D \
+ ) \
+ (d,res,nm,type) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA(res,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE \
+ ( \
+ res, \
+ nm, \
+ BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D(d,res,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D \
+ ( \
+ d, \
+ res, \
+ nm, \
+ BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM(elem,vseq,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm), \
+ nm \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D(d,elem,vseq,nm) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm), \
+ nm \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM(allow,elem,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM \
+ ( \
+ elem, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ BOOST_VMD_DETAIL_NEW_MODS(allow,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,allow,elem,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D \
+ ( \
+ d, \
+ elem, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,__VA_ARGS__) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP */
diff --git a/boost/vmd/detail/sequence_enum.hpp b/boost/vmd/detail/sequence_enum.hpp
new file mode 100644
index 0000000000..4e8a12eeab
--- /dev/null
+++ b/boost/vmd/detail/sequence_enum.hpp
@@ -0,0 +1,40 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_ENUM_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_ENUM_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/enum.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/sequence_to_tuple.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ENUM_PROCESS(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_ENUM \
+ ) \
+ (tuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ENUM(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ENUM_PROCESS \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE(__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_ENUM_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ENUM_PROCESS \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_D(d,__VA_ARGS__) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_ENUM_HPP */
diff --git a/boost/vmd/detail/sequence_size.hpp b/boost/vmd/detail/sequence_size.hpp
new file mode 100644
index 0000000000..0f308eb829
--- /dev/null
+++ b/boost/vmd/detail/sequence_size.hpp
@@ -0,0 +1,21 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_SIZE_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_SIZE_HPP
+
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/vmd/detail/sequence_to_array.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_SIZE(vseq) \
+ BOOST_PP_ARRAY_SIZE(BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY(vseq)) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_SIZE_D(d,vseq) \
+ BOOST_PP_ARRAY_SIZE(BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_D(d,vseq)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_SIZE_HPP */
diff --git a/boost/vmd/detail/sequence_to_array.hpp b/boost/vmd/detail/sequence_to_array.hpp
new file mode 100644
index 0000000000..a9383a95e8
--- /dev/null
+++ b/boost/vmd/detail/sequence_to_array.hpp
@@ -0,0 +1,47 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_ARRAY, \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ), \
+ (0,()) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_ARRAY, \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ), \
+ (0,()) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_HPP */
diff --git a/boost/vmd/detail/sequence_to_list.hpp b/boost/vmd/detail/sequence_to_list.hpp
new file mode 100644
index 0000000000..1d612c47e8
--- /dev/null
+++ b/boost/vmd/detail/sequence_to_list.hpp
@@ -0,0 +1,47 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_HPP
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_LIST(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_LIST, \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ), \
+ BOOST_PP_NIL \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_LIST, \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ), \
+ BOOST_PP_NIL \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_HPP */
diff --git a/boost/vmd/detail/sequence_to_seq.hpp b/boost/vmd/detail/sequence_to_seq.hpp
new file mode 100644
index 0000000000..d2aaee9124
--- /dev/null
+++ b/boost/vmd/detail/sequence_to_seq.hpp
@@ -0,0 +1,45 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_HPP
+
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ(...) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_SEQ, \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_D(d,...) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_SEQ, \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_HPP */
diff --git a/boost/vmd/detail/sequence_to_tuple.hpp b/boost/vmd/detail/sequence_to_tuple.hpp
new file mode 100644
index 0000000000..cb5286c63c
--- /dev/null
+++ b/boost/vmd/detail/sequence_to_tuple.hpp
@@ -0,0 +1,45 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_HPP
+
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/not_empty.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE(...) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_TUPLE, \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_D(d,...) \
+ BOOST_PP_EXPR_IIF \
+ ( \
+ BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
+ , \
+ BOOST_VMD_TYPE_TUPLE, \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_HPP */
diff --git a/boost/vmd/detail/sequence_type.hpp b/boost/vmd/detail/sequence_type.hpp
new file mode 100644
index 0000000000..4b0a0f9527
--- /dev/null
+++ b/boost/vmd/detail/sequence_type.hpp
@@ -0,0 +1,274 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP)
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/preprocessor/variadic/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/detail/equal_type.hpp>
+#include <boost/vmd/detail/is_array_common.hpp>
+#include <boost/vmd/detail/is_list.hpp>
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY(dtuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(BOOST_PP_TUPLE_ELEM(1,dtuple)), \
+ BOOST_VMD_TYPE_ARRAY, \
+ BOOST_VMD_TYPE_TUPLE \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D(d,dtuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \
+ BOOST_VMD_TYPE_ARRAY, \
+ BOOST_VMD_TYPE_TUPLE \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST(BOOST_PP_TUPLE_ELEM(1,dtuple)), \
+ BOOST_VMD_TYPE_LIST, \
+ BOOST_VMD_TYPE_TUPLE \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_IS_LIST_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \
+ BOOST_VMD_TYPE_LIST, \
+ BOOST_VMD_TYPE_TUPLE \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH(dtuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE \
+ ( \
+ BOOST_VMD_TYPE_TUPLE, \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \
+ ) \
+ (dtuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D(d,dtuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D \
+ ( \
+ d, \
+ BOOST_VMD_TYPE_TUPLE, \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \
+ ), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \
+ ) \
+ (d,dtuple) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS(dtuple,rtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \
+ BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH \
+ ) \
+ ) \
+ ) \
+ ) \
+ (dtuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D(d,dtuple,rtype) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D, \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \
+ BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D \
+ ) \
+ ) \
+ ) \
+ ) \
+ (d,dtuple) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE(dtuple,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS \
+ ( \
+ dtuple, \
+ BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D(d,dtuple,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D \
+ ( \
+ d, \
+ dtuple, \
+ BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY(dtuple,...) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE, \
+ BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \
+ ) \
+ (dtuple,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D(d,dtuple,...) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D, \
+ BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \
+ ) \
+ (d,dtuple,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE(tuple,...) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \
+ ) \
+ (BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D(d,tuple,...) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D, \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \
+ ) \
+ (d,BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE(tuple,...) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE \
+ ) \
+ (tuple,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D(d,tuple,...) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
+ BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D \
+ ) \
+ (d,tuple,__VA_ARGS__) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE \
+ ( \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM \
+ ( \
+ BOOST_VMD_ALLOW_ALL, \
+ 0, \
+ BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
+ BOOST_VMD_RETURN_AFTER, \
+ BOOST_VMD_RETURN_TYPE_TUPLE \
+ ), \
+ __VA_ARGS__ \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D \
+ ( \
+ d, \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_D \
+ ( \
+ d, \
+ BOOST_VMD_ALLOW_ALL, \
+ 0, \
+ BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
+ BOOST_VMD_RETURN_AFTER, \
+ BOOST_VMD_RETURN_TYPE_TUPLE \
+ ), \
+ __VA_ARGS__ \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP */
diff --git a/boost/vmd/detail/setup.hpp b/boost/vmd/detail/setup.hpp
new file mode 100644
index 0000000000..a237be6d93
--- /dev/null
+++ b/boost/vmd/detail/setup.hpp
@@ -0,0 +1,41 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_SETUP_HPP)
+#define BOOST_VMD_DETAIL_SETUP_HPP
+
+#include <boost/preprocessor/config/config.hpp>
+
+#if defined(BOOST_VMD_MSVC)
+#undef BOOST_VMD_MSVC
+#endif
+#if defined(BOOST_VMD_MSVC_V8)
+#undef BOOST_VMD_MSVC_V8
+#endif
+#if BOOST_PP_VARIADICS
+#define BOOST_VMD_MSVC BOOST_PP_VARIADICS_MSVC
+#if BOOST_VMD_MSVC && defined(_MSC_VER) && _MSC_VER == 1400
+#define BOOST_VMD_MSVC_V8 1
+#else
+#define BOOST_VMD_MSVC_V8 0
+#endif /* BOOST_VMD_MSVC && defined(_MSC_VER) && _MSC_VER == 1400 */
+#if !defined(BOOST_VMD_ASSERT_DATA)
+#if defined(NDEBUG)
+#define BOOST_VMD_ASSERT_DATA 0
+#else
+#define BOOST_VMD_ASSERT_DATA 1
+#endif /* NDEBUG */
+#endif /* BOOST_VMD_ASSERT_DATA */
+#else
+#define BOOST_VMD_MSVC 0
+#define BOOST_VMD_MSVC_V8 0
+#if defined(BOOST_VMD_ASSERT_DATA)
+#undef BOOST_VMD_ASSERT_DATA
+#endif
+#define BOOST_VMD_ASSERT_DATA 0
+#endif /* BOOST_PP_VARIADICS */
+
+#endif /* BOOST_VMD_DETAIL_SETUP_HPP */
diff --git a/boost/vmd/detail/tuple.hpp b/boost/vmd/detail/tuple.hpp
new file mode 100644
index 0000000000..f8a614c562
--- /dev/null
+++ b/boost/vmd/detail/tuple.hpp
@@ -0,0 +1,196 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_TUPLE_HPP)
+#define BOOST_VMD_DETAIL_TUPLE_HPP
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/preprocessor/variadic/elem.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/detail/empty_result.hpp>
+#include <boost/vmd/detail/mods.hpp>
+#include <boost/vmd/detail/parens.hpp>
+
+#define BOOST_VMD_DETAIL_TUPLE_BST_CS(vseq) \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_BEGIN_PARENS(vseq)),1) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BST_CS_D(d,vseq) \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_BEGIN_PARENS(vseq)),1) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BST(vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_BST_CS, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BST_D(d,vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_BST_CS_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT(vseq) \
+ BOOST_VMD_DETAIL_TUPLE_BST(BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq)) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT_D(d,vseq) \
+ BOOST_VMD_DETAIL_TUPLE_BST_D(d,BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq)) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE_BST(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE_BST_D(d,vseq), \
+ BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT_D, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (d,vseq) \
+ ) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ(vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_SPLIT_PARENS \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ_D(d,vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq), \
+ BOOST_VMD_DETAIL_EMPTY_RESULT, \
+ BOOST_VMD_DETAIL_SPLIT_PARENS \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_SPLIT(vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ, \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_SPLIT_D(d,vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ_D, \
+ BOOST_VMD_DETAIL_EMPTY_RESULT \
+ ) \
+ (d,vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ(vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_BEGIN_PARENS \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ_D(d,vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq), \
+ BOOST_VMD_EMPTY, \
+ BOOST_VMD_DETAIL_BEGIN_PARENS \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_PROCESS(vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ, \
+ BOOST_VMD_EMPTY \
+ ) \
+ (vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_PROCESS_D(d,vseq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(vseq), \
+ BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ_D, \
+ BOOST_VMD_EMPTY \
+ ) \
+ (d,vseq) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE(...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_TUPLE_SPLIT, \
+ BOOST_VMD_DETAIL_TUPLE_PROCESS \
+ ) \
+ (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#define BOOST_VMD_DETAIL_TUPLE_D(d,...) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
+ ( \
+ BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
+ ), \
+ BOOST_VMD_DETAIL_TUPLE_SPLIT_D, \
+ BOOST_VMD_DETAIL_TUPLE_PROCESS_D \
+ ) \
+ (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_TUPLE_HPP */
diff --git a/boost/vmd/detail/type_registration.hpp b/boost/vmd/detail/type_registration.hpp
new file mode 100644
index 0000000000..29aecf196d
--- /dev/null
+++ b/boost/vmd/detail/type_registration.hpp
@@ -0,0 +1,43 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_IS_TYPE_REGISTRATION_HPP)
+#define BOOST_VMD_DETAIL_IS_TYPE_REGISTRATION_HPP
+
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_UNKNOWN (BOOST_VMD_TYPE_UNKNOWN)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_EMPTY (BOOST_VMD_TYPE_EMPTY)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_ARRAY (BOOST_VMD_TYPE_ARRAY)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_LIST (BOOST_VMD_TYPE_LIST)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_SEQ (BOOST_VMD_TYPE_SEQ)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_TUPLE (BOOST_VMD_TYPE_TUPLE)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_IDENTIFIER (BOOST_VMD_TYPE_IDENTIFIER)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_NUMBER (BOOST_VMD_TYPE_NUMBER)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_SEQUENCE (BOOST_VMD_TYPE_SEQUENCE)
+#define BOOST_VMD_REGISTER_BOOST_VMD_TYPE_TYPE (BOOST_VMD_TYPE_TYPE)
+
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_UNKNOWN_BOOST_VMD_TYPE_UNKNOWN
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_EMPTY_BOOST_VMD_TYPE_EMPTY
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_ARRAY_BOOST_VMD_TYPE_ARRAY
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_LIST_BOOST_VMD_TYPE_LIST
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_SEQ_BOOST_VMD_TYPE_SEQ
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_TUPLE_BOOST_VMD_TYPE_TUPLE
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_IDENTIFIER_BOOST_VMD_TYPE_IDENTIFIER
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_NUMBER_BOOST_VMD_TYPE_NUMBER
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_SEQUENCE_BOOST_VMD_TYPE_SEQUENCE
+#define BOOST_VMD_DETECT_BOOST_VMD_TYPE_TYPE_BOOST_VMD_TYPE_TYPE
+
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_UNKNOWN (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_UNKNOWN)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_EMPTY (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_EMPTY)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_ARRAY (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_ARRAY)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_LIST (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_LIST)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_SEQ (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_SEQ)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_TUPLE (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_TUPLE)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_IDENTIFIER (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_IDENTIFIER)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_NUMBER (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_NUMBER)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_SEQUENCE (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_SEQUENCE)
+#define BOOST_VMD_SUBTYPE_REGISTER_BOOST_VMD_TYPE_TYPE (BOOST_VMD_TYPE_TYPE,BOOST_VMD_TYPE_TYPE)
+
+#endif /* BOOST_VMD_DETAIL_IS_TYPE_REGISTRATION_HPP */
diff --git a/boost/vmd/detail/variadic_pop_front.hpp b/boost/vmd/detail/variadic_pop_front.hpp
new file mode 100644
index 0000000000..97a7ca320e
--- /dev/null
+++ b/boost/vmd/detail/variadic_pop_front.hpp
@@ -0,0 +1,24 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_DETAIL_VARIADIC_POP_FRONT_HPP)
+#define BOOST_VMD_DETAIL_VARIADIC_POP_FRONT_HPP
+
+#include <boost/preprocessor/tuple/enum.hpp>
+#include <boost/preprocessor/tuple/pop_front.hpp>
+#include <boost/preprocessor/variadic/to_tuple.hpp>
+
+#define BOOST_VMD_DETAIL_VARIADIC_POP_FRONT(...) \
+ BOOST_PP_TUPLE_ENUM \
+ ( \
+ BOOST_PP_TUPLE_POP_FRONT \
+ ( \
+ BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__) \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_VMD_DETAIL_VARIADIC_POP_FRONT_HPP */
diff --git a/boost/vmd/elem.hpp b/boost/vmd/elem.hpp
new file mode 100644
index 0000000000..f6d575e22f
--- /dev/null
+++ b/boost/vmd/elem.hpp
@@ -0,0 +1,292 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ELEM_HPP)
+#define BOOST_VMD_ELEM_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/modifiers.hpp>
+#include <boost/vmd/detail/sequence_elem.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ELEM(elem,...)
+
+ \brief Accesses an element of a sequence.
+
+ elem = A sequence element number. From 0 to sequence size - 1.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to access.
+ Further variadic parameters are all optional.
+
+ With no further variadic parameters the macro returns the particular element
+ in the sequence. If the element number is outside the bounds of the sequence
+ macro access fails and the macro turns emptiness.
+
+ Optional parameters determine what it means that an element is successfully
+ accessed as well as what data is returned by the macro.
+
+ Filters: specifying a VMD type tells the macro to return the element only
+ if it is of the VMD type specified, else macro access fails. If more than
+ one VMD type is specified as an optional parameter the last one
+ specified is the filter.
+
+ Matching Identifiers: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER,
+ optional parameters which are identifiers specify that the element accessed
+ must match one of the identifiers else access fails. The identifiers may be specified multiple
+ times as single optional parameters or once as a tuple of identifier
+ parameters. If the identifiers are specified as single optional parameters
+ they cannot be any of the specific BOOST_VMD_ optional parameters in order to be
+ recognized as matching identifiers. Normally this should never be the case.
+ The only situation where this could occur is if the VMD types, which are filters,
+ are used as matching identifiers; in this case the matching identifiers need
+ to be passed as a tuple of identifier parameters so they are not treated
+ as filters.
+
+ Filters and matching identifiers change what it means that an element is successfully
+ accessed. They do not change what data is returned by the macro. The remaining optional
+ parameters do not change what it means that an element is successfully accessed but they
+ do change what data is returned by the macro.
+
+ Splitting: Splitting allows the macro to return the rest of the sequence
+ after the element accessed.
+
+ If BOOST_VMD_RETURN_AFTER is specified the return is a tuple
+ with the element accessed as the first tuple parameter and the rest of
+ the sequence as the second tuple parameter. If element access fails
+ both tuple parameters are empty.
+
+ If BOOST_VMD_RETURN_ONLY_AFTER
+ is specified the return is the rest of the sequence after the element accessed
+ found. If the element access fails the return is emptiness.
+
+ If BOOST_VMD_RETURN_NO_AFTER, the default, is specified no splitting
+ occurs.
+
+ If more than one of the splitting identifiers are specified
+ the last one specified determines the splitting.
+
+ Return Type: The element accessed can be changed to return both the type
+ of the element as well as the element data with optional return type
+ parameters. When a type is returned, the element accessed which is returned becomes a
+ two-element tuple where the type of the element accessed is the first tuple element and the element
+ data itself is the second tuple element. If the macro fails to access the
+ element the element access returned is emptiness and not a tuple.
+
+ If BOOST_VMD_RETURN_NO_TYPE, the default, is specified no type is returned
+ as part of the element accessed.
+
+ If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple.
+
+ If BOOST_VMD_RETURN_TYPE_ARRAY is specified
+ an array type is returned if the element is an array, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_TUPLE is specified
+ a tuple type is returned for all tuple-like data, else the actual type
+ is returned for non-tuple data.
+
+ If more than one return type optional
+ parameter is specified the last one specified determines the return type.
+
+ If a filter is specified optional return type parameters are ignored and
+ the default BOOST_VMD_RETURN_NO_TYPE is in effect.
+
+ Index: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER,
+ and matching identifiers are specified, an index parameter specifies that the
+ numeric index, starting with 0, of the matching identifier found, be returned
+ as part of the result.
+
+ If BOOST_VMD_RETURN_INDEX is specified an index is returned
+ as part of the result.
+
+ If BOOST_VMD_RETURN_NO_INDEX, the default, is specified
+ no index is returned as part of the result.
+
+ If both are specified the last one specified determines the index parameter.
+
+ When an index is returned as part of the result, the result is a tuple where the
+ element accessed is the first tuple parameter and the index is the last tuple parameter.
+ If element access fails the index is empty. If there is no BOOST_VMD_TYPE_IDENTIFIER
+ filter or if there are no matching identifiers the BOOST_VMD_RETURN_INDEX is ignored
+ and no index is returned as part of the result.
+
+ returns = With no optional parameters the element accessed is returned, or emptiness if
+ element is outside the bounds of the sequence. Filters and matching identifiers
+ can change the meaning of whether the element accessed is returned or failure
+ occurs, but whenever failure occurs emptiness is returned as the element access part
+ of that failure, else the element accessed is returned. Return type optional parameters,
+ when filters are not used, return the element accessed as a two-element tuple
+ where the first tuple element is the type and the second tuple element is the
+ data; if the element is not accessed then emptiness is returned as the element access
+ and not a tuple. Splitting with BOOST_VMD_RETURN_AFTER returns a tuple where the element accessed
+ is the first tuple element and the rest of the sequence is the second tuple element.
+ Splitting with BOOST_VMD_RETURN_ONLY_AFTER returns the rest of the sequence after
+ the element accessed or emptiness if the element can not be accessed. Indexing
+ returns the index as part of the output only if filtering with
+ BOOST_VMD_TYPE_IDENTIFIER is specified and matching identifiers are specified.
+ When the index is returned with BOOST_VMD_RETURN_AFTER it is the third element
+ of the tuple returned, else it is the second element of a tuple where the element
+ accessed is the first element of the tuple.
+
+*/
+
+#define BOOST_VMD_ELEM(elem,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM(BOOST_VMD_ALLOW_ALL,elem,__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_ELEM_D(d,elem,...)
+
+ \brief Accesses an element of a sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ elem = A sequence element number. From 0 to sequence size - 1.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to access.
+ Further variadic parameters are all optional.
+
+ With no further variadic parameters the macro returns the particular element
+ in the sequence. If the element number is outside the bounds of the sequence
+ macro access fails and the macro turns emptiness.
+
+ Optional parameters determine what it means that an element is successfully
+ accessed as well as what data is returned by the macro.
+
+ Filters: specifying a VMD type tells the macro to return the element only
+ if it is of the VMD type specified, else macro access fails. If more than
+ one VMD type is specified as an optional parameter the last one
+ specified is the filter.
+
+ Matching Identifiers: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER,
+ optional parameters which are identifiers specify that the element accessed
+ must match one of the identifiers else access fails. The identifiers may be specified multiple
+ times as single optional parameters or once as a tuple of identifier
+ parameters. If the identifiers are specified as single optional parameters
+ they cannot be any of the specific BOOST_VMD_ optional parameters in order to be
+ recognized as matching identifiers. Normally this should never be the case.
+ The only situation where this could occur is if the VMD types, which are filters,
+ are used as matching identifiers; in this case the matching identifiers need
+ to be passed as a tuple of identifier parameters so they are not treated
+ as filters.
+
+ Filters and matching identifiers change what it means that an element is successfully
+ accessed. They do not change what data is returned by the macro. The remaining optional
+ parameters do not change what it means that an element is successfully accessed but they
+ do change what data is returned by the macro.
+
+ Splitting: Splitting allows the macro to return the rest of the sequence
+ after the element accessed.
+
+ If BOOST_VMD_RETURN_AFTER is specified the return is a tuple
+ with the element accessed as the first tuple parameter and the rest of
+ the sequence as the second tuple parameter. If element access fails
+ both tuple parameters are empty.
+
+ If BOOST_VMD_RETURN_ONLY_AFTER
+ is specified the return is the rest of the sequence after the element accessed
+ found. If the element access fails the return is emptiness.
+
+ If BOOST_VMD_RETURN_NO_AFTER, the default, is specified no splitting
+ occurs.
+
+ If more than one of the splitting identifiers are specified
+ the last one specified determines the splitting.
+
+ Return Type: The element accessed can be changed to return both the type
+ of the element as well as the element data with optional return type
+ parameters. When a type is returned, the element accessed which is returned becomes a
+ two-element tuple where the type of the element accessed is the first tuple element and the element
+ data itself is the second tuple element. If the macro fails to access the
+ element the element access returned is emptiness and not a tuple.
+
+ If BOOST_VMD_RETURN_NO_TYPE, the default, is specified no type is returned
+ as part of the element accessed.
+
+ If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple.
+
+ If BOOST_VMD_RETURN_TYPE_ARRAY is specified
+ an array type is returned if the element is an array, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_TUPLE is specified
+ a tuple type is returned for all tuple-like data, else the actual type
+ is returned for non-tuple data. If more than one return type optional
+ parameter is specified the last one specified determines the return type.
+
+ If a filter is specified optional return type parameters are ignored and
+ the default BOOST_VMD_RETURN_NO_TYPE is in effect.
+
+ Index: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER,
+ and matching identifiers are specified, an index parameter specifies that the
+ numeric index, starting with 0, of the matching identifier found, be returned
+ as part of the result.
+
+ If BOOST_VMD_RETURN_INDEX is specified an index is returned
+ as part of the result.
+
+ If BOOST_VMD_RETURN_NO_INDEX, the default, is specified
+ no index is returned as part of the result.
+
+ If both are specified the last one specified determines the index parameter.
+
+ When an index is returned as part of the result, the result is a tuple where the
+ element accessed is the first tuple parameter and the index is the last tuple parameter.
+ If element access fails the index is empty. If there is no BOOST_VMD_TYPE_IDENTIFIER
+ filter or if there are no matching identifiers the BOOST_VMD_RETURN_INDEX is ignored
+ and no index is returned as part of the result.
+
+ returns = With no optional parameters the element accessed is returned, or emptiness if
+ element is outside the bounds of the sequence. Filters and matching identifiers
+ can change the meaning of whether the element accessed is returned or failure
+ occurs, but whenever failure occurs emptiness is returned as the element access part
+ of that failure, else the element accessed is returned. Return type optional parameters,
+ when filters are not used, return the element accessed as a two-element tuple
+ where the first tuple element is the type and the second tuple element is the
+ data; if the element is not accessed then emptiness is returned as the element access
+ and not a tuple. Splitting with BOOST_VMD_RETURN_AFTER returns a tuple where the element accessed
+ is the first tuple element and the rest of the sequence is the second tuple element.
+ Splitting with BOOST_VMD_RETURN_ONLY_AFTER returns the rest of the sequence after
+ the element accessed or emptiness if the element can not be accessed. Indexing
+ returns the index as part of the output only if filtering with
+ BOOST_VMD_TYPE_IDENTIFIER is specified and matching identifiers are specified.
+ When the index is returned with BOOST_VMD_RETURN_AFTER it is the third element
+ of the tuple returned, else it is the second element of a tuple where the element
+ accessed is the first element of the tuple.
+
+*/
+
+#define BOOST_VMD_ELEM_D(d,elem,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,BOOST_VMD_ALLOW_ALL,elem,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ELEM_HPP */
diff --git a/boost/vmd/empty.hpp b/boost/vmd/empty.hpp
new file mode 100644
index 0000000000..8aaecc49c4
--- /dev/null
+++ b/boost/vmd/empty.hpp
@@ -0,0 +1,41 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_EMPTY_HPP)
+#define BOOST_VMD_EMPTY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_EMPTY(...)
+
+ \brief Outputs emptiness.
+
+ ... = any variadic parameters. The parameters are ignored.
+
+ This macro is used to output emptiness ( nothing ) no matter
+ what is passed to it.
+
+ If you use this macro to return a result, as in 'result BOOST_VMD_EMPTY'
+ subsequently invoked, you should surround the result with
+ BOOST_VMD_IDENTITY_RESULT to smooth over a VC++ problem.
+
+*/
+
+#define BOOST_VMD_EMPTY(...)
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_EMPTY_HPP */
diff --git a/boost/vmd/enum.hpp b/boost/vmd/enum.hpp
new file mode 100644
index 0000000000..b08a30ae0a
--- /dev/null
+++ b/boost/vmd/enum.hpp
@@ -0,0 +1,103 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_ENUM_HPP)
+#define BOOST_VMD_ENUM_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_enum.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_ENUM(...)
+
+ \brief Converts a sequence to comma-separated elements which are the elements of the sequence.
+
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = Comma-separated data, otherwise known as variadic data.
+ If the sequence is empty the variadic data is empty. If an
+ optional return type other than BOOST_VMD_RETURN_NO_TYPE
+ is specified the type and the data of each element is
+ returned as part of the variadic data. Otherwise just the data
+ of each element is returned, which is the default.
+
+*/
+
+#define BOOST_VMD_ENUM(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ENUM(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_ENUM_D(d,...)
+
+ \brief Converts a sequence to comma-separated elements which are the elements of the sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = Comma-separated data, otherwise known as variadic data.
+ If the sequence is empty the variadic data is empty. If an
+ optional return type other than BOOST_VMD_RETURN_NO_TYPE
+ is specified the type and the data of each element is
+ returned as part of the variadic data. Otherwise just the data
+ of each element is returned, which is the default.
+
+*/
+
+#define BOOST_VMD_ENUM_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_ENUM_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_ENUM_HPP */
diff --git a/boost/vmd/equal.hpp b/boost/vmd/equal.hpp
new file mode 100644
index 0000000000..005a2d3705
--- /dev/null
+++ b/boost/vmd/equal.hpp
@@ -0,0 +1,89 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_EQUAL_HPP)
+#define BOOST_VMD_EQUAL_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/equal.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_EQUAL(sequence,...)
+
+ \brief Tests any two sequences for equality.
+
+ sequence = First sequence.
+ ... = variadic parameters, maximum of 2.
+
+ The first variadic parameter is required and is the second sequence to test.
+ The optional second variadic parameter is a VMD type as a filter.
+
+ The macro tests any two sequences for equality. For sequences to be equal the
+ VMD types of each sequence must be equal and the individual elements of the
+ sequence must be equal. For Boost PP composite types the macro tests that
+ the composite types have the same size and then tests that each element
+ of the composite type is equal. This means that all elements of a composite
+ type must be a VMD type in order to use this macro successfully.
+
+ The single optional parameter is a filter. The filter is a VMD type which specifies
+ that both sequences to test must be of that VMD type, as well as being equal to
+ each other, for the test to succeed.
+
+ returns = 1 upon success or 0 upon failure. Success means that both sequences are
+ equal and, if the optional parameter is specified, that the sequences are
+ of the optional VMD type.
+
+*/
+
+#define BOOST_VMD_EQUAL(sequence,...) \
+ BOOST_VMD_DETAIL_EQUAL(sequence,__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_EQUAL_D(d,sequence,...)
+
+ \brief Tests any two sequences for equality. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = First sequence.
+ ... = variadic parameters, maximum of 2.
+
+ The first variadic parameter is required and is the second sequence to test.
+ The optional second variadic parameter is a VMD type as a filter.
+
+ The macro tests any two sequences for equality. For sequences to be equal the
+ VMD types of each sequence must be equal and the individual elements of the
+ sequence must be equal. For Boost PP composite types the macro tests that
+ the composite types have the same size and then tests that each element
+ of the composite type is equal. This means that all elements of a composite
+ type must be a VMD type in order to use this macro successfully.
+
+ The single optional parameter is a filter. The filter is a VMD type which specifies
+ that both sequences to test must be of that VMD type, as well as being equal to
+ each other, for the test to succeed.
+
+ returns = 1 upon success or 0 upon failure. Success means that both sequences are
+ equal and, if the optional parameter is specified, that the sequences are
+ of the optional VMD type.
+
+*/
+
+#define BOOST_VMD_EQUAL_D(d,sequence,...) \
+ BOOST_VMD_DETAIL_EQUAL_D(d,sequence,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_EQUAL_HPP */
diff --git a/boost/vmd/get_type.hpp b/boost/vmd/get_type.hpp
new file mode 100644
index 0000000000..489e155f10
--- /dev/null
+++ b/boost/vmd/get_type.hpp
@@ -0,0 +1,123 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_GET_TYPE_HPP)
+#define BOOST_VMD_GET_TYPE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_type.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_GET_TYPE(...)
+
+ \brief Returns the type of a sequence as a VMD type.
+
+ ... = variadic parameters.
+
+ The first variadic parameter is required and is the sequence whose type we are getting.
+
+ The optional variadic parameters are return type parameters.
+
+ The macro returns the type of a sequence as a VMD type. The type of an empty sequence
+ is always BOOST_VMD_TYPE_EMPTY and the type of a multi-element is always
+ BOOST_VMD_TYPE_SEQUENCE. The type of a single-element sequence is the
+ type of that single element.
+
+ The type returned can be modified by specifying an optional return type parameter.
+
+ If BOOST_VMD_RETURN_TYPE, the default, is specified the specific type of the element
+ is returned.
+
+ If BOOST_VMD_RETURN_TYPE_ARRAY is specified
+ an array type is returned if the element is an array, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_TUPLE is specified
+ a tuple type is returned for all tuple-like data, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_NO_TYPE is specified it is ignored since the macro
+ always returns the type of the sequence.
+
+ If more than one return type optional parameter is specified the last
+ one specified determines the return type.
+
+ returns = the type of the sequence as a VMD type.
+
+*/
+
+#define BOOST_VMD_GET_TYPE(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_GET_TYPE_D(d,...)
+
+ \brief Returns the type of a sequence as a VMD type. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = variadic parameters.
+
+ The first variadic parameter is required and is the sequence whose type we are getting.
+
+ The optional variadic parameters are return type parameters.
+
+ The macro returns the type of a sequence as a VMD type. The type of an empty sequence
+ is always BOOST_VMD_TYPE_EMPTY and the type of a multi-element is always
+ BOOST_VMD_TYPE_SEQUENCE. The type of a single-element sequence is the
+ type of that single element.
+
+ The type returned can be modified by specifying an optional return type parameter.
+
+ If BOOST_VMD_RETURN_TYPE, the default, is specified the specific type of the element
+ is returned.
+
+ If BOOST_VMD_RETURN_TYPE_ARRAY is specified
+ an array type is returned if the element is an array, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple
+ type is returned if the element is a tuple, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_TYPE_TUPLE is specified
+ a tuple type is returned for all tuple-like data, else the actual type
+ is returned for non-tuple data.
+
+ If BOOST_VMD_RETURN_NO_TYPE is specified it is ignored since the macro
+ always returns the type of the sequence.
+
+ If more than one return type optional parameter is specified the last
+ one specified determines the return type.
+
+ returns = the type of the sequence as a VMD type.
+
+*/
+
+#define BOOST_VMD_GET_TYPE_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TYPE_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_GET_TYPE_HPP */
diff --git a/boost/vmd/identity.hpp b/boost/vmd/identity.hpp
new file mode 100644
index 0000000000..870065cb02
--- /dev/null
+++ b/boost/vmd/identity.hpp
@@ -0,0 +1,76 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IDENTITY_HPP)
+#define BOOST_VMD_IDENTITY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#if BOOST_VMD_MSVC
+#include <boost/preprocessor/cat.hpp>
+#endif
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IDENTITY(item)
+
+ \brief Macro which expands to its argument when invoked with any number of parameters.
+
+ item = any single argument
+
+ When BOOST_VMD_IDENTITY(item) is subsequently invoked with any number of parameters it expands
+ to 'item'. Subsequently invoking the macro is done as 'BOOST_VMD_IDENTITY(item)(zero_or_more_arguments)'.
+
+ The macro is equivalent to the Boost PP macro BOOST_PP_IDENTITY(item) with the difference
+ being that BOOST_PP_IDENTITY(item) is always invoked with no arguments, as in
+ 'BOOST_VMD_IDENTITY(item)()' whereas BOOST_VMD_IDENTITY can be invoked with any number of
+ arguments.
+
+ The macro is meant to be used in BOOST_PP_IF and BOOST_PP_IIF statements when only one
+ of the clauses needs to be invoked with calling another macro and the other is meant to
+ return an 'item'.
+
+ returns = the macro as 'BOOST_VMD_IDENTITY(item)', when invoked with any number of parameters
+ as in '(zero_or_more_arguments)', returns 'item'. The macro itself returns
+ 'item BOOST_VMD_EMPTY'.
+
+*/
+
+#define BOOST_VMD_IDENTITY(item) item BOOST_VMD_EMPTY
+
+/** \def BOOST_VMD_IDENTITY_RESULT(result)
+
+ \brief Macro which wraps any result which can return its value using BOOST_VMD_IDENTITY or 'item BOOST_VMD_EMPTY'.
+
+ result = any single result returned when BOOST_VMD_IDENTITY is used or 'item BOOST_VMD_EMPTY'.
+
+ The reason for this macro is to smooth over a problem when using VC++ with BOOST_VMD_IDENTITY.
+ If your BOOST_VMD_IDENTITY macro can be used where VC++ is the compiler then you need to
+ surround your macro code which could return a result with this macro in order that VC++ handles
+ BOOST_VMD_IDENTITY correctly.
+
+ If you are not using VC++ you do not have to use this macro, but doing so does no harm.
+
+*/
+
+#if BOOST_VMD_MSVC
+#define BOOST_VMD_IDENTITY_RESULT(result) BOOST_PP_CAT(result,)
+#else
+#define BOOST_VMD_IDENTITY_RESULT(result) result
+#endif
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IDENTITY_HPP */
diff --git a/boost/vmd/is_array.hpp b/boost/vmd/is_array.hpp
new file mode 100644
index 0000000000..fc9cf4708e
--- /dev/null
+++ b/boost/vmd/is_array.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_ARRAY_HPP)
+#define BOOST_VMD_IS_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_array.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_ARRAY(sequence)
+
+ \brief Determines if a sequence is a Boost PP array.
+
+ The macro checks that the sequence is a Boost PP array.
+ It returns 1 if it is an array, else if returns 0.
+
+ sequence = a possible Boost PP array.
+
+ returns = 1 if it is an array, else returns 0.
+
+ The macro will generate a preprocessing error if the input
+ is in the form of an array but its first tuple element, instead
+ of being a number, is a preprocessor token which VMD cannot parse,
+ as in the example '(&2,(0,1))' which is a valid tuple but an invalid
+ array.
+
+*/
+
+#define BOOST_VMD_IS_ARRAY(sequence) \
+ BOOST_VMD_DETAIL_IS_ARRAY(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_ARRAY_D(d,sequence)
+
+ \brief Determines if a sequence is a Boost PP array. Re-entrant version.
+
+ The macro checks that the sequence is a Boost PP array.
+ It returns 1 if it is an array, else if returns 0.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible Boost PP array.
+
+ returns = 1 if it is an array, else returns 0.
+
+ The macro will generate a preprocessing error if the input
+ is in the form of an array but its first tuple element, instead
+ of being a number, is a preprocessor token which VMD cannot parse,
+ as in the example '(&2,(0,1))' which is a valid tuple but an invalid
+ array.
+
+*/
+
+#define BOOST_VMD_IS_ARRAY_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_ARRAY_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_ARRAY_HPP */
diff --git a/boost/vmd/is_empty.hpp b/boost/vmd/is_empty.hpp
new file mode 100644
index 0000000000..951c98bf6d
--- /dev/null
+++ b/boost/vmd/is_empty.hpp
@@ -0,0 +1,95 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_EMPTY_HPP)
+#define BOOST_VMD_IS_EMPTY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+#include <boost/vmd/detail/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_EMPTY(...)
+
+ \brief Tests whether its input is empty or not.
+
+ The macro checks to see if the input is empty or not.
+ It returns 1 if the input is empty, else returns 0.
+
+ The macro is a variadic macro taking any input.
+ For the VC++8 compiler (VS2005) the macro takes a single parameter of input to check.
+
+ The macro is not perfect, and can not be so. The problem
+ area is if the input to be checked is a function-like
+ macro name, in which case either a compiler error can result
+ or a false result can occur.
+
+ This macro is a replacement, using variadic macro support,
+ for the undocumented macro BOOST_PP_IS_EMPTY in the Boost
+ PP library. The code is taken from a posting by Paul Mensonides
+ of a variadic version for BOOST_PP_IS_EMPTY, and changed
+ in order to also support VC++.
+
+ .... = variadic input, for VC++8 this must be a single parameter
+
+ returns = 1 if the input is empty, 0 if it is not
+
+ It is recommended to append BOOST_PP_EMPTY() to whatever input
+ is being tested in order to avoid possible warning messages
+ from some compilers about no parameters being passed to the macro
+ when the input is truly empty.
+
+*/
+
+#if BOOST_VMD_MSVC_V8
+
+#define BOOST_VMD_IS_EMPTY(sequence) \
+ BOOST_VMD_DETAIL_IS_EMPTY_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ sequence \
+ ) \
+ ) \
+ ( \
+ BOOST_VMD_DETAIL_IS_EMPTY_GEN_ZERO, \
+ BOOST_VMD_DETAIL_IS_EMPTY_PROCESS \
+ ) \
+ (sequence) \
+/**/
+
+#else
+
+#define BOOST_VMD_IS_EMPTY(...) \
+ BOOST_VMD_DETAIL_IS_EMPTY_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ __VA_ARGS__ \
+ ) \
+ ) \
+ ( \
+ BOOST_VMD_DETAIL_IS_EMPTY_GEN_ZERO, \
+ BOOST_VMD_DETAIL_IS_EMPTY_PROCESS \
+ ) \
+ (__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_VMD_MSVC_V8 */
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_EMPTY_HPP */
diff --git a/boost/vmd/is_empty_array.hpp b/boost/vmd/is_empty_array.hpp
new file mode 100644
index 0000000000..913af70db9
--- /dev/null
+++ b/boost/vmd/is_empty_array.hpp
@@ -0,0 +1,98 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_EMPTY_ARRAY_HPP)
+#define BOOST_VMD_IS_EMPTY_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/is_array.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/detail/is_empty_array.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_EMPTY_ARRAY(sequence)
+
+ \brief Tests whether a sequence is an empty Boost PP array.
+
+ An empty Boost PP array is a two element tuple where the first
+ size element is 0 and the second element is a tuple with a single
+ empty element, ie. '(0,())'.
+
+ sequence = a possible empty array
+
+ returns = 1 if the sequence is an empty Boost PP array
+ 0 if it is not.
+
+ The macro will generate a preprocessing error if the sequence
+ is in the form of an array but its first tuple element, instead
+ of being a number, is a preprocessor token which VMD cannot parse,
+ as in the example '(&0,())' which is a valid tuple but an invalid
+ array.
+
+*/
+
+#define BOOST_VMD_IS_EMPTY_ARRAY(sequence) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_ARRAY(sequence), \
+ BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_SIZE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (sequence) \
+ ) \
+/**/
+
+/** \def BOOST_VMD_IS_EMPTY_ARRAY_D(d,sequence)
+
+ \brief Tests whether a sequence is an empty Boost PP array. Re-entrant version.
+
+ An empty Boost PP array is a two element tuple where the first
+ size element is 0 and the second element is a tuple with a single
+ empty element, ie. '(0,())'.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible empty array
+
+ returns = 1 if the sequence is an empty Boost PP array
+ 0 if it is not.
+
+ The macro will generate a preprocessing error if the sequence
+ is in the form of an array but its first tuple element, instead
+ of being a number, is a preprocessor token which VMD cannot parse,
+ as in the example '(&0,())' which is a valid tuple but an invalid
+ array.
+
+*/
+
+#define BOOST_VMD_IS_EMPTY_ARRAY_D(d,sequence) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_ARRAY_D(d,sequence), \
+ BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_SIZE, \
+ BOOST_VMD_IDENTITY(0) \
+ ) \
+ (sequence) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_EMPTY_ARRAY_HPP */
diff --git a/boost/vmd/is_empty_list.hpp b/boost/vmd/is_empty_list.hpp
new file mode 100644
index 0000000000..cad73a591e
--- /dev/null
+++ b/boost/vmd/is_empty_list.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_EMPTY_LIST_HPP)
+#define BOOST_VMD_IS_EMPTY_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_list.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_EMPTY_LIST(sequence)
+
+ \brief Tests whether a sequence is an empty Boost PP list.
+
+ An empty Boost PP list consists of the single identifier 'BOOST_PP_NIL'.
+ This identifier also serves as a list terminator for a non-empty list.
+
+ sequence = a preprocessor parameter
+
+ returns = 1 if the sequence is an empty Boost PP list
+ 0 if it is not.
+
+ The macro will generate a preprocessing error if the input
+ as an empty list marker, instead of being an identifier, is
+ a preprocessor token which VMD cannot parse, as in the
+ example '&BOOST_PP_NIL'.
+
+*/
+
+#define BOOST_VMD_IS_EMPTY_LIST(sequence) \
+ BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_EMPTY_LIST_D(d,sequence)
+
+ \brief Tests whether a sequence is an empty Boost PP list. Re-entrant version.
+
+ An empty Boost PP list consists of the single identifier 'BOOST_PP_NIL'.
+ This identifier also serves as a list terminator for a non-empty list.
+
+ d = The next available BOOST_PP_WHILE iteration
+ sequence = a preprocessor parameter
+
+ returns = 1 if the sequence is an empty Boost PP list
+ 0 if it is not.
+
+ The macro will generate a preprocessing error if the input
+ as an empty list marker, instead of being an identifier, is
+ a preprocessor token which VMD cannot parse, as in the
+ example '&BOOST_PP_NIL'.
+
+*/
+
+#define BOOST_VMD_IS_EMPTY_LIST_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_EMPTY_LIST_HPP */
diff --git a/boost/vmd/is_identifier.hpp b/boost/vmd/is_identifier.hpp
new file mode 100644
index 0000000000..b41b1b4eed
--- /dev/null
+++ b/boost/vmd/is_identifier.hpp
@@ -0,0 +1,117 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_IDENTIFIER_HPP)
+#define BOOST_VMD_IS_IDENTIFIER_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_identifier.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_IDENTIFIER(...)
+
+ \brief Tests whether a parameter is an identifier.
+
+ ... = variadic parameters
+
+ The first variadic parameter is required and it is the input to test.
+
+ Further variadic parameters are optional and are identifiers to match.
+ The data may take one of two forms; it is either one or more single identifiers
+ or a single Boost PP tuple of identifiers.
+
+ returns = 1 if the parameter is an identifier, otherwise 0.
+
+ If the parameter is not an identifier,
+ or if optional identifiers are specified and the identifier
+ does not match any of the optional identifiers, the macro returns 0.
+
+ Identifiers are registered in VMD with:
+
+ #define BOOST_VMD_REG_XXX (XXX) where XXX is a v-identifier.
+
+ The identifier must be registered to be found.
+
+ Identifiers are pre-detected in VMD with:
+
+ #define BOOST_VMD_DETECT_XXX_XXX where XXX is an identifier.
+
+ If you specify optional identifiers and have not specified the detection
+ of an optional identifier, that optional identifier will never match the input.
+
+ If the input is not a VMD data type this macro could lead to
+ a preprocessor error. This is because the macro
+ uses preprocessor concatenation to determine if the input
+ is an identifier once it is determined that the input does not
+ start with parenthesis. If the data being concatenated would
+ lead to an invalid preprocessor token the compiler can issue
+ a preprocessor error.
+
+*/
+
+#define BOOST_VMD_IS_IDENTIFIER(...) \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_IS_IDENTIFIER_D(d,...)
+
+ \brief Tests whether a parameter is an identifier. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = variadic parameters
+
+ The first variadic parameter is required and it is the input to test.
+
+ Further variadic parameters are optional and are identifiers to match.
+ The data may take one of two forms; it is either one or more single identifiers
+ or a single Boost PP tuple of identifiers.
+
+ returns = 1 if the parameter is an identifier, otherwise 0.
+
+ If the parameter is not an identifier,
+ or if optional identifiers are specified and the identifier
+ does not match any of the optional identifiers, the macro returns 0.
+
+ Identifiers are registered in VMD with:
+
+ #define BOOST_VMD_REG_XXX (XXX) where XXX is a v-identifier.
+
+ The identifier must be registered to be found.
+
+ Identifiers are pre-detected in VMD with:
+
+ #define BOOST_VMD_DETECT_XXX_XXX where XXX is an identifier.
+
+ If you specify optional identifiers and have not specified the detection
+ of an optional identifier, that optional identifier will never match the input.
+
+ If the input is not a VMD data type this macro could lead to
+ a preprocessor error. This is because the macro
+ uses preprocessor concatenation to determine if the input
+ is an identifier once it is determined that the input does not
+ start with parenthesis. If the data being concatenated would
+ lead to an invalid preprocessor token the compiler can issue
+ a preprocessor error.
+
+*/
+
+#define BOOST_VMD_IS_IDENTIFIER_D(d,...) \
+ BOOST_VMD_DETAIL_IS_IDENTIFIER_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_IDENTIFIER_HPP */
diff --git a/boost/vmd/is_list.hpp b/boost/vmd/is_list.hpp
new file mode 100644
index 0000000000..986872b4fc
--- /dev/null
+++ b/boost/vmd/is_list.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_LIST_HPP)
+#define BOOST_VMD_IS_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_list.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_LIST(sequence)
+
+ \brief Determines if a sequence is a Boost pplib list.
+
+ The macro checks that the sequence is a pplib list.
+ It returns 1 if it is a list, else if returns 0.
+
+ sequence = input as a possible Boost PP list.
+
+ returns = 1 if it a list, else returns 0.
+
+ The macro will generate a preprocessing error if the input
+ is in the form of a list but its end-of-list marker, instead
+ of being an identifier, is a preprocessor token which VMD cannot parse,
+ as in the example '(anything,&BOOST_PP_NIL)' which is a valid tuple but
+ an invalid list.
+
+*/
+
+#define BOOST_VMD_IS_LIST(sequence) \
+ BOOST_VMD_DETAIL_IS_LIST(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_LIST_D(d,sequence)
+
+ \brief Determines if a sequence is a Boost pplib list. Re-entrant version.
+
+ The macro checks that the sequence is a pplib list.
+ It returns 1 if it is a list, else if returns 0.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = input as a possible Boost PP list.
+
+ returns = 1 if it a list, else returns 0.
+
+ The macro will generate a preprocessing error if the input
+ is in the form of a list but its end-of-list marker, instead
+ of being an identifier, is a preprocessor token which VMD cannot parse,
+ as in the example '(anything,&BOOST_PP_NIL)' which is a valid tuple but
+ an invalid list.
+
+*/
+
+#define BOOST_VMD_IS_LIST_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_LIST_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_LIST_HPP */
diff --git a/boost/vmd/is_multi.hpp b/boost/vmd/is_multi.hpp
new file mode 100644
index 0000000000..d080837167
--- /dev/null
+++ b/boost/vmd/is_multi.hpp
@@ -0,0 +1,67 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_MULTI_HPP)
+#define BOOST_VMD_IS_MULTI_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_arity.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_MULTI(sequence)
+
+ \brief Determines if the sequence has more than one element, referred to as a multi-element sequence.
+
+ sequence = a sequence
+
+ returns = 1 if the sequence is a multi-element sequence, else returns 0.
+
+ If the size of a sequence is known it is faster comparing that size to be greater
+ than one to find out if the sequence is multi-element. But if the size of the
+ sequence is not known it is faster calling this macro than getting the size and
+ doing the previously mentioned comparison in order to determine if the sequence
+ is multi-element or not.
+
+*/
+
+#define BOOST_VMD_IS_MULTI(sequence) \
+ BOOST_VMD_DETAIL_IS_MULTI(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_MULTI_D(d,sequence)
+
+ \brief Determines if the sequence has more than one element, referred to as a multi-element sequence.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a sequence
+
+ returns = 1 if the sequence is a multi-element sequence, else returns 0.
+
+ If the size of a sequence is known it is faster comparing that size to be greater
+ than one to find out if the sequence is multi-element. But if the size of the
+ sequence is not known it is faster calling this macro than getting the size and
+ doing the previously mentioned comparison in order to determine if the sequence
+ is multi-element or not.
+
+*/
+
+#define BOOST_VMD_IS_MULTI_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_MULTI_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_MULTI_HPP */
diff --git a/boost/vmd/is_number.hpp b/boost/vmd/is_number.hpp
new file mode 100644
index 0000000000..7bc66fa4f6
--- /dev/null
+++ b/boost/vmd/is_number.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_NUMBER_HPP)
+#define BOOST_VMD_IS_NUMBER_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_number.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_NUMBER(sequence)
+
+ \brief Tests whether a sequence is a Boost PP number.
+
+ The macro checks to see if a sequence is a Boost PP number.
+ A Boost PP number is a value from 0 to 256.
+
+ sequence = a possible number
+
+ returns = 1 if the sequence is a Boost PP number,
+ 0 if it is not.
+
+ If the input is not a VMD data type this macro could lead to
+ a preprocessor error. This is because the macro
+ uses preprocessor concatenation to determine if the input
+ is a number once it is determined that the input does not
+ start with parenthesis. If the data being concatenated would
+ lead to an invalid preprocessor token the compiler can issue
+ a preprocessor error.
+
+*/
+
+#define BOOST_VMD_IS_NUMBER(sequence) \
+ BOOST_VMD_DETAIL_IS_NUMBER(sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_NUMBER_HPP */
diff --git a/boost/vmd/is_parens_empty.hpp b/boost/vmd/is_parens_empty.hpp
new file mode 100644
index 0000000000..dad7bafecb
--- /dev/null
+++ b/boost/vmd/is_parens_empty.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_PARENS_EMPTY_HPP)
+#define BOOST_VMD_IS_PARENS_EMPTY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_empty_tuple.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_PARENS_EMPTY(sequence)
+
+ \brief Determines if the sequence is a set of parens with no data.
+
+ sequence = a VMD sequence
+
+ returns = 1 if the sequence is a set of parens with no data,
+ else returns 0.
+
+ A set of parens with no data may be:
+
+ 1) a tuple whose size is a single element which is empty
+
+ or
+
+ 2) a single element seq whose data is empty
+
+*/
+
+#define BOOST_VMD_IS_PARENS_EMPTY(sequence) \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_PARENS_EMPTY_D(d,sequence)
+
+ \brief Determines if the sequence is a set of parens with no data. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a VMD sequence
+
+ returns = 1 if the sequence is a set of parens with no data,
+ else returns 0.
+
+ A set of parens with no data may be:
+
+ 1) a tuple whose size is a single element which is empty
+
+ or
+
+ 2) a single element seq whose data is empty
+
+*/
+
+#define BOOST_VMD_IS_PARENS_EMPTY_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_PARENS_EMPTY_HPP */
diff --git a/boost/vmd/is_seq.hpp b/boost/vmd/is_seq.hpp
new file mode 100644
index 0000000000..3bf4f203c5
--- /dev/null
+++ b/boost/vmd/is_seq.hpp
@@ -0,0 +1,71 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_SEQ_HPP)
+#define BOOST_VMD_IS_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_seq.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_SEQ(sequence)
+
+ \brief Determines if a sequence is a Boost PP seq.
+
+ The macro checks that the sequence is a Boost PP seq.
+ It returns 1 if it is a seq, else if returns 0.
+
+ sequence = a possible Boost PP seq
+
+ returns = 1 if it a seq, else returns 0.
+
+ A single set of parentheses, with a single element,
+ is parsed as a tuple and not a seq. To be parsed as
+ a seq the input needs to be more than one consecutive
+ sets of parentheses, each with a single element of data.
+
+*/
+
+#define BOOST_VMD_IS_SEQ(sequence) \
+ BOOST_VMD_DETAIL_IS_SEQ(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_SEQ_D(d,sequence)
+
+ \brief Determines if a sequence is a Boost PP seq. Re-entrant version.
+
+ The macro checks that the sequence is a Boost PP seq.
+ It returns 1 if it is a seq, else if returns 0.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible Boost PP seq
+
+ returns = 1 if it a seq, else returns 0.
+
+ A single set of parentheses, with a single element,
+ is parsed as a tuple and not a seq. To be parsed as
+ a seq the input needs to be more than one consecutive
+ sets of parentheses, each with a single element of data.
+
+*/
+
+#define BOOST_VMD_IS_SEQ_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_SEQ_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_SEQ_HPP */
diff --git a/boost/vmd/is_tuple.hpp b/boost/vmd/is_tuple.hpp
new file mode 100644
index 0000000000..2f7d0436db
--- /dev/null
+++ b/boost/vmd/is_tuple.hpp
@@ -0,0 +1,45 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_TUPLE_HPP)
+#define BOOST_VMD_IS_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_tuple.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_TUPLE(sequence)
+
+ \brief Tests whether a sequence is a Boost PP tuple.
+
+ The macro checks to see if a sequence is a Boost PP tuple.
+ A Boost PP tuple is preprocessor tokens enclosed by a set of parentheses
+ with no preprocessing tokens before or after the parentheses.
+
+ sequence = a possible tuple
+
+ returns = 1 if the sequence is a Boost PP tuple.
+ 0 if it is not.
+
+*/
+
+#define BOOST_VMD_IS_TUPLE(sequence) \
+ BOOST_VMD_DETAIL_IS_TUPLE(sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_TUPLE_HPP */
diff --git a/boost/vmd/is_type.hpp b/boost/vmd/is_type.hpp
new file mode 100644
index 0000000000..8ddfdcd033
--- /dev/null
+++ b/boost/vmd/is_type.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_TYPE_HPP)
+#define BOOST_VMD_IS_TYPE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/is_type.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_TYPE(sequence)
+
+ \brief Tests whether a sequence is a VMD type.
+
+ sequence = a possible VMD type
+
+ returns = 1 if the sequence is a VMD type,
+ 0 if it is not.
+
+ If the sequence is not a VMD data type this macro could lead to
+ a preprocessor error. This is because the macro
+ uses preprocessor concatenation to determine if the sequence
+ is an identifier once it is determined that the sequence does not
+ start with parentheses. If the data being concatenated would
+ lead to an invalid preprocessor token the compiler can issue
+ a preprocessor error.
+
+*/
+
+#define BOOST_VMD_IS_TYPE(sequence) \
+ BOOST_VMD_DETAIL_IS_TYPE(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_TYPE_D(d,sequence)
+
+ \brief Tests whether a sequence is a VMD type. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a possible VMD type
+
+ returns = 1 if the sequence is a VMD type,
+ 0 if it is not.
+
+ If the sequence is not a VMD data type this macro could lead to
+ a preprocessor error. This is because the macro
+ uses preprocessor concatenation to determine if the sequence
+ is an identifier once it is determined that the sequence does not
+ start with parentheses. If the data being concatenated would
+ lead to an invalid preprocessor token the compiler can issue
+ a preprocessor error.
+
+*/
+
+#define BOOST_VMD_IS_TYPE_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_TYPE_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_TYPE_HPP */
diff --git a/boost/vmd/is_unary.hpp b/boost/vmd/is_unary.hpp
new file mode 100644
index 0000000000..1f44c19bfd
--- /dev/null
+++ b/boost/vmd/is_unary.hpp
@@ -0,0 +1,67 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_UNARY_HPP)
+#define BOOST_VMD_IS_UNARY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_arity.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_UNARY(sequence)
+
+ \brief Determines if the sequence has only a single element, referred to as a single-element sequence.
+
+ sequence = a VMD sequence
+
+ returns = 1 if the sequence is a single-element sequence, else returns 0.
+
+ If the size of a sequence is known it is faster comparing that size to be equal
+ to one to find out if the sequence is single-element. But if the size of the
+ sequence is not known it is faster calling this macro than getting the size and
+ doing the previously mentioned comparison in order to determine if the sequence
+ is single-element or not.
+
+*/
+
+#define BOOST_VMD_IS_UNARY(sequence) \
+ BOOST_VMD_DETAIL_IS_UNARY(sequence) \
+/**/
+
+/** \def BOOST_VMD_IS_UNARY_D(d,sequence)
+
+ \brief Determines if the sequence has only a single element, referred to as a single-element sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = a sequence
+
+ returns = 1 if the sequence is a single-element sequence, else returns 0.
+
+ If the size of a sequence is known it is faster comparing that size to be equal
+ to one to find out if the sequence is single-element. But if the size of the
+ sequence is not known it is faster calling this macro than getting the size and
+ doing the previously mentioned comparison in order to determine if the sequence
+ is single-element or not.
+
+*/
+
+#define BOOST_VMD_IS_UNARY_D(d,sequence) \
+ BOOST_VMD_DETAIL_IS_UNARY_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_UNARY_HPP */
diff --git a/boost/vmd/list.hpp b/boost/vmd/list.hpp
new file mode 100644
index 0000000000..9a80a60ff4
--- /dev/null
+++ b/boost/vmd/list.hpp
@@ -0,0 +1,18 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_LIST_HPP)
+#define BOOST_VMD_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/list/to_seq.hpp>
+#include <boost/vmd/list/to_tuple.hpp>
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_LIST_HPP */
diff --git a/boost/vmd/list/to_seq.hpp b/boost/vmd/list/to_seq.hpp
new file mode 100644
index 0000000000..a53e8407c5
--- /dev/null
+++ b/boost/vmd/list/to_seq.hpp
@@ -0,0 +1,49 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_LIST_TO_SEQ_HPP)
+#define BOOST_VMD_LIST_TO_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/list/to_seq.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty_list.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_LIST_TO_SEQ(list)
+
+ \brief converts a list to a seq.
+
+ list = list to be converted.
+
+ If the list is an empty list (BOOST_PP_NIL) it is converted to an empty seq.
+ Otherwise the list is converted to a seq with the same number of elements as the list.
+*/
+
+#define BOOST_VMD_LIST_TO_SEQ(list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY_LIST(list), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_LIST_TO_SEQ \
+ ) \
+ (list) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_LIST_TO_SEQ_HPP */
diff --git a/boost/vmd/list/to_tuple.hpp b/boost/vmd/list/to_tuple.hpp
new file mode 100644
index 0000000000..ddcd2069c1
--- /dev/null
+++ b/boost/vmd/list/to_tuple.hpp
@@ -0,0 +1,49 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_LIST_TO_TUPLE_HPP)
+#define BOOST_VMD_LIST_TO_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/list/to_tuple.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty_list.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_LIST_TO_TUPLE(list)
+
+ \brief converts a list to a tuple.
+
+ list = list to be converted.
+
+ If the list is an empty list (BOOST_PP_NIL) it is converted to an empty tuple.
+ Otherwise the list is converted to a tuple with the same number of elements as the list.
+*/
+
+#define BOOST_VMD_LIST_TO_TUPLE(list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY_LIST(list), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_LIST_TO_TUPLE \
+ ) \
+ (list) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_LIST_TO_TUPLE_HPP */
diff --git a/boost/vmd/not_equal.hpp b/boost/vmd/not_equal.hpp
new file mode 100644
index 0000000000..2480cdc00a
--- /dev/null
+++ b/boost/vmd/not_equal.hpp
@@ -0,0 +1,94 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_NOT_EQUAL_HPP)
+#define BOOST_VMD_NOT_EQUAL_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/vmd/equal.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_NOT_EQUAL(sequence,...)
+
+ \brief Tests any two sequences for inequality.
+
+ sequence = First sequence.
+ ... = variadic parameters, maximum of 2.
+
+ The first variadic parameter is required and is the second sequence to test.
+ The optional second variadic parameter is a VMD type as a filter.
+
+ The macro tests any two sequences for inequality. For sequences to be unequal
+ either the VMD types of each sequence must be unequal or the individual elements of the
+ sequence must be unequal.
+
+ The single optional parameter is a filter. The filter is a VMD type which specifies
+ that both sequences to test must be of that VMD type, as well as being equal to
+ each other, for the test to fail, else it succeeds.
+
+ returns = 1 upon success or 0 upon failure. Success means that the sequences are
+ unequal or, if the optional parameter is specified, that the sequences are
+ not of the optional VMD type; otherwise 0 is returned if the sequences
+ are equal.
+
+ The macro is implemented as the complement of BOOST_VMD_EQUAL, so that whenever
+ BOOST_VMD_EQUAL would return 1 the macro returns 0 and whenever BOOST_VMD_EQUAL
+ would return 0 the macro would return 1.
+
+*/
+
+#define BOOST_VMD_NOT_EQUAL(sequence,...) \
+ BOOST_PP_COMPL(BOOST_VMD_EQUAL(sequence,__VA_ARGS__)) \
+/**/
+
+/** \def BOOST_VMD_NOT_EQUAL_D(d,sequence,...)
+
+ \brief Tests any two sequences for inequality. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = First sequence.
+ ... = variadic parameters, maximum of 2.
+
+ The first variadic parameter is required and is the second sequence to test.
+ The optional second variadic parameter is a VMD type as a filter.
+
+ The macro tests any two sequences for inequality. For sequences to be unequal
+ either the VMD types of each sequence must be unequal or the individual elements of the
+ sequence must be unequal.
+
+ The single optional parameter is a filter. The filter is a VMD type which specifies
+ that both sequences to test must be of that VMD type, as well as being equal to
+ each other, for the test to fail, else it succeeds.
+
+ returns = 1 upon success or 0 upon failure. Success means that the sequences are
+ unequal or, if the optional parameter is specified, that the sequences are
+ not of the optional VMD type; otherwise 0 is returned if the sequences
+ are equal.
+
+ The macro is implemented as the complement of BOOST_VMD_EQUAL, so that whenever
+ BOOST_VMD_EQUAL would return 1 the macro returns 0 and whenever BOOST_VMD_EQUAL
+ would return 0 the macro would return 1.
+
+*/
+
+#define BOOST_VMD_NOT_EQUAL_D(d,sequence,...) \
+ BOOST_PP_COMPL(BOOST_VMD_EQUAL_D(d,sequence,__VA_ARGS__)) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_NOT_EQUAL_HPP */
diff --git a/boost/vmd/seq.hpp b/boost/vmd/seq.hpp
new file mode 100644
index 0000000000..5a09759894
--- /dev/null
+++ b/boost/vmd/seq.hpp
@@ -0,0 +1,26 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_HPP)
+#define BOOST_VMD_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/seq/is_vmd_seq.hpp>
+#include <boost/vmd/seq/pop_back.hpp>
+#include <boost/vmd/seq/pop_front.hpp>
+#include <boost/vmd/seq/push_back.hpp>
+#include <boost/vmd/seq/push_front.hpp>
+#include <boost/vmd/seq/remove.hpp>
+#include <boost/vmd/seq/size.hpp>
+#include <boost/vmd/seq/to_array.hpp>
+#include <boost/vmd/seq/to_list.hpp>
+#include <boost/vmd/seq/to_tuple.hpp>
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_HPP */
diff --git a/boost/vmd/seq/is_vmd_seq.hpp b/boost/vmd/seq/is_vmd_seq.hpp
new file mode 100644
index 0000000000..38648d2fd0
--- /dev/null
+++ b/boost/vmd/seq/is_vmd_seq.hpp
@@ -0,0 +1,56 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_VMD_SEQ_HPP)
+#define BOOST_VMD_IS_VMD_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_seq.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_VMD_SEQ(sequence)
+
+ \brief Determines if a sequence is a VMD seq.
+
+ The macro checks that the sequence is a VMD seq.
+ A VMD seq, which may be a Boost PP seq or emptiness, is a superset of a Boost PP seq.
+ It returns 1 if it is a VMD seq, else if returns 0.
+
+ sequence = a possible Boost PP seq
+
+ returns = 1 if it a VMD seq, else returns 0.
+
+*/
+
+#define BOOST_VMD_IS_VMD_SEQ(sequence) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(sequence), \
+ BOOST_VMD_IDENTITY(1), \
+ BOOST_VMD_IS_SEQ \
+ ) \
+ (sequence) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_VMD_SEQ_HPP */
diff --git a/boost/vmd/seq/pop_back.hpp b/boost/vmd/seq/pop_back.hpp
new file mode 100644
index 0000000000..5e3865a552
--- /dev/null
+++ b/boost/vmd/seq/pop_back.hpp
@@ -0,0 +1,51 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_POP_BACK_HPP)
+#define BOOST_VMD_SEQ_POP_BACK_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/pop_back.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_POP_BACK(seq)
+
+ \brief pops an element from the end of a seq.
+
+ seq = seq to pop an element from.
+
+ If the seq is an empty seq the result is undefined.
+ If the seq is a single element the result is an empty seq.
+ Otherwise the result is a seq after removing the last element.
+*/
+
+#define BOOST_VMD_SEQ_POP_BACK(seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq),1), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_SEQ_POP_BACK \
+ ) \
+ (seq) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_POP_BACK_HPP */
diff --git a/boost/vmd/seq/pop_front.hpp b/boost/vmd/seq/pop_front.hpp
new file mode 100644
index 0000000000..782c75e956
--- /dev/null
+++ b/boost/vmd/seq/pop_front.hpp
@@ -0,0 +1,51 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_POP_FRONT_HPP)
+#define BOOST_VMD_SEQ_POP_FRONT_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/pop_front.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_POP_FRONT(seq)
+
+ \brief pops an element from the front of a seq.
+
+ seq = seq to pop an element from.
+
+ If the seq is an empty seq the result is undefined.
+ If the seq is a single element the result is an empty seq.
+ Otherwise the result is a seq after removing the first element.
+*/
+
+#define BOOST_VMD_SEQ_POP_FRONT(seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq),1), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_SEQ_POP_FRONT \
+ ) \
+ (seq) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_POP_FRONT_HPP */
diff --git a/boost/vmd/seq/push_back.hpp b/boost/vmd/seq/push_back.hpp
new file mode 100644
index 0000000000..862fc791fa
--- /dev/null
+++ b/boost/vmd/seq/push_back.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_PUSH_BACK_HPP)
+#define BOOST_VMD_SEQ_PUSH_BACK_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/push_back.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_PUSH_BACK(seq,elem)
+
+ \brief appends an element to the end of a seq.
+
+ seq = seq to to append an element to.
+ elem = element to append.
+
+ If the seq is an empty seq the result is a seq with the single element.
+ Otherwise the result is a seq after adding the element to the end.
+*/
+
+#define BOOST_VMD_SEQ_PUSH_BACK(seq,elem) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_IDENTITY((elem)), \
+ BOOST_PP_SEQ_PUSH_BACK \
+ ) \
+ (seq,elem) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_PUSH_BACK_HPP */
diff --git a/boost/vmd/seq/push_front.hpp b/boost/vmd/seq/push_front.hpp
new file mode 100644
index 0000000000..33b2683526
--- /dev/null
+++ b/boost/vmd/seq/push_front.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_PUSH_FRONT_HPP)
+#define BOOST_VMD_SEQ_PUSH_FRONT_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/push_front.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_PUSH_FRONT(seq,elem)
+
+ \brief inserts an element at the beginning of a seq.
+
+ seq = seq to insert an element at.
+ elem = element to insert.
+
+ If the seq is an empty seq the result is a seq with the single element.
+ Otherwise the result is a seq after inserting the element at the beginning.
+*/
+
+#define BOOST_VMD_SEQ_PUSH_FRONT(seq,elem) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_IDENTITY((elem)), \
+ BOOST_PP_SEQ_PUSH_FRONT \
+ ) \
+ (seq,elem) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_PUSH_FRONT_HPP */
diff --git a/boost/vmd/seq/remove.hpp b/boost/vmd/seq/remove.hpp
new file mode 100644
index 0000000000..11a7a7ec4c
--- /dev/null
+++ b/boost/vmd/seq/remove.hpp
@@ -0,0 +1,57 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_REMOVE_HPP)
+#define BOOST_VMD_SEQ_REMOVE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/seq/remove.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_REMOVE(seq,index)
+
+ \brief removes an element from a seq.
+
+ seq = seq from which an element is to be removed.
+ index = The zero-based position in seq of the element to be removed.
+
+ If index is greater or equal to the seq size the result is undefined.
+ If the seq is a single element and the index is 0 the result is an empty seq.
+ Otherwise the result is a seq after removing the index element.
+*/
+
+#define BOOST_VMD_SEQ_REMOVE(seq,index) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_EQUAL(index,0), \
+ BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(seq),1) \
+ ), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_SEQ_REMOVE \
+ ) \
+ (seq,index) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_REMOVE_HPP */
diff --git a/boost/vmd/seq/size.hpp b/boost/vmd/seq/size.hpp
new file mode 100644
index 0000000000..0deef78db9
--- /dev/null
+++ b/boost/vmd/seq/size.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_SIZE_HPP)
+#define BOOST_VMD_SEQ_SIZE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_SIZE(seq)
+
+ \brief expands to the size of the seq passed to it.
+
+ seq = seq whose size is to be extracted.
+
+ If the seq is an empty seq its size is 0.
+ Otherwise the result is the number of elements in the seq.
+*/
+
+#define BOOST_VMD_SEQ_SIZE(seq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_PP_SEQ_SIZE \
+ ) \
+ (seq) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_SIZE_HPP */
diff --git a/boost/vmd/seq/to_array.hpp b/boost/vmd/seq/to_array.hpp
new file mode 100644
index 0000000000..37b42f79e7
--- /dev/null
+++ b/boost/vmd/seq/to_array.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_TO_ARRAY_HPP)
+#define BOOST_VMD_SEQ_TO_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/to_array.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_TO_ARRAY(seq)
+
+ \brief converts a seq to an array.
+
+ seq = seq to be converted.
+
+ If the seq is an empty seq it is converted to an array with 0 elements.
+ Otherwise the seq is converted to an array with the same number of elements as the seq.
+*/
+
+#define BOOST_VMD_SEQ_TO_ARRAY(seq) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_IDENTITY((0,())), \
+ BOOST_PP_SEQ_TO_ARRAY \
+ ) \
+ (seq) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_TO_ARRAY_HPP */
diff --git a/boost/vmd/seq/to_list.hpp b/boost/vmd/seq/to_list.hpp
new file mode 100644
index 0000000000..129f7b857f
--- /dev/null
+++ b/boost/vmd/seq/to_list.hpp
@@ -0,0 +1,65 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_TO_LIST_HPP)
+#define BOOST_VMD_SEQ_TO_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/to_list.hpp>
+// #include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_TO_LIST(seq)
+
+ \brief converts a seq to a list.
+
+ seq = seq to be converted.
+
+ If the seq is an empty seq it is converted to an empty list (BOOST_PP_NIL).
+ Otherwise the seq is converted to a list with the same number of elements as the seq.
+*/
+
+#if BOOST_VMD_MSVC
+#define BOOST_VMD_SEQ_TO_LIST(seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_SEQ_TO_LIST_PE, \
+ BOOST_VMD_SEQ_TO_LIST_NPE \
+ ) \
+ (seq) \
+/**/
+#define BOOST_VMD_SEQ_TO_LIST_PE(seq) BOOST_PP_NIL
+/**/
+#define BOOST_VMD_SEQ_TO_LIST_NPE(seq) BOOST_PP_SEQ_TO_LIST(seq)
+/**/
+#else
+#define BOOST_VMD_SEQ_TO_LIST(seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_IDENTITY(BOOST_PP_NIL), \
+ BOOST_PP_SEQ_TO_LIST \
+ ) \
+ (seq) \
+/**/
+#endif
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_TO_LIST_HPP */
diff --git a/boost/vmd/seq/to_tuple.hpp b/boost/vmd/seq/to_tuple.hpp
new file mode 100644
index 0000000000..b41c5aca50
--- /dev/null
+++ b/boost/vmd/seq/to_tuple.hpp
@@ -0,0 +1,49 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SEQ_TO_TUPLE_HPP)
+#define BOOST_VMD_SEQ_TO_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SEQ_TO_TUPLE(seq)
+
+ \brief converts a seq to a tuple.
+
+ seq = seq to be converted.
+
+ If the seq is an empty seq it is converted to an empty tuple.
+ Otherwise the seq is converted to a tuple with the same number of elements as the seq.
+*/
+
+#define BOOST_VMD_SEQ_TO_TUPLE(seq) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(seq), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_SEQ_TO_TUPLE \
+ ) \
+ (seq) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SEQ_TO_TUPLE_HPP */
diff --git a/boost/vmd/size.hpp b/boost/vmd/size.hpp
new file mode 100644
index 0000000000..d2ff4d4b83
--- /dev/null
+++ b/boost/vmd/size.hpp
@@ -0,0 +1,57 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_SIZE_HPP)
+#define BOOST_VMD_SIZE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_size.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_SIZE(sequence)
+
+ \brief Returns the size of a sequence.
+
+ sequence = A sequence to test.
+
+ returns = If the sequence is empty returns 0, else returns the number of elements
+ in the sequence.
+
+*/
+
+#define BOOST_VMD_SIZE(sequence) \
+ BOOST_VMD_DETAIL_SEQUENCE_SIZE(sequence) \
+/**/
+
+/** \def BOOST_VMD_SIZE_D(d,sequence)
+
+ \brief Returns the size of a sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ sequence = A sequence to test.
+
+ returns = If the sequence is empty returns 0, else returns the number of elements
+ in the sequence.
+
+*/
+
+#define BOOST_VMD_SIZE_D(d,sequence) \
+ BOOST_VMD_DETAIL_SEQUENCE_SIZE_D(d,sequence) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_SIZE_HPP */
diff --git a/boost/vmd/to_array.hpp b/boost/vmd/to_array.hpp
new file mode 100644
index 0000000000..afecf9cb88
--- /dev/null
+++ b/boost/vmd/to_array.hpp
@@ -0,0 +1,101 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TO_ARRAY_HPP)
+#define BOOST_VMD_TO_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_to_array.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TO_ARRAY(...)
+
+ \brief Converts a sequence to a Boost PP array whose elements are the elements of the sequence.
+
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP array. The sequence is empty the Boost PP array is an empty array.
+ If an optional return type other than BOOST_VMD_RETURN_NO_TYPE
+ is specified the type and the data of each element is
+ returned as the array element. Otherwise just the data
+ is returned as the array element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_ARRAY(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_TO_ARRAY_D(d,...)
+
+ \brief Converts a sequence to a Boost PP array whose elements are the elements of the sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP array. The sequence is empty the Boost PP array is empty.
+ If an optional return type other than BOOST_VMD_RETURN_NO_TYPE
+ is specified the type and the data of each element is
+ returned as the array element. Otherwise just the data
+ is returned as the array element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_ARRAY_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TO_ARRAY_HPP */
diff --git a/boost/vmd/to_list.hpp b/boost/vmd/to_list.hpp
new file mode 100644
index 0000000000..eeae19235b
--- /dev/null
+++ b/boost/vmd/to_list.hpp
@@ -0,0 +1,101 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TO_LIST_HPP)
+#define BOOST_VMD_TO_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_to_list.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TO_LIST(...)
+
+ \brief Converts a sequence to a Boost PP list whose elements are the elements of the sequence.
+
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP list. The sequence is empty the Boost PP list is an empty list.
+ If an optional return type other than BOOST_VMD_RETURN_NO_TYPE
+ is specified the type and the data of each element is
+ returned as the list element. Otherwise just the data
+ is returned as the list element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_LIST(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_LIST(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_TO_LIST_D(d,...)
+
+ \brief Converts a sequence to a Boost PP list whose elements are the elements of the sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP list. The sequence is empty the Boost PP list is an empty list.
+ If an optional return type other than BOOST_VMD_RETURN_NO_TYPE
+ is specified the type and the data of each element is
+ returned as the list element. Otherwise just the data
+ is returned as the list element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_LIST_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TO_LIST_HPP */
diff --git a/boost/vmd/to_seq.hpp b/boost/vmd/to_seq.hpp
new file mode 100644
index 0000000000..ca11fee195
--- /dev/null
+++ b/boost/vmd/to_seq.hpp
@@ -0,0 +1,101 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TO_SEQ_HPP)
+#define BOOST_VMD_TO_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_to_seq.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TO_SEQ(...)
+
+ \brief Converts a sequence to a Boost PP seq whose elements are the elements of the sequence.
+
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP seq. If the sequence is empty the return is emptiness
+ since an empty seq does not exist. If an optional return type other
+ than BOOST_VMD_RETURN_NO_TYPE is specified the type and the data of
+ each element is returned as the seq element. Otherwise just the data
+ is returned as the seq element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_SEQ(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_TO_SEQ_D(d,...)
+
+ \brief Converts a sequence to a Boost PP seq whose elements are the elements of the sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP seq. If the sequence is empty the return is emptiness
+ since an empty seq does not exist. If an optional return type other
+ than BOOST_VMD_RETURN_NO_TYPE is specified the type and the data of
+ each element is returned as the seq element. Otherwise just the data
+ is returned as the seq element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_SEQ_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TO_SEQ_HPP */
diff --git a/boost/vmd/to_tuple.hpp b/boost/vmd/to_tuple.hpp
new file mode 100644
index 0000000000..a15858988c
--- /dev/null
+++ b/boost/vmd/to_tuple.hpp
@@ -0,0 +1,101 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TO_TUPLE_HPP)
+#define BOOST_VMD_TO_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/detail/sequence_to_tuple.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TO_TUPLE(...)
+
+ \brief Converts a sequence to a Boost PP tuple whose elements are the elements of the sequence.
+
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP tuple. If the sequence is empty the return is emptiness
+ since an empty tuple does not exist. If an optional return type other
+ than BOOST_VMD_RETURN_NO_TYPE is specified the type and the data of
+ each element is returned as the tuple element. Otherwise just the data
+ is returned as the tuple element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_TUPLE(...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE(__VA_ARGS__) \
+/**/
+
+/** \def BOOST_VMD_TO_TUPLE_D(d,...)
+
+ \brief Converts a sequence to a Boost PP tuple whose elements are the elements of the sequence. Re-entrant version.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ ... = Variadic parameters.
+
+ The first variadic parameter is required and is the sequence to convert.
+
+ Further optional variadic parameters can be return type parameters. Return type
+ parameters allow each element in the sequence to be converted to a two-element
+ tuple where the first tuple element is the type and the second tuple element
+ is the element data.
+
+ The BOOST_VMD_RETURN_NO_TYPE, the default, does not return the type as part of each
+ converted element but just the data. All of the rest return the type and data as the
+ two-element tuple. If BOOST_VMD_RETURN_TYPE is specified the specific type of the element
+ is returned in the tuple. If BOOST_VMD_RETURN_TYPE_ARRAY is specified an array type is
+ returned if the element is an array, else a tuple type is returned if the element is a tuple,
+ else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_LIST is specified
+ a list type is returned if the element is a list, else a tuple type is returned if the element
+ is a tuple, else the actual type is returned for non-tuple data. If BOOST_VMD_RETURN_TYPE_TUPLE
+ is specified a tuple type is returned for all tuple-like data, else the actual type is returned
+ for non-tuple data. If more than one return type optional parameter is specified the last one
+ specified determines the return type.
+
+ returns = A Boost PP tuple. If the sequence is empty the return is emptiness
+ since an empty tuple does not exist. If an optional return type other
+ than BOOST_VMD_RETURN_NO_TYPE is specified the type and the data of
+ each element is returned as the tuple element. Otherwise just the data
+ is returned as the tuple element, which is the default.
+
+*/
+
+#define BOOST_VMD_TO_TUPLE_D(d,...) \
+ BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_D(d,__VA_ARGS__) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TO_TUPLE_HPP */
diff --git a/boost/vmd/tuple.hpp b/boost/vmd/tuple.hpp
new file mode 100644
index 0000000000..0752ba7169
--- /dev/null
+++ b/boost/vmd/tuple.hpp
@@ -0,0 +1,26 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_HPP)
+#define BOOST_VMD_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/tuple/is_vmd_tuple.hpp>
+#include <boost/vmd/tuple/pop_back.hpp>
+#include <boost/vmd/tuple/pop_front.hpp>
+#include <boost/vmd/tuple/push_back.hpp>
+#include <boost/vmd/tuple/push_front.hpp>
+#include <boost/vmd/tuple/remove.hpp>
+#include <boost/vmd/tuple/size.hpp>
+#include <boost/vmd/tuple/to_array.hpp>
+#include <boost/vmd/tuple/to_list.hpp>
+#include <boost/vmd/tuple/to_seq.hpp>
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_HPP */
diff --git a/boost/vmd/tuple/is_vmd_tuple.hpp b/boost/vmd/tuple/is_vmd_tuple.hpp
new file mode 100644
index 0000000000..58595b601a
--- /dev/null
+++ b/boost/vmd/tuple/is_vmd_tuple.hpp
@@ -0,0 +1,56 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_IS_VMD_TUPLE_HPP)
+#define BOOST_VMD_IS_VMD_TUPLE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_tuple.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_IS_VMD_TUPLE(sequence)
+
+ \brief Determines if a sequence is a VMD tuple.
+
+ The macro checks that the sequence is a VMD tuple.
+ A VMD tuple, which may be a Boost PP tuple or emptiness, is a superset of a Boost PP tuple.
+ It returns 1 if it is a VMD tuple, else if returns 0.
+
+ sequence = a possible Boost PP tuple
+
+ returns = 1 if it a VMD tuple, else returns 0.
+
+*/
+
+#define BOOST_VMD_IS_VMD_TUPLE(sequence) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(sequence), \
+ BOOST_VMD_IDENTITY(1), \
+ BOOST_VMD_IS_TUPLE \
+ ) \
+ (sequence) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_IS_VMD_TUPLE_HPP */
diff --git a/boost/vmd/tuple/pop_back.hpp b/boost/vmd/tuple/pop_back.hpp
new file mode 100644
index 0000000000..e9a7558969
--- /dev/null
+++ b/boost/vmd/tuple/pop_back.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_POP_BACK_HPP)
+#define BOOST_VMD_TUPLE_POP_BACK_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/pop_back.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_POP_BACK(tuple)
+
+ \brief pops an element from the end of a tuple.
+
+ tuple = tuple to pop an element from.
+
+ If the tuple is an empty tuple the result is undefined.
+ If the tuple is a single element the result is an empty tuple.
+ Otherwise the result is a tuple after removing the last element.
+*/
+
+#define BOOST_VMD_TUPLE_POP_BACK(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_POP_BACK \
+ ) \
+ (tuple) \
+/**/
+
+/** \def BOOST_VMD_TUPLE_POP_BACK_Z(z,tuple)
+
+ \brief pops an element from the end of a tuple. It reenters BOOST_PP_REPEAT with maximum efficiency.
+
+ z = the next available BOOST_PP_REPEAT dimension.
+ tuple = tuple to pop an element from.
+
+ If the tuple is an empty tuple the result is undefined.
+ If the tuple is a single element the result is an empty tuple.
+ Otherwise the result is a tuple after removing the last element.
+*/
+
+#define BOOST_VMD_TUPLE_POP_BACK_Z(z,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_POP_BACK_Z \
+ ) \
+ (z,tuple) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_POP_BACK_HPP */
diff --git a/boost/vmd/tuple/pop_front.hpp b/boost/vmd/tuple/pop_front.hpp
new file mode 100644
index 0000000000..fc84492184
--- /dev/null
+++ b/boost/vmd/tuple/pop_front.hpp
@@ -0,0 +1,73 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_POP_FRONT_HPP)
+#define BOOST_VMD_TUPLE_POP_FRONT_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/pop_front.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_POP_FRONT(tuple)
+
+ \brief pops an element from the front of a tuple.
+
+ tuple = tuple to pop an element from.
+
+ If the tuple is an empty tuple the result is undefined.
+ If the tuple is a single element the result is an empty tuple.
+ Otherwise the result is a tuple after removing the first element.
+*/
+
+#define BOOST_VMD_TUPLE_POP_FRONT(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_POP_FRONT \
+ ) \
+ (tuple) \
+/**/
+
+/** \def BOOST_VMD_TUPLE_POP_FRONT_Z(z,tuple)
+
+ \brief pops an element from the front of a tuple. It reenters BOOST_PP_REPEAT with maximum efficiency.
+
+ z = the next available BOOST_PP_REPEAT dimension.
+ tuple = tuple to pop an element from.
+
+ If the tuple is an empty tuple the result is undefined.
+ If the tuple is a single element the result is an empty tuple.
+ Otherwise the result is a tuple after removing the first element.
+*/
+
+#define BOOST_VMD_TUPLE_POP_FRONT_Z(z,tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_POP_FRONT_Z \
+ ) \
+ (z,tuple) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_POP_FRONT_HPP */
diff --git a/boost/vmd/tuple/push_back.hpp b/boost/vmd/tuple/push_back.hpp
new file mode 100644
index 0000000000..778e257c88
--- /dev/null
+++ b/boost/vmd/tuple/push_back.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_PUSH_BACK_HPP)
+#define BOOST_VMD_TUPLE_PUSH_BACK_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/push_back.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_PUSH_BACK(tuple,elem)
+
+ \brief appends an element to the end of a tuple.
+
+ tuple = tuple to to append an element to.
+ elem = element to append.
+
+ If the tuple is an empty tuple the result is a tuple with the single element.
+ Otherwise the result is a tuple after adding the element to the end.
+*/
+
+#define BOOST_VMD_TUPLE_PUSH_BACK(tuple,elem) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_IDENTITY((elem)), \
+ BOOST_PP_TUPLE_PUSH_BACK \
+ ) \
+ (tuple,elem) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_PUSH_BACK_HPP */
diff --git a/boost/vmd/tuple/push_front.hpp b/boost/vmd/tuple/push_front.hpp
new file mode 100644
index 0000000000..4ec57ad698
--- /dev/null
+++ b/boost/vmd/tuple/push_front.hpp
@@ -0,0 +1,53 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_PUSH_FRONT_HPP)
+#define BOOST_VMD_TUPLE_PUSH_FRONT_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/push_front.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_PUSH_FRONT(tuple,elem)
+
+ \brief inserts an element at the beginning of a tuple.
+
+ tuple = tuple to insert an element at.
+ elem = element to insert.
+
+ If the tuple is an empty tuple the result is a tuple with the single element.
+ Otherwise the result is a tuple after inserting the element at the beginning.
+*/
+
+#define BOOST_VMD_TUPLE_PUSH_FRONT(tuple,elem) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_IDENTITY((elem)), \
+ BOOST_PP_TUPLE_PUSH_FRONT \
+ ) \
+ (tuple,elem) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_PUSH_FRONT_HPP */
diff --git a/boost/vmd/tuple/remove.hpp b/boost/vmd/tuple/remove.hpp
new file mode 100644
index 0000000000..7f1324798d
--- /dev/null
+++ b/boost/vmd/tuple/remove.hpp
@@ -0,0 +1,84 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_REMOVE_HPP)
+#define BOOST_VMD_TUPLE_REMOVE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/tuple/remove.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_REMOVE(tuple,index)
+
+ \brief removes an element from a tuple.
+
+ tuple = tuple from which an element is to be removed.
+ index = The zero-based position in tuple of the element to be removed.
+
+ If index is greater or equal to the tuple size the result is undefined.
+ If the tuple is a single element and the index is 0 the result is an empty tuple.
+ Otherwise the result is a tuple after removing the index element.
+*/
+
+#define BOOST_VMD_TUPLE_REMOVE(tuple,index) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_EQUAL(index,0), \
+ BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1) \
+ ), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_REMOVE \
+ ) \
+ (tuple,index) \
+/**/
+
+/** \def BOOST_VMD_TUPLE_REMOVE_D(d,tuple,index)
+
+ \brief removes an element from a tuple. It reenters BOOST_PP_WHILE with maximum efficiency.
+
+ d = The next available BOOST_PP_WHILE iteration.
+ tuple = tuple from which an element is to be removed.
+ index = The zero-based position in tuple of the element to be removed.
+
+ If index is greater or equal to the tuple size the result is undefined.
+ If the tuple is a single element and the index is 0 the result is an empty tuple.
+ Otherwise the result is a tuple after removing the index element.
+*/
+
+#define BOOST_VMD_TUPLE_REMOVE_D(d,tuple,index) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_BITAND \
+ ( \
+ BOOST_PP_EQUAL_D(d,index,0), \
+ BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1) \
+ ), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_REMOVE_D \
+ ) \
+ (d,tuple,index) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_REMOVE_HPP */
diff --git a/boost/vmd/tuple/size.hpp b/boost/vmd/tuple/size.hpp
new file mode 100644
index 0000000000..1e8d27169f
--- /dev/null
+++ b/boost/vmd/tuple/size.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_SIZE_HPP)
+#define BOOST_VMD_TUPLE_SIZE_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/size.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_SIZE(tuple)
+
+ \brief expands to the size of the tuple passed to it.
+
+ tuple = tuple whose size is to be extracted.
+
+ If the tuple is an empty tuple its size is 0.
+ Otherwise the result is the number of elements in the tuple.
+*/
+
+#define BOOST_VMD_TUPLE_SIZE(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_IDENTITY(0), \
+ BOOST_PP_TUPLE_SIZE \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_SIZE_HPP */
diff --git a/boost/vmd/tuple/to_array.hpp b/boost/vmd/tuple/to_array.hpp
new file mode 100644
index 0000000000..4e9c8a2945
--- /dev/null
+++ b/boost/vmd/tuple/to_array.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_TO_ARRAY_HPP)
+#define BOOST_VMD_TUPLE_TO_ARRAY_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/to_array.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_TO_ARRAY(tuple)
+
+ \brief converts a tuple to an array.
+
+ tuple = tuple to be converted.
+
+ If the tuple is an empty tuple it is converted to an array with 0 elements.
+ Otherwise the tuple is converted to an array with the same number of elements as the tuple.
+*/
+
+#define BOOST_VMD_TUPLE_TO_ARRAY(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_IDENTITY((0,())), \
+ BOOST_PP_TUPLE_TO_ARRAY \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_TO_ARRAY_HPP */
diff --git a/boost/vmd/tuple/to_list.hpp b/boost/vmd/tuple/to_list.hpp
new file mode 100644
index 0000000000..a66f26055b
--- /dev/null
+++ b/boost/vmd/tuple/to_list.hpp
@@ -0,0 +1,52 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_TO_LIST_HPP)
+#define BOOST_VMD_TUPLE_TO_LIST_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/to_list.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_TO_LIST(tuple)
+
+ \brief converts a tuple to a list.
+
+ tuple = tuple to be converted.
+
+ If the tuple is an empty tuple it is converted to an empty list (BOOST_PP_NIL).
+ Otherwise the tuple is converted to a list with the same number of elements as the tuple.
+*/
+
+#define BOOST_VMD_TUPLE_TO_LIST(tuple) \
+ BOOST_VMD_IDENTITY_RESULT \
+ ( \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_IDENTITY(BOOST_PP_NIL), \
+ BOOST_PP_TUPLE_TO_LIST \
+ ) \
+ (tuple) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_TO_LIST_HPP */
diff --git a/boost/vmd/tuple/to_seq.hpp b/boost/vmd/tuple/to_seq.hpp
new file mode 100644
index 0000000000..de4a3d42e4
--- /dev/null
+++ b/boost/vmd/tuple/to_seq.hpp
@@ -0,0 +1,49 @@
+
+// (C) Copyright Edward Diener 2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VMD_TUPLE_TO_SEQ_HPP)
+#define BOOST_VMD_TUPLE_TO_SEQ_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/to_seq.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/is_empty.hpp>
+
+/*
+
+ The succeeding comments in this file are in doxygen format.
+
+*/
+
+/** \file
+*/
+
+/** \def BOOST_VMD_TUPLE_TO_SEQ(tuple)
+
+ \brief converts a tuple to a seq.
+
+ tuple = tuple to be converted.
+
+ If the tuple is an empty tuple it is converted to an empty seq.
+ Otherwise the tuple is converted to a seq with the same number of elements as the tuple.
+*/
+
+#define BOOST_VMD_TUPLE_TO_SEQ(tuple) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_VMD_IS_EMPTY(tuple), \
+ BOOST_VMD_EMPTY, \
+ BOOST_PP_TUPLE_TO_SEQ \
+ ) \
+ (tuple) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VMD_TUPLE_TO_SEQ_HPP */
diff --git a/boost/vmd/vmd.hpp b/boost/vmd/vmd.hpp
new file mode 100644
index 0000000000..1ef18c6df0
--- /dev/null
+++ b/boost/vmd/vmd.hpp
@@ -0,0 +1,54 @@
+
+// (C) Copyright Edward Diener 2011-2015
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !defined(BOOST_VARIADIC_MACRO_DATA_HPP)
+#define BOOST_VARIADIC_MACRO_DATA_HPP
+
+#include <boost/vmd/detail/setup.hpp>
+
+#if BOOST_PP_VARIADICS
+
+#include <boost/vmd/array.hpp>
+#include <boost/vmd/assert.hpp>
+#include <boost/vmd/assert_is_array.hpp>
+#include <boost/vmd/assert_is_empty.hpp>
+#include <boost/vmd/assert_is_identifier.hpp>
+#include <boost/vmd/assert_is_list.hpp>
+#include <boost/vmd/assert_is_number.hpp>
+#include <boost/vmd/assert_is_seq.hpp>
+#include <boost/vmd/assert_is_tuple.hpp>
+#include <boost/vmd/assert_is_type.hpp>
+#include <boost/vmd/elem.hpp>
+#include <boost/vmd/empty.hpp>
+#include <boost/vmd/enum.hpp>
+#include <boost/vmd/equal.hpp>
+#include <boost/vmd/get_type.hpp>
+#include <boost/vmd/identity.hpp>
+#include <boost/vmd/is_array.hpp>
+#include <boost/vmd/is_empty.hpp>
+#include <boost/vmd/is_empty_array.hpp>
+#include <boost/vmd/is_empty_list.hpp>
+#include <boost/vmd/is_identifier.hpp>
+#include <boost/vmd/is_list.hpp>
+#include <boost/vmd/is_multi.hpp>
+#include <boost/vmd/is_number.hpp>
+#include <boost/vmd/is_parens_empty.hpp>
+#include <boost/vmd/is_seq.hpp>
+#include <boost/vmd/is_tuple.hpp>
+#include <boost/vmd/is_type.hpp>
+#include <boost/vmd/is_unary.hpp>
+#include <boost/vmd/list.hpp>
+#include <boost/vmd/not_equal.hpp>
+#include <boost/vmd/seq.hpp>
+#include <boost/vmd/size.hpp>
+#include <boost/vmd/to_array.hpp>
+#include <boost/vmd/to_list.hpp>
+#include <boost/vmd/to_seq.hpp>
+#include <boost/vmd/to_tuple.hpp>
+#include <boost/vmd/tuple.hpp>
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_VARIADIC_MACRO_DATA_HPP */